一个KMD都需要创建设备和符号链接,它们分别为kernel和win32提供了名字,这样kernel和win32就可以正确地使用KMD
相关例程 IoCreateDevice IoDeleteDevice IoCreateSymbolicLink IoDeleteSymbolicLink 查阅DDK文档
/* driver.c */ #include <ntddk.h> #define FILE_DEVICE_HELLO 0x00008010 /*函数声明*/ VOID DriverUnload(PDRIVER_OBJECT DriverObject); /*DriverEntry例程*/ NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { UNICODE_STRING DeviceNameUnicodeString; UNICODE_STRING DeviceLinkUnicodeString; NTSTATUS ntStatus; PDEVICE_OBJECT DeviceObject = NULL; RtlInitUnicodeString (&DeviceNameUnicodeString, L"\\Device\\dload"); /*创建设备*/ ntStatus = IoCreateDevice (DriverObject, 0, &DeviceNameUnicodeString, FILE_DEVICE_HELLO, 0, TRUE, &DeviceObject); if (NT_SUCCESS(ntStatus)) { /*卸载例程*/ DriverObject->DriverUnload = DriverUnload; /*创建符号链接*/ RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\dload"); ntStatus = IoCreateSymbolicLink (&DeviceLinkUnicodeString,&DeviceNameUnicodeString); if (!NT_SUCCESS(ntStatus)) { DbgPrint ("ERROR: IoCreateSymbolicLink failed"); IoDeleteDevice (DeviceObject); } } else { DbgPrint ("ERROR: IoCreateDevice failed"); } DbgPrint("dload"); return ntStatus; } /*DriverUnload*/ VOID DriverUnload(PDRIVER_OBJECT DriverObject) { UNICODE_STRING DeviceLinkUnicodeString; NTSTATUS ntStatus; RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\dload"); ntStatus = IoDeleteSymbolicLink (&DeviceLinkUnicodeString); if (NT_SUCCESS(ntStatus)) { IoDeleteDevice (DriverObject->DeviceObject); } else { DbgPrint ("ERROR: IoDeleteSymbolicLink"); } } #include <windows.h> #include <Winsvc.h> #include <stdio.h> int main() { SC_HANDLE hSrvMgr; /*服务管理器句柄*/ SC_HANDLE hSrvDrv;/*KMD服务名柄*/ SERVICE_STATUS SvrSta; char szDir[256]; DWORD dwSize; GetCurrentDirectory( dwSize, szDir );/*取当前目录 */ strcat(szDir,"\\dload.sys"); LPCTSTR lpszBinaryPathName=TEXT(szDir); puts("任意键开始"); getchar(); hSrvMgr=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); //打开服务控制管理器 if(hSrvMgr) { puts("打开服务管理器:成功!"); } else { puts("打开服务管理器:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); hSrvDrv= CreateService( hSrvMgr, TEXT("dload"), //SYSTEM\CurrentControlSet\Services 驱动程序的在注册表中的名字 TEXT("dload"), // 注册表驱动程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值 lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值 NULL, NULL, NULL, NULL, NULL); if(hSrvDrv) { puts("服务创建:成功!"); } else { puts("服务创建:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if(StartService( hSrvDrv, NULL, NULL )) { puts("服务启动:成功,KMD加载成功"); } else { puts("服务启动:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if( ControlService(hSrvDrv, SERVICE_CONTROL_STOP , &SvrSta ) ) { puts("服务停止:成功,KMD不工作"); } else { puts("服务停止:失败,需要重启再次加载,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if( DeleteService( hSrvDrv ) ) { puts("服务卸载:成功"); } else { puts("服务卸载:失败,任意键退出"); getchar(); exit(1); } CloseServiceHandle( hSrvDrv ); CloseServiceHandle( hSrvMgr ); puts("任意键退出"); getchar(); return 0; }