#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <tchar.h>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
BOOL
DosPathToNtPath(
LPTSTR
pszDosPath,
LPTSTR
pszNtPath)
{
TCHAR
szDriveStr[500];
TCHAR
szDrive[3];
TCHAR
szDevName[100];
INT
cchDevName;
INT
i;
if
(!pszDosPath || !pszNtPath )
return
FALSE;
if
(GetLogicalDriveStrings(
sizeof
(szDriveStr), szDriveStr))
{
for
(i = 0; szDriveStr[i]; i += 4)
{
if
(!lstrcmpi(&(szDriveStr[i]), _T(
"A:\\"
)) || !lstrcmpi(&(szDriveStr[i]), _T(
"B:\\"
)))
continue
;
szDrive[0] = szDriveStr[i];
szDrive[1] = szDriveStr[i + 1];
szDrive[2] =
'\0'
;
if
(!QueryDosDevice(szDrive, szDevName, 100))
return
FALSE;
cchDevName = lstrlen(szDevName);
if
(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)
{
lstrcpy(pszNtPath, szDrive);
lstrcat(pszNtPath, pszDosPath + cchDevName);
return
TRUE;
}
}
}
lstrcpy(pszNtPath, pszDosPath);
return
FALSE;
}
BOOL
GetProcessFullPath(
DWORD
dwPID,
TCHAR
pszFullPath[MAX_PATH])
{
TCHAR
szImagePath[MAX_PATH];
HANDLE
hProcess;
if
(!pszFullPath)
return
FALSE;
pszFullPath[0] =
'\0'
;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
if
(!hProcess)
return
FALSE;
if
(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))
{
CloseHandle(hProcess);
return
FALSE;
}
if
(!DosPathToNtPath(szImagePath, pszFullPath))
{
CloseHandle(hProcess);
return
FALSE;
}
CloseHandle(hProcess);
_tprintf(_T(
"%d,%s \r\n"
),dwPID,pszFullPath);
return
TRUE;
}
int
main(
int
argc,
char
* argv[])
{
HANDLE
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if
(INVALID_HANDLE_VALUE == hSnapshot)
{
return
NULL;
}
PROCESSENTRY32 pe ={0};
pe.dwSize =
sizeof
(PROCESSENTRY32);
BOOL
fOk;
for
(fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
TCHAR
szProcessName[MAX_PATH] = {0};
GetProcessFullPath(pe.th32ProcessID, szProcessName);
}
return
0;
}