NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject, // 系統創建的驅動對象
IN PUNICODE_STRING RegistryPath // 服務鍵路徑
);
職責:初始化驅動對象、創建設備對象、註冊分發函數、創建符號鏈接。
NTSTATUS IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize, // 設備擴展區大小
IN PUNICODE_STRING DeviceName, // 可選,NULL 表無名設備
IN DEVICE_TYPE DeviceType, // FILE_DEVICE_XXX
IN ULONG DeviceCharacteristics, // FILE_XXX 特性標誌
IN BOOLEAN Exclusive, // TRUE 通常
OUT PDEVICE_OBJECT *DeviceObject // 輸出創建的設備對象
);
NTSTATUS IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName, // "\??\MyDevice" (內核)
IN PUNICODE_STRING DeviceName // "\Device\MyDevice"
);
命名空間差異:
\??\ 前綴 (如 \??\C:)\\.\ 前綴 (如 \\.\C:)| 操作 | API | 參數 |
|---|---|---|
| 刪除符號鏈接 | IoDeleteSymbolicLink | IN PUNICODE_STRING SymbolicLinkName |
| 刪除設備對象 | IoDeleteDevice | IN PDEVICE_OBJECT DeviceObject |
NTSTATUS DriverEntry(PDRIVER_OBJECT drv, PUNICODE_STRING reg) {
NTSTATUS status;
PDEVICE_OBJECT devObj = NULL;
UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\MyDrv");
UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\MyDrv");
// 1. 創建設備
status = IoCreateDevice(drv, 0, &devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &devObj);
if (!NT_SUCCESS(status)) return status;
// 2. 設置分發函數
for (int i=0; i<=IRP_MJ_MAXIMUM_FUNCTION; i++)
drv->MajorFunction[i] = DispatchPassThrough;
drv->DriverUnload = Unload;
// 3. 創建符號鏈接
status = IoCreateSymbolicLink(&symLink, &devName);
if (!NT_SUCCESS(status)) {
IoDeleteDevice(devObj);
return status;
}
return STATUS_SUCCESS;
}
VOID Unload(PDRIVER_OBJECT drv) {
UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\MyDrv");
IoDeleteSymbolicLink(&symLink);
IoDeleteDevice(drv->DeviceObject);
}
DeviceExtension 用於存儲設備上下文 (隊列、鎖、狀態等)Exclusive=TRUE 防止用戶模式並發打開導致同步問題Windbg 調試與匯編分析必不可少