Changeset 95738 in vbox for trunk/src/VBox/Runtime/r3/win
- Timestamp:
- Jul 20, 2022 2:27:44 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/win/process-win.cpp
r95736 r95738 73 73 //typedef DWORD (WINAPI *PFNWTSGETACTIVECONSOLESESSIONID)(VOID); 74 74 typedef HANDLE (WINAPI *PFNCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD); 75 typedef BOOL (WINAPI *PFNPROCESS32FIRST)(HANDLE, LPPROCESSENTRY32);76 75 typedef BOOL (WINAPI *PFNPROCESS32FIRSTW)(HANDLE, LPPROCESSENTRY32W); 77 typedef BOOL (WINAPI *PFNPROCESS32NEXT)(HANDLE, LPPROCESSENTRY32);78 76 typedef BOOL (WINAPI *PFNPROCESS32NEXTW)(HANDLE, LPPROCESSENTRY32W); 79 77 80 78 /* psapi.dll: */ 81 79 typedef BOOL (WINAPI *PFNENUMPROCESSES)(LPDWORD, DWORD, LPDWORD); 82 typedef DWORD (WINAPI *PFNGETMODULEBASENAME )(HANDLE, HMODULE, LPTSTR, DWORD);80 typedef DWORD (WINAPI *PFNGETMODULEBASENAMEW)(HANDLE, HMODULE, LPWSTR, DWORD); 83 81 84 82 /* advapi32.dll: */ … … 133 131 /* kernel32.dll: */ 134 132 static PFNCREATETOOLHELP32SNAPSHOT g_pfnCreateToolhelp32Snapshot = NULL; 135 static PFNPROCESS32FIRST g_pfnProcess32First = NULL;136 static PFNPROCESS32NEXT g_pfnProcess32Next = NULL;137 133 static PFNPROCESS32FIRSTW g_pfnProcess32FirstW = NULL; 138 134 static PFNPROCESS32NEXTW g_pfnProcess32NextW = NULL; 139 135 /* psapi.dll: */ 140 static PFNGETMODULEBASENAME g_pfnGetModuleBaseName= NULL;136 static PFNGETMODULEBASENAMEW g_pfnGetModuleBaseNameW = NULL; 141 137 static PFNENUMPROCESSES g_pfnEnumProcesses = NULL; 142 138 /* advapi32.dll: */ … … 317 313 */ 318 314 g_pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT)GetProcAddress(g_hModKernel32, "CreateToolhelp32Snapshot"); 319 g_pfnProcess32First = (PFNPROCESS32FIRST )GetProcAddress(g_hModKernel32, "Process32First");320 315 g_pfnProcess32FirstW = (PFNPROCESS32FIRSTW )GetProcAddress(g_hModKernel32, "Process32FirstW"); 321 g_pfnProcess32Next = (PFNPROCESS32NEXT )GetProcAddress(g_hModKernel32, "Process32Next");322 316 g_pfnProcess32NextW = (PFNPROCESS32NEXTW )GetProcAddress(g_hModKernel32, "Process32NextW"); 323 317 … … 326 320 */ 327 321 if ( !g_pfnCreateToolhelp32Snapshot 328 || !g_pfnProcess32First 329 || !g_pfnProcess32Next )330 { 331 Assert(!g_pfnCreateToolhelp32Snapshot && !g_pfnProcess32First && !g_pfnProcess32Next);322 || !g_pfnProcess32FirstW 323 || !g_pfnProcess32NextW) 324 { 325 Assert(!g_pfnCreateToolhelp32Snapshot && !g_pfnProcess32FirstW && !g_pfnProcess32NextW); 332 326 333 327 rc = RTLdrLoadSystem("psapi.dll", true /*fNoUnload*/, &hMod); 334 328 if (RT_SUCCESS(rc)) 335 329 { 336 rc = RTLdrGetSymbol(hMod, "GetModuleBaseName A", (void **)&g_pfnGetModuleBaseName);337 AssertStmt(RT_SUCCESS(rc), g_pfnGetModuleBaseName = NULL);330 rc = RTLdrGetSymbol(hMod, "GetModuleBaseNameW", (void **)&g_pfnGetModuleBaseNameW); 331 AssertStmt(RT_SUCCESS(rc), g_pfnGetModuleBaseNameW = NULL); 338 332 339 333 rc = RTLdrGetSymbol(hMod, "EnumProcesses", (void **)&g_pfnEnumProcesses); … … 622 616 * Load PSAPI.DLL and resolve the two symbols we need. 623 617 */ 624 if ( !g_pfnGetModuleBaseName 618 if ( !g_pfnGetModuleBaseNameW 625 619 || !g_pfnEnumProcesses) 626 620 return false; … … 659 653 * than RTPATH_MAX. 660 654 */ 661 DWORD cbProcName = RTPATH_MAX; 662 char *pszProcName = (char *)RTMemTmpAlloc(RTPATH_MAX); 663 if (pszProcName) 655 PRTUTF16 pwszProcName = (PRTUTF16)RTMemTmpAllocZ(RTPATH_MAX * sizeof(pwszProcName[0])); 656 if (pwszProcName) 664 657 { 665 658 for (size_t i = 0; papszNames[i] && !fFound; i++) … … 671 664 if (hProc) 672 665 { 673 *p szProcName = '\0';674 DWORD cbRet = g_pfnGetModuleBaseName (hProc, 0 /*hModule = exe */, pszProcName, cbProcName);666 *pwszProcName = '\0'; 667 DWORD cbRet = g_pfnGetModuleBaseNameW(hProc, 0 /*hModule = exe */, pwszProcName, RTPATH_MAX); 675 668 if ( cbRet > 0 676 && _stricmp(pszProcName, papszNames[i]) == 0669 && RTUtf16ICmpAscii(pwszProcName, papszNames[i]) == 0 677 670 && RT_SUCCESS(rtProcWinGetProcessTokenHandle(paPids[iPid], pSid, UINT32_MAX, phToken))) 678 671 fFound = true; … … 681 674 } 682 675 } 683 RTMemTmpFree(p szProcName);676 RTMemTmpFree(pwszProcName); 684 677 } 685 678 else … … 718 711 */ 719 712 bool fFallback = true; 720 if (g_pfnProcess32Next && g_pfnProcess32First&& g_pfnCreateToolhelp32Snapshot)713 if (g_pfnProcess32NextW && g_pfnProcess32FirstW && g_pfnCreateToolhelp32Snapshot) 721 714 { 722 715 HANDLE hSnap = g_pfnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); … … 727 720 for (size_t i = 0; papszNames[i] && !fFound; i++) 728 721 { 729 PROCESSENTRY32 ProcEntry;722 PROCESSENTRY32W ProcEntry; 730 723 ProcEntry.dwSize = sizeof(PROCESSENTRY32); 731 /** @todo use W APIs here. */ 732 if (g_pfnProcess32First (hSnap, &ProcEntry))724 ProcEntry.szExeFile[0] = '\0'; 725 if (g_pfnProcess32FirstW(hSnap, &ProcEntry)) 733 726 { 734 727 do 735 728 { 736 if ( _stricmp(ProcEntry.szExeFile, papszNames[i]) == 0)729 if (RTUtf16ICmpAscii(ProcEntry.szExeFile, papszNames[i]) == 0) 737 730 { 738 731 int rc = rtProcWinGetProcessTokenHandle(ProcEntry.th32ProcessID, pSid, idDesiredSession, phToken); … … 743 736 } 744 737 } 745 } while (g_pfnProcess32Next (hSnap, &ProcEntry));738 } while (g_pfnProcess32NextW(hSnap, &ProcEntry)); 746 739 } 747 #ifdef RT_STRICT748 740 else 749 { 750 DWORD dwErr = GetLastError(); 751 AssertMsgFailed(("dwErr=%u (%x)\n", dwErr, dwErr)); 752 } 753 #endif 741 AssertMsgFailed(("dwErr=%u (%x)\n", GetLastError(), GetLastError())); 754 742 } 755 743 CloseHandle(hSnap);
Note:
See TracChangeset
for help on using the changeset viewer.