NTSTATUS GetSystemRootPath(PUNICODE_STRING pusSystemRoot)
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_OBJECT pFileObject = NULL;
POBJECT_NAME_INFORMATION pObjectNameInformation = NULL;
HANDLE hFile = NULL;
IO_STATUS_BLOCK ioStausBlock = { 0 };
OBJECT_ATTRIBUTES oa = { 0 };
UNICODE_STRING usFileName = { 0 };
do
{
if (!pusSystemRoot)
{
status = STATUS_INVALID_PARAMETER;
break;
}
// Get SystemRoot via ZwOpenFile
RtlInitUnicodeString(&usFileName, L"\\SystemRoot");
InitializeObjectAttributes(&oa, &usFileName, OBJ_KERNEL_HANDLE, NULL, NULL);
status = ZwOpenFile(&hFile, SYNCHRONIZE, &oa, &ioStausBlock, FILE_SHARE_READ, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(status))
{
KdPrint(("ZwOpenFile failed! status = 0x%X\n", status));
break;
}
status = ObReferenceObjectByHandle(hFile, FILE_ALL_ACCESS, *IoFileObjectType, KernelMode, &pFileObject, NULL);
if (!NT_SUCCESS(status))
{
KdPrint(("***(%s line: %d***)\n\t%s failed with code %#x\n\n", __FILE__, __LINE__, "ObReferenceObjectByHandle", status));
break;
}
status = IoQueryFileDosDeviceName(pFileObject, &pObjectNameInformation);
if (!NT_SUCCESS(status))
{
KdPrint(("***(%s line: %d***)\n\t%s failed with code %#x\n\n", __FILE__, __LINE__, "IoQueryFileDosDeviceName", status));
break;
}
if (pObjectNameInformation->Name.Length > pusSystemRoot->Length)
{
KdPrint(("***(%s line: %d***)\n\t%s failed with code %#x\n\n", __FILE__, __LINE__, "pwsSystemRoot Buffer is too small", status));
status = STATUS_BUFFER_TOO_SMALL;
break;
}
KdPrint(("SystemRoot Path: %wZ\n", &pObjectNameInformation->Name));
RtlCopyUnicodeString(pusSystemRoot, &pObjectNameInformation->Name);
} while (FALSE);
if (hFile)
{
ZwClose(hFile);
}
if (pFileObject)
{
ObDereferenceObject(pFileObject);
}
if (pObjectNameInformation)
{
ExFreePool(pObjectNameInformation);
}
return status;
}
内核中获取操作系统安装盘路径
最新推荐文章于 2021-08-29 17:11:36 发布