阅读:1240回复:2
俺也写点入门的东东。(主要是代码了)
以下是某位大大的代码,我只是转一下了。
算是最简单的WDM驱动吧! 当然是啥都没干。而且应用程序的接口暂时也用符号名连接了。 如何运行?大家查一下动态装载驱动程序就可以看到应用程序的代码了。不用安装,直接运行那个应用程序就OK了。 build一下可以生成SYS了。 俺只是给程序加了点注释。 #include <ntddk.h> #define NT_DEVICE_NAME L\"\\Device\\Twdm1\" #define DOS_DEVICE_NAME L\"\\DosDevices\\Twdm1\" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp); NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp); VOID GpdUnload(PDRIVER_OBJECT DriverObject); ////////////////////// PDEVICE_OBJECT fdo; BOOLEAN fSymbolicLink; //把这个函数看成main就行了 NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { //UNREFERENCED_PARAMETER (RegistryPath); NTSTATUS status; UNICODE_STRING ntDeviceName; UNICODE_STRING win32DeviceName; //这个东东可以用driver moniter看了。 DbgPrint( \"TWDM: DriverEntry for Twdm.sys ...... n\" ); fSymbolicLink = FALSE; // // Create dispatch points for the IRPs. // //支持PnP的任何驱动程序必须拥有AddDevice例程。俺这是意思,就 //先不支持了。 //驱动程序能定义若干Dispatch入口点,但是它只能在其驱动程序对 //象中定义一个StartIo入口点、一个AddDevice入口点,和一个 //Unload入口点。 DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose; //如果驱动程序能动态地被装载和/或者替换,还需要一个Unload入 //口点,从而可以释放任何系统资源,诸如驱动程序已分配的系统对 //象或者内存当系统运行时不能被替换的驱动程序,诸如键盘驱动程 //序,不必提供Unload例程 DriverObject->DriverUnload = GpdUnload; //初始化设备名了,我觉的把他理解成strcpy就可以了。当然。 //这儿得考虑全球统一编码啥的。俺也晕的。 RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME); //创建设备 //如果最低层驱动程序被设计成创建并且管理它自己的IRP队列,它 //不必定义StartIo入口点。然而,大多数这样驱动程序在它们的驱 //动程序对象中定义StartIo入口点,并且依靠I/O管理器为发往它们 //的StartIo例程的IRP排队,现在的做法就叫做大多数。 status = IoCreateDevice(DriverObject, 0, &ntDeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo); if (!NT_SUCCESS (status)) { DbgPrint( \"TWDM: IoCreateDevice() faild ! n\" ); } else { DbgPrint( \"TWDM: IoCreateDevice() ok ! n\" ); //又搞了个win32设备名,也就是为了下面这个函数要用了) RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME); //创建符号连接 status = IoCreateSymbolicLink( &win32DeviceName, &ntDeviceName ); if (!NT_SUCCESS(status)) { DbgPrint( \"TWDM: IoCreateSymbolicLink() faild ! n\" ); } else { DbgPrint( \"TWDM: IoCreateSymbolicLink() ok ! n\" ); fSymbolicLink = TRUE; } fdo->Flags &= ~DO_DEVICE_INITIALIZING; } if (!NT_SUCCESS(status)) { if(fdo) { IoDeleteDevice(fdo); } if(fSymbolicLink) { IoDeleteSymbolicLink(&win32DeviceName); } } return status; } //这个就是驱动打开的时候运行了,可以认为CreateFile的时候调用 NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp) { NTSTATUS status; DbgPrint( \"TWDM: IRP_MJ_CREATE for Twdm.sys ...... n\" ); status = STATUS_SUCCESS; return status; } // DispatchCreate //驱动关闭的时候运行了。可以认为CloseHandle时候调用 NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp) { // DispatchClose NTSTATUS status; DbgPrint( \"TWDM: IRP_MJ_CLOSE for Twdm.sys ...... n\" ); status = STATUS_SUCCESS; return status; } // DispatchClose //这个前面都说了,卸载驱动的时候才调用了。 VOID GpdUnload(PDRIVER_OBJECT DriverObject) { UNICODE_STRING win32DeviceName; DbgPrint( \"TWDM: GpdUnload() for Twdm.sys ...... n\" ); //搞这个拷贝也是后面的函数要用了。 RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME); if(fdo) { IoDeleteDevice(fdo); } if(fSymbolicLink) { IoDeleteSymbolicLink(&win32DeviceName); } } |
|
沙发#
发布于:2005-03-13 10:42
可执行程序还是贴一下吧!,俺觉的奇怪,
为什么,C程序build没问题,C++程序build 就一堆问题呢? 驱动程序不允许用类???没办法啊! 差点忘了。得贴一下sources,,呵呵,虽然没啥内容 TARGETNAME=Twdm TARGETPATH=Debug TARGETTYPE=DRIVER C_DEFINES=$(C_DEFINES) INCLUDES= SOURCES= T.c 接着得改进改进这个简单的驱动了。 |
|
|
板凳#
发布于:2005-03-13 11:07
现在完整一点。差点忘了。。一开始贴的是别人的。好象有点问题的
#define NT_DEVICE_NAME L\"\\\\Device\\\\Twdm1\" #define DOS_DEVICE_NAME L\"\\\\DosDevices\\\\Twdm1\" 这样就OK了。 昏,,好象有些地方写错了。。 昏。。成废贴了。 等会在发了。。我先看下文档 |
|