加载驱动程序
一個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; }
轉載于:https://www.cnblogs.com/iwasmu/archive/2009/05/29/1491796.html
總結
- 上一篇: shell调用函数并获取函数返回值
- 下一篇: python中不包不包括_Unittes