初學驅動開發-windows驅動-helloWorld
阿新 • • 發佈:2019-01-02
#ifdef __cplusplus extern "C" { #endif #include #ifdef __cplusplus } #endif #define PAGEDCODE code_seg("PAGE") #define LOCKEDCODE code_seg() #define INITCODE code_seg("INIT") #define PAGEDDATA data_seg("PAGE") #define LOCKEDDATA data_seg() #define INITDATA data_seg("INIT") #define arraysize(p) (sizeof(p)/sizeof((p)[0])) typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT pDevice; UNICODE_STRING ustrDeviceName; //裝置名稱 UNICODE_STRING ustrSymLinkName; //符號連結名 } DEVICE_EXTENSION, *PDEVICE_EXTENSION; /************************************************************************ * 函式名稱:LoadDevice * 功能描述:載入裝置物件,如果存在則使用現有裝置物件,如果不存在則建立新的裝置物件 *************************************************************************/ #pragma INITCODE NTSTATUS LoadDevice ( IN PDRIVER_OBJECT pDriverObject, IN PCWSTR SourceString) { NTSTATUS status; PDEVICE_OBJECT pDevObj; PDEVICE_EXTENSION pDevExt; UNICODE_STRING devName; //裝置名稱 RtlInitUnicodeString(&devName,SourceString); //建立裝置 status = IoCreateDevice( pDriverObject, sizeof(DEVICE_EXTENSION), &(UNICODE_STRING)devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pDevObj ); if (!NT_SUCCESS(status)) { RtlFreeUnicodeString( &devName ); return status; } RtlZeroMemory(pDevObj->DeviceExtension, sizeof(DEVICE_EXTENSION)); pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; pDevObj->Flags |= DO_BUFFERED_IO; pDevExt->pDevice = pDevObj; pDevExt->ustrDeviceName = devName; //建立符號連結 UNICODE_STRING symLinkName; RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK"); pDevExt->ustrSymLinkName = symLinkName; status = IoCreateSymbolicLink( &symLinkName,&devName ); if (!NT_SUCCESS(status)) { IoDeleteDevice( pDevObj ); RtlFreeUnicodeString( &devName ); RtlFreeUnicodeString( &symLinkName ); return status; } return STATUS_SUCCESS; } /************************************************************************ * 函式名稱:UnloadDevice * 功能描述:解除安裝驅動裝置 *************************************************************************/ #pragma PAGEDCODE VOID UnloadDevice (IN PDRIVER_OBJECT pDriverObject) { PDEVICE_OBJECT pNextObj; KdPrint(("Enter DriverUnload\n")); pNextObj = pDriverObject->DeviceObject; while (pNextObj != NULL) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pNextObj->DeviceExtension; //刪除符號連結 UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName; IoDeleteSymbolicLink(&pLinkName); pNextObj = pNextObj->NextDevice; IoDeleteDevice( pDevExt->pDevice ); } } /************************************************************************ * 函式名稱:DriverEntry * 功能描述:驅動程式入口函式 *************************************************************************/ #pragma INITCODE extern "C" NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { NTSTATUS status; KdPrint(("Enter DriverEntry\n")); KdPrint(("Hello World Driver\n")); KdPrint(("pRegistryPath:%ws\n", pRegistryPath->Buffer)); //資訊 //建立驅動裝置物件 status = LoadDevice(pDriverObject, L"\\Device\\HelloWordDDKDevice"); //解除安裝驅動裝置物件 pDriverObject->DriverUnload = UnloadDevice; KdPrint(("DriverEntry end\n")); return status; }