124{
125 struct
126 {
127 union
128 {
131 };
133 } NameInfoBuffer;
136 WCHAR VolumeBuffer[
sizeof(
"\\Device\\Volume{01234567-89ab-cdef-0123-456789abcdef}")];
145
146
148
149
150 if (VolumeType & (VolumeType- 1))
151 {
154 return 0;
155 }
156
157
158
161 &NameInfoBuffer,
162 sizeof(NameInfoBuffer),
165 {
168 return 0;
169 }
170
171
173 {
175 if (cchFilePath < FinalLength + 1)
176 {
178 return FinalLength + 1;
179 }
180
181
184
185
186 return FinalLength;
187 }
188
189
192 &NameInfoBuffer,
193 sizeof(NameInfoBuffer) -
sizeof(
WCHAR),
196 {
199 return 0;
200 }
201
202
204 {
205
207 if (cchFilePath < FinalLength + 1)
208 {
210 return FinalLength + 1;
211 }
212
213
216
217
218 return FinalLength;
219 }
220
221
223 if (PathSplit ==
NULL)
224 {
227 return 0;
228 }
229
233
234 RelativePath.
Buffer = PathSplit + 1;
237
238
239 RtlInitEmptyUnicodeString(&
VolumeName, VolumeBuffer,
sizeof(VolumeBuffer));
242 {
243 DPRINT1(
"QueryDosVolumeNameForNtDeviceName failed: %lx\n",
Status);
245 return 0;
246 }
247
249 {
250
252 if (cchFilePath < FinalLength + 1)
253 {
255 return FinalLength + 1;
256 }
257
258
264
265
266 return FinalLength;
267 }
269 {
270
272 VolumeBuffer,
275 {
278 return 0;
279 }
280
281
282 VolumeLength =
wcslen(VolumeBuffer);
283 FinalLength = VolumeLength + (RelativePath.
Length /
sizeof(
WCHAR));
284 if (cchFilePath < FinalLength + 1)
285 {
287 return FinalLength + 1;
288 }
289
290
296
297
299
300 return FinalLength;
301 }
302
305 return 0;
306}
NTSTATUS NtQueryObject(IN HANDLE Handle, IN OBJECT_INFO_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT PULONG ReturnLength)
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define ERROR_INVALID_HANDLE
static NTSTATUS QueryDosVolumeNameForNtDeviceName(_In_ PCUNICODE_STRING DeviceName, _Inout_ PUNICODE_STRING DosVolumeName)
_Must_inspect_result_ _Inout_opt_ PUNICODE_STRING VolumeName
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOL WINAPI GetVolumeNameForVolumeMountPointW(IN LPCWSTR VolumeMountPoint, OUT LPWSTR VolumeName, IN DWORD VolumeNameLength)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
static OUT PIO_STATUS_BLOCK IoStatusBlock
DWORD BaseSetLastNTError(IN NTSTATUS Status)
#define RtlCopyMemory(Destination, Source, Length)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
DWORD WINAPI GetLastError(void)
#define ERROR_PATH_NOT_FOUND
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName