1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| #include <windows.h>
#include <ntsecapi.h>
#pragma comment (lib,"ntdll.lib") // Copy From DDK
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryObject(
IN HANDLE ObjectHandle,
IN ULONG ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG ObjectInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
BOOL GetPathByHandle(HANDLE hFile, LPWSTR lpBuf, DWORD nBuf)
{
ULONG m, n;
WCHAR lpPath[MAX_PATH+4];
WCHAR lpDrive[MAX_PATH];
WCHAR lpDevName[MAX_PATH];
if (ZwQueryObject(hFile, 1, lpPath, MAX_PATH+4, &m) >= 0 &&
(m = GetLogicalDriveStringsW(MAX_PATH, lpDrive)) && m < MAX_PATH)
{
WCHAR *p = lpDrive;
while (m = wcslen(p))
{
p[m-1] = L'\0';
n = QueryDosDeviceW(p, lpDevName, MAX_PATH);
if (n && n < MAX_PATH)
{
n = wcslen(lpDevName);
if (!wcsnicmp(lpPath+4, lpDevName, n))
{
wcsncpy(lpBuf, p, nBuf);
if (nBuf > 2) wcsncpy(lpBuf+2, lpPath+4+n, nBuf-2);
return TRUE;
}
}
p += m + 1;
}
}
return FALSE;
}
void main()
{
WCHAR buf[MAX_PATH];
HANDLE hFile = createFile("C:\\boot.ini", 0, 0, 0, OPEN_EXISTING, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
GetPathByHandle(hFile, buf, MAX_PATH);
printf("%ws\n", buf);
CloseHandle(hFile);
}
else
{
printf("createFile Failed: %d\n", GetLastError());
}
}
|