张栗炜虚拟键盘设备驱动

源码:张栗炜虚拟键盘设备驱动

下载地址:http://www.pudn.com/downloads229/sourcecode/windows/vxd/detail1077750.html (yyxhhx 2014年提供)

今天调试了虚拟键盘的源码,发现几个问题。在这里不贴全部代码了,有兴趣的可以去下载,

编译环境是VC6.0,DDK版本是NTDDK,

通讯方式是:DeviceControl的缓冲区

直接上源码:

#include "VKeyFdo.h"
#include "..\inc\vkIoctl.h"

extern "C"
{
	#include "hidport.h"
}

/
#pragma code_seg("INIT") // start INIT section
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
	// Export other driver entry points...
	DriverObject->DriverExtension->AddDevice = AddDevice;
	
	DriverObject->MajorFunction[IRP_MJ_CREATE                 ] = Create;
	DriverObject->MajorFunction[IRP_MJ_CLOSE                  ] = Close;
	DriverObject->MajorFunction[IRP_MJ_PNP                    ] = Pnp;
	DriverObject->MajorFunction[IRP_MJ_POWER                  ] = Power;
	DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL         ] = DeviceControl;
	DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = InternalControl;
	DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL         ] = SystemControl;

	extern PDEVICE_OBJECT  FunctionDevice;
	NTSTATUS status = STATUS_SUCCESS;

	UNICODE_STRING         deviceNameUnicodeString;
	RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
	status = IoCreateDevice(DriverObject, 
							0,
							&deviceNameUnicodeString,
							FILE_DEVICE_UNKNOWN,
							0, 
							false, 
							&FunctionDevice);

	if (!NT_SUCCESS(status))
	{
		return status;
	}

	UNICODE_STRING deviceLinkUnicodeString;
	RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
	status = IoCreateSymbolicLink(&deviceLinkUnicodeString, 
									&deviceNameUnicodeString);
	if (!NT_SUCCESS(status))
	{
		if (FunctionDevice)
		{
			IoDeleteDevice(FunctionDevice);
			return status;
		}
	}

	// Set fdo flags appropriately
	FunctionDevice->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
	FunctionDevice->Flags &= ~DO_DEVICE_INITIALIZING;

	return STATUS_SUCCESS;
}
#pragma code_seg() // end INIT section
/

/
#pragma code_seg("PAGE") // start PAGE section
VOID Unload(IN PDRIVER_OBJECT DriverObject)
{

}
//
#pragma code_seg() // end PAGE section

不足之处:

 1、wdm的设备连接符创建不在DrvierEntry

 2、参数传递应该放在扩展设备处,过多的全局变量导致了多余的异常处理


                
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值