• #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 = cr&#101;ateFile("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("cr&#101;ateFile Failed: %d\n", GetLastError());
  •     }
  • }
  • 相关文章: