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);
 }