MCPcopy Create free account
hub / github.com/BeneficialCode/WinArk / ConvertDosNameToNtName

Method ConvertDosNameToNtName

KernelLibrary/FileManager.cpp:94–152  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

92}
93
94NTSTATUS FileManager::ConvertDosNameToNtName(_In_ PCWSTR dosName, _Out_ PUNICODE_STRING ntName) {
95 ntName->Buffer = nullptr; // in case of failure
96 auto dosNameLen = ::wcslen(dosName);
97
98 if (dosNameLen < 3)
99 return STATUS_BUFFER_TOO_SMALL;
100
101 // make sure we have a driver letter
102 if (dosName[2] != L'\\' || dosName[1] != L':')
103 return STATUS_INVALID_PARAMETER;
104
105 kstring<'rgmf'> symLink(L"\\??\\");
106 symLink.Append(dosName, 2); // driver letter and colon
107
108 UNICODE_STRING symLinkFull;
109 symLink.GetUnicodeString(&symLinkFull);
110
111 OBJECT_ATTRIBUTES symLinkAttr;
112 InitializeObjectAttributes(&symLinkAttr, &symLinkFull,
113 OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, nullptr, nullptr);
114
115 HANDLE hSymLink = nullptr;
116 auto status = STATUS_SUCCESS;
117
118 do
119 {
120 // open symbolic link
121 status = ZwOpenSymbolicLinkObject(&hSymLink, GENERIC_READ, &symLinkAttr);
122 if (!NT_SUCCESS(status))
123 break;
124 USHORT maxLen = 1024; // arbitray
125 ntName->Buffer = (WCHAR*)ExAllocatePool(PagedPool, maxLen);
126 if (!ntName->Buffer) {
127 status = STATUS_INSUFFICIENT_RESOURCES;
128 break;
129 }
130 ntName->MaximumLength = maxLen;
131
132 // read target of symbolic link
133 status = ZwQuerySymbolicLinkObject(hSymLink, ntName, nullptr);
134 if (!NT_SUCCESS(status))
135 break;
136 } while (false);
137
138 if (!NT_SUCCESS(status)) {
139 if (ntName->Buffer) {
140 ExFreePool(ntName->Buffer);
141 ntName->Buffer = nullptr;
142 }
143 }
144 else {
145 RtlAppendUnicodeToString(ntName, dosName + 2); // directory part
146 }
147
148 if (hSymLink)
149 ZwClose(hSymLink);
150
151 return status;

Callers

nothing calls this directly

Calls 1

GetUnicodeStringMethod · 0.45

Tested by

no test coverage detected