CVS: winex/dlls/psapi psapi_main.c,1.11,1.12
[email protected] 12 Sep 2007 12:27:42 -0000
| Newsgroups | gmane.comp.emulators.winex.cvs |
|---|---|
| Message-ID | <[email protected]> |
Subject: winex/dlls/psapi psapi_main.c,1.11,1.12Update of /var/lib/cvsd/cvsroot/winex/dlls/psapi
In directory agravaine:/tmp/cvs-serv10036/dlls/psapi
Modified Files:
psapi_main.c
Log Message:
- implemented GetModuleFileNameExW() and GetModuleBaseNameA/W().
Index: psapi_main.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/psapi/psapi_main.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- psapi_main.c 12 Sep 2007 12:27:05 -0000 1.11
+++ psapi_main.c 12 Sep 2007 12:27:40 -0000 1.12
@@ -5,6 +5,7 @@
*/
#include "winbase.h"
+#include "winnls.h"
#include "windef.h"
#include "winerror.h"
#include "wine/debug.h"
@@ -270,113 +271,252 @@
/***********************************************************************
- * GetModuleBaseNameA (PSAPI.@)
+ * PSAPI_GetModuleFileNameExA (internal)
*/
-DWORD WINAPI GetModuleBaseNameA(
- HANDLE hProcess, HMODULE hModule, LPSTR lpBaseName, DWORD nSize)
+static DWORD WINAPI PSAPI_GetModuleFileNameExA(
+ HANDLE hProcess,
+ HMODULE hModule,
+ LPSTR lpFilename,
+ DWORD nSize,
+ BOOL baseNameOnly)
{
- FIXME("(hProcess=0x%08x, hModule=0x%08x, %s, %ld): stub\n",
- hProcess, hModule, debugstr_a(lpBaseName), nSize
- );
+ HANDLE snapshot;
+ MODULEENTRY32 me32;
+ DWORD pid;
+ BOOL ret;
+ DWORD len = 0;
+ DWORD errcode;
- if(lpBaseName && nSize)
- lpBaseName[0] = '\0';
- return 0;
-}
+ TRACE("{hProcess = 0x%08x, hModule = 0x%08x, lpFilename = %p, nSize = %ld, baseNameOnly = %d}\n",
+ hProcess, hModule, lpFilename, nSize, baseNameOnly);
+ FIXME("swap this function's body with PSAPI_GetModuleFileNameExW() and fix Module32FirstW/NextW()!\n");
-/***********************************************************************
- * GetModuleBaseNameW (PSAPI.@)
- */
-DWORD WINAPI GetModuleBaseNameW(
- HANDLE hProcess, HMODULE hModule, LPWSTR lpBaseName, DWORD nSize)
-{
- FIXME("(hProcess=0x%08x, hModule=0x%08x, %s, %ld): stub\n",
- hProcess, hModule, debugstr_w(lpBaseName), nSize);
- if(lpBaseName && nSize)
- lpBaseName[0] = '\0';
+ if (lpFilename && nSize)
+ lpFilename[0] = '\0';
- return 0;
+ pid = GetProcessId( hProcess );
+ TRACE("using pid = %ld\n", pid);
+
+
+ /* the current process was requested => just grab the module filename from this process instead */
+ if (pid == GetCurrentProcessId()){
+
+ /* requested the base name only => read the filename into a temp buffer and parse out the base name */
+ if (baseNameOnly){
+ char tmpName[MAX_PATH];
+ char * baseName;
+
+
+ /* try to find the module's filename */
+ if (GetModuleFileNameA(hModule, tmpName, MAX_PATH) == 0){
+ ERR("could not retrieve the filename for the module 0x%08x in this process\n", hModule);
+
+ return 0;
+ }
+
+
+ /* see if a path element was provided with the filename */
+ baseName = strrchr(tmpName, '\\');
+
+ /* a path separator was found => copy only the filename portion */
+ if (baseName)
+ strncpy(lpFilename, baseName + 1, nSize);
+
+ /* no path separator was found => copy the entire filename */
+ else
+ strncpy(lpFilename, tmpName, nSize);
+
+ /* make sure the buffer is terminated! */
+ lpFilename[nSize - 1] = 0;
+ len = strlen(lpFilename);
+
+ return len;
+ }
+
+ /* requested the full path of the module's file => just read directly into the output buffer */
+ else
+ return GetModuleFileNameA(hModule, lpFilename, nSize);
+ }
+
+
+ if (!hModule)
+ FIXME("get the EXE name of the hProcess!\n");
+
+ snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid);
+ if ( snapshot == INVALID_HANDLE_VALUE )
+ return FALSE;
+
+ me32.dwSize = sizeof( MODULEENTRY32 );
+ ret = Module32First( snapshot, &me32 );
+
+ TRACE("ret = %d\n", ret);
+ while (ret){
+
+ if( hModule == me32.hModule ) {
+ TRACE("found hModule = 0x%08lx, exePath = '%s', module = '%s', pid = %ld\n",
+ me32.hModule, me32.szExePath, me32.szModule, me32.th32ProcessID);
+
+
+ if (lpFilename && nSize) {
+ if (baseNameOnly)
+ strncpy(lpFilename, me32.szModule, nSize);
+
+ else
+ strncpy(lpFilename, me32.szExePath, nSize);
+
+ lpFilename[nSize - 1] = '\0';
+ len = strlen(lpFilename);
+ }
+
+ break;
+ }
+
+ ret = Module32Next( snapshot, &me32 );
+ TRACE("ret = %d\n", ret);
+ }
+
+ if ( (errcode = GetLastError()) == ERROR_NO_MORE_FILES )
+ SetLastError(NO_ERROR);
+
+
+ TRACE("errcode=0x%08lx\n", errcode);
+
+ CloseHandle( snapshot );
+
+ TRACE("returning filename='%s'\n", lpFilename);
+
+ return len;
}
/***********************************************************************
- * GetModuleFileNameExA (PSAPI.@)
+ * PSAPI_GetModuleFileNameExW (internal)
*/
-DWORD WINAPI GetModuleFileNameExA(
- HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize)
+static DWORD WINAPI PSAPI_GetModuleFileNameExW(
+ HANDLE hProcess,
+ HMODULE hModule,
+ LPWSTR lpFilename,
+ DWORD nSize,
+ BOOL baseNameOnly)
{
- HANDLE snapshot;
- MODULEENTRY32 me32;
- DWORD pid;
- BOOL ret;
- DWORD len = 0, errcode;
+ char *buffer;
+ DWORD result;
- TRACE("(hProcess=0x%08x,hModule=0x%08x, %p, %ld)\n",
- hProcess, hModule, lpFilename, nSize );
- if(lpFilename&&nSize)
- lpFilename[0]='\0';
+ TRACE("{hProcess = 0x%08x, hModule = 0x%08x, lpFilename = %p, nSize = %ld, baseNameOnly = %d}\n",
+ hProcess, hModule, lpFilename, nSize, baseNameOnly);
- pid = GetProcessId( hProcess );
- TRACE("using pid=%ld\n", pid);
+ if(lpFilename && nSize)
+ lpFilename[0] = '\0';
- if (pid == GetCurrentProcessId ())
- return GetModuleFileNameA (hModule, lpFilename, nSize);
- if( !hModule )
- FIXME("get EXE name of hProcess\n");
+ /* !! This is really bad practice to do, but necessary for the moment. The 'A' version of a
+ function should always call through to the 'W' version then convert the result instead
+ of the other way around. However, there is currently an issue with the Module32First()
+ and Module32Next() functions - there are no 'W' equivalents actually built or exported.
+ */
+ /* FIXME: this function and PSAPI_GetModuleFileNameExA() should have their bodies swapped
+ so that the 'A' version calls this one and this one performs the actual work.
+ Need Module32First/Next() fixed with wide character support first though. */
+ FIXME("swap this function's body with PSAPI_GetModuleFileNameExA() and fix Module32FirstW/NextW()!\n");
- snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid);
- if( snapshot == INVALID_HANDLE_VALUE ) return FALSE;
- me32.dwSize = sizeof( MODULEENTRY32 );
- ret = Module32First( snapshot, &me32 );
+ buffer = (char *)HeapAlloc(GetProcessHeap(), 0, nSize * sizeof(char));
- TRACE("ret = %d\n", ret);
- while( ret ) {
+ if (buffer == NULL){
+ ERR("not enough memory to allocate a temporary buffer!\n");
+ SetLastError(ERROR_OUTOFMEMORY);
- if( hModule == me32.hModule ) {
- TRACE("found hModule=0x%08lx, %s, %s, pid=%ld\n",
- me32.hModule, me32.szExePath, me32.szModule, me32.th32ProcessID);
+ return 0;
+ }
- if(lpFilename && nSize) {
- strncpy(lpFilename, me32.szExePath, nSize);
- lpFilename[nSize-1] = '\0';
- len = strlen(lpFilename);
- }
- break;
+
+ result = PSAPI_GetModuleFileNameExA(hProcess, hModule, buffer, nSize, baseNameOnly);
+
+ /* call succeeded => convert the filename to a wide string */
+ if (result != 0){
+ if (!MultiByteToWideChar(CP_ACP, 0, buffer, -1, lpFilename, nSize)){
+ ERR("could not convert the string '%s' to a wide string!\n", buffer);
+ HeapFree(GetProcessHeap(), 0, buffer);
+
+ return 0;
+ }
}
-
- ret = Module32Next( snapshot, &me32 );
- TRACE("ret = %d\n", ret);
- }
- if( (errcode = GetLastError()) == ERROR_NO_MORE_FILES )
- SetLastError(NO_ERROR);
- TRACE("errcode=0x%08lx\n", errcode);
-
- CloseHandle( snapshot );
+ else
+ ERR("could not retrieve the filename of the module 0x%08x\n", hModule);
- TRACE("returning filename='%s'\n", lpFilename);
-
- return len;
+
+ HeapFree(GetProcessHeap(), 0, buffer);
+
+ return result;
+}
+
+
+/***********************************************************************
+ * GetModuleBaseNameA (PSAPI.@)
+ */
+DWORD WINAPI GetModuleBaseNameA(
+ HANDLE hProcess,
+ HMODULE hModule,
+ LPSTR lpBaseName,
+ DWORD nSize)
+{
+ TRACE("{hProcess=0x%08x, hModule=0x%08x, lpBaseName = %p, nSize = %ld}\n",
+ hProcess, hModule, lpBaseName, nSize);
+
+
+ return PSAPI_GetModuleFileNameExA(hProcess, hModule, lpBaseName, nSize, TRUE);
+}
+
+/***********************************************************************
+ * GetModuleBaseNameW (PSAPI.@)
+ */
+DWORD WINAPI GetModuleBaseNameW(
+ HANDLE hProcess,
+ HMODULE hModule,
+ LPWSTR lpBaseName,
+ DWORD nSize)
+{
+ TRACE("{hProcess = 0x%08x, hModule = 0x%08x, lpBaseName = %p, nSize = %ld}\n",
+ hProcess, hModule, lpBaseName, nSize);
+
+
+ return PSAPI_GetModuleFileNameExW(hProcess, hModule, lpBaseName, nSize, TRUE);
+}
+
+
+/***********************************************************************
+ * GetModuleFileNameExA (PSAPI.@)
+ */
+DWORD WINAPI GetModuleFileNameExA(
+ HANDLE hProcess,
+ HMODULE hModule,
+ LPSTR lpFilename,
+ DWORD nSize)
+{
+ TRACE("{hProcess = 0x%08x, hModule = 0x%08x, lpFilename = %p, nSize = %ld}\n",
+ hProcess, hModule, lpFilename, nSize);
+
+
+ return PSAPI_GetModuleFileNameExA(hProcess, hModule, lpFilename, nSize, FALSE);
}
/***********************************************************************
* GetModuleFileNameExW (PSAPI.@)
*/
DWORD WINAPI GetModuleFileNameExW(
- HANDLE hProcess, HMODULE hModule, LPWSTR lpFilename, DWORD nSize)
+ HANDLE hProcess,
+ HMODULE hModule,
+ LPWSTR lpFilename,
+ DWORD nSize)
{
- FIXME("(hProcess=0x%08x,hModule=0x%08x, %s, %ld): stub\n",
- hProcess, hModule, debugstr_w(lpFilename), nSize
- );
+ TRACE("{hProcess = 0x%08x, hModule = 0x%08x, lpFilename = %p, nSize = %ld}\n",
+ hProcess, hModule, lpFilename, nSize);
- if(lpFilename && nSize)
- lpFilename[0] = '\0';
- return 0;
+ return PSAPI_GetModuleFileNameExW(hProcess, hModule, lpFilename, nSize, FALSE);
}