Получить путь к файлу из NT / Имя устройства - PullRequest
1 голос
/ 03 сентября 2010

Я хочу преобразовать путь устройства в путь к файлу.

Я хочу получить имя процесса по идентификатору процесса, поэтому я использую этот код

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

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

Но он дает путь\Device\hardDiskVolume1\windows\system32\taskmgr.exe

Но я хочу это как простое имя файла C:\windows\system32\taskmgr.exe

Ответы [ 2 ]

1 голос
/ 08 сентября 2013
// 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;
}
1 голос
/ 21 июня 2011

В статье Доктора Добба ( NT, Обработка пути к пути Джимом Конингхэмом) есть статья, описывающая способ перехода от дескриптора к имени пути DOS:* из GetFileNameFromHandleNT().

В вашем случае, так как у вас уже есть путь к устройству, вам не нужны начальные части этого кода, который обрабатывает карту памяти в карту памяти.работа с трактом устройства.

...