2010-09-03 6 views
1

Je souhaite convertir le chemin du périphérique en chemin de fichier.Récupère le chemin du fichier à partir du nom NT/Device

Je veux obtenir le nom de processus par ID de processus, donc je me sers de ce code

PsLookupProcessByProcessId(processId,&pEProcess); 
ObOpenObjectByPointer(pEProcess, 
         OBJ_KERNEL_HANDLE, 
         NULL, 
         0, 
         NULL, 
         KernelMode, 
         &hProcess); 
ObDereferenceObject (pEProcess); 

nts = ZwQueryInformationProcess (hProcess,27,0,0,&ulSize); 

Mais il donne chemin que \Device\hardDiskVolume1\windows\system32\taskmgr.exe

Mais je veux cela comme un nom de fichier simple C:\windows\system32\taskmgr.exe

Répondre

1

Il y a un article dans Dr. Dobb's (NT Handle-to-Path Conversion par Jim Conyngham) qui décrit une manière d'obtenir d'un handle au nom de chemin DOS: Voir le listing de GetFileNameFromHandleNT(). Dans votre cas, puisque vous avez déjà le chemin de périphérique, vous n'avez pas besoin des parties initiales de ce code qui fonctionnent avec le chemin handle-to-memory-map-to-get-device-path.

1
// From device file name to DOS filename 
BOOL GetFsFileName(LPCTSTR lpDeviceFileName, CString& fsFileName) 
{ 
    BOOL rc = FALSE; 

    TCHAR lpDeviceName[0x1000]; 
    TCHAR lpDrive[3] = _T("A:"); 

    // Iterating through the drive letters 
    for (TCHAR actDrive = _T('A'); actDrive <= _T('Z'); actDrive++) 
    { 
     lpDrive[0] = actDrive; 

     // Query the device for the drive letter 
     if (QueryDosDevice(lpDrive, lpDeviceName, 0x1000) != 0) 
     { 
      // Network drive? 
      if (_tcsnicmp(_T("\\Device\\LanmanRedirector\\"), lpDeviceName, 25) == 0) 
      { 
       //Mapped network drive 

       char cDriveLetter; 
       DWORD dwParam; 

       TCHAR lpSharedName[0x1000]; 

       if (_stscanf( lpDeviceName, 
           _T("\\Device\\LanmanRedirector\\;%c:%d\\%s"), 
           &cDriveLetter, 
           &dwParam, 
           lpSharedName) != 3) 
         continue; 

       _tcscpy(lpDeviceName, _T("\\Device\\LanmanRedirector\\")); 
       _tcscat(lpDeviceName, lpSharedName); 
      } 

      // Is this the drive letter we are looking for? 
      if (_tcsnicmp(lpDeviceName, lpDeviceFileName, _tcslen(lpDeviceName)) == 0) 
      { 
       fsFileName = lpDrive; 
       fsFileName += (LPCTSTR)(lpDeviceFileName + _tcslen(lpDeviceName)); 

       rc = TRUE; 

       break; 
      } 
     } 
    } 

    return rc; 
} 
Questions connexes