驱动获取自身路径,在某些情况下需要用到。。。
NTSTATUS DriverEntry(
IN OUT PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
OBJECT_ATTRIBUTES objectAttributes;
UNICODE_STRING RegUnicodeKeyName;
HANDLE hRegister;
CHAR KeyFullInfo[MAX_PATH];
ULONG ulSize;
ANSI_STRING AnsiDriverPath;
UNICODE_STRING UniDriverPath;
PKEY_VALUE_FULL_INFORMATION pKeyFullInfo;
PCHAR pos;
PDEVICE_OBJECT pdoDeviceObj = 0;
NTSTATUS status = STATUS_UNSUCCESSFUL;
pdoGlobalDrvObj = DriverObject;
...
RtlInitUnicodeString( &RegUnicodeKeyName,L"ImagePath");
InitializeObjectAttributes(&objectAttributes,RegistryPath, OBJ_CASE_INSENSITIVE,NULL,NULL );
status = ZwOpenKey( &hRegister,GENERIC_READ,&objectAttributes);
if (NT_SUCCESS(status))
{
//KdPrint(("[RegTest] ZwOpenKey %wZ Success!", ustrRegString));
status = ZwQueryValueKey(hRegister, &RegUnicodeKeyName, KeyValueFullInformation, KeyFullInfo,MAX_PATH,&ulSize);
if (NT_SUCCESS(status))
{
KdPrint(("++++++++++ RegistryPath %ws\n", RegistryPath));
pKeyFullInfo = (PKEY_VALUE_FULL_INFORMATION)KeyFullInfo;
RtlInitUnicodeString(&UniDriverPath, (PCHAR)pKeyFullInfo+pKeyFullInfo->DataOffset);
status = RtlUnicodeStringToAnsiString(&AnsiDriverPath,&UniDriverPath,TRUE);
if ( NT_SUCCESS(status))
{
KdPrint(("++++++++++ Driver Path %s\n", AnsiDriverPath.Buffer));
RtlCopyMemory(G_Dllname, AnsiDriverPath.Buffer+4, AnsiDriverPath.Length);// \??\C:\testdriver\testdriver.sys
...
}
RtlFreeAnsiString(&AnsiDriverPath);
ZwClose(hRegister);
return STATUS_SUCCESS;
}
ZwClose(hRegister);
}
return STATUS_SUCCESS;
}