15,471
社区成员
发帖
与我相关
我的任务
分享
VOID *GetDllProc(CHAR * pDllName, CHAR *pProcName)
{
HMODULE hMod;
hMod = LoadLibraryA(pDllName);
if(hMod == NULL)
return NULL;
return GetProcAddress(hMod, pProcName);
}
typedef BYTE (WINAPI *Fun_WinStationGetProcessSid)(HANDLE hServer,DWORD ProcessId , FILETIME ProcessStartTime,PBYTE pProcessUserSid ,PDWORD dwSidSize);
typedef VOID (WINAPI *Fun_CachedGetUserFromSid)( PSID pSid , PWCHAR pUserName,PULONG cbUserName);
BOOL NSystem::GetProcessUser(DWORD dwPid, _bstr_t *pbStrUser)
{
Fun_WinStationGetProcessSid _WinStationGetProcessSid;
Fun_CachedGetUserFromSid _CachedGetUserFromSid;
_WinStationGetProcessSid = (Fun_WinStationGetProcessSid)
GetDllProc("Winsta.dll", "WinStationGetProcessSid");
_CachedGetUserFromSid = (Fun_CachedGetUserFromSid)
GetDllProc("utildll.dll", "CachedGetUserFromSid");
if(_WinStationGetProcessSid == NULL || _CachedGetUserFromSid == NULL)
return FALSE;
BYTE cRetVal;
FILETIME ftStartTime;
DWORD dwSize;
BYTE * pSid;
BOOL bRetVal, bFind;
SYSTEM_PROCESS_INFORMATION * pProcInfo, * pCurProcInfo;
bRetVal = GetSysProcInfo(&pProcInfo);
if(bRetVal == FALSE || pProcInfo == NULL)
return FALSE;
bFind = FALSE;
pCurProcInfo = pProcInfo;
for(;;)
{
if(pCurProcInfo->dwProcessId == dwPid)
{
memcpy(&ftStartTime, &pCurProcInfo->qCreateTime, sizeof(ftStartTime));
bFind = TRUE;
break;
}
if(pCurProcInfo->dwNextEntryOffset == 0)
break;
pCurProcInfo = (SYSTEM_PROCESS_INFORMATION *)((BYTE *)pCurProcInfo +
pCurProcInfo->dwNextEntryOffset);
}
if(bFind == FALSE)
{
free(pProcInfo);
return FALSE;
}
cRetVal = _WinStationGetProcessSid(NULL, dwPid, ftStartTime, NULL, &dwSize);
if(cRetVal != 0)
{
free(pProcInfo);
return FALSE;
}
pSid = new BYTE[dwSize];
cRetVal = _WinStationGetProcessSid(NULL, dwPid, ftStartTime, pSid, &dwSize);
if(cRetVal == 0)
{
free(pProcInfo);
delete [] pSid;
return FALSE;
}
WCHAR szUserName[1024];
dwSize = 1024;
_CachedGetUserFromSid(pSid, szUserName, &dwSize);
delete [] pSid;
if(dwSize == 0)
{
free(pProcInfo);
return FALSE;
}
*pbStrUser = szUserName;
free(pProcInfo);
return TRUE;
}