PSAPI: stub implementations (#2)

Rob Shearman rob at codeweavers.com
Sat Jan 15 12:27:15 CST 2005


Hans Leidekker wrote:

>Call SetLastError() on failure, as suggested by Juan Lang. 
>
> -Hans
>
>Changelog:
>  Stub implementations for EnumPageFiles{A,W}, GetProcessImageFileName{A,W}.
>  Implement GetPerformanceInfo, GetProcessMemoryInfo on top of 
>  NtQueryInformationProcess and GetWsChanges, QueryWorkingSet{,Ex} on top
>  of NtQueryVirtualMemory.
>  
>
>------------------------------------------------------------------------
>
>@@ -443,15 +461,85 @@
> }
> 
> /***********************************************************************
>+ *           GetPerformanceInfo (PSAPI.@)
>+ */
>+BOOL WINAPI GetPerformanceInfo( PPERFORMANCE_INFORMATION info, DWORD size )
>+{
>+    NTSTATUS status;
>+
>+    TRACE( "(%p, %ld)\n", info, size );
>+
>+    if (size < sizeof(PERFORMANCE_INFORMATION))
>+    {
>+        SetLastError( ERROR_INSUFFICIENT_BUFFER );
>+        return FALSE;
>+    }
>+
>  
>

This check is redundant. All NtQueryInformation* functions check the 
buffer size for you.

>+    status = NtQueryInformationProcess( GetCurrentProcess(), SystemPerformanceInformation, info, size, NULL );
>+
>+    if (status)
>+    {
>+        SetLastError( RtlNtStatusToDosError( status ));
>+        return FALSE
>+    }
>+    return FALSE;
>+}
>  
>

>@@ -459,14 +547,25 @@
> /***********************************************************************
>  *           GetWsChanges (PSAPI.@)
>  */
>-BOOL WINAPI GetWsChanges(HANDLE hProcess, 
>-                         PPSAPI_WS_WATCH_INFORMATION lpWatchInfo, DWORD cb)
>+BOOL WINAPI GetWsChanges( HANDLE process, PPSAPI_WS_WATCH_INFORMATION watchinfo, DWORD size )
> {
>-    FIXME("(hProcess=%p, %p, %ld): stub\n",
>-          hProcess, lpWatchInfo, cb);
>+    NTSTATUS status;
>+
>+    TRACE( "(%p, %p, %ld)\n", process, watchinfo, size );
>+
>+    if (size < sizeof(PSAPI_WS_WATCH_INFORMATION))
>+    {
>+        SetLastError( ERROR_INSUFFICIENT_BUFFER );
>+        return FALSE;
>+    }
>  
>

So is this.

> 
>-    memset(lpWatchInfo, 0, cb);
>+    status = NtQueryVirtualMemory( process, NULL, ProcessWorkingSetWatch, watchinfo,  size, NULL );
> 
>+    if (status)
>+    {
>+        SetLastError( RtlNtStatusToDosError( status ));
>+        return FALSE
>+    }
>     return TRUE;
> }
> 
>  
>

Could you also make sure that the NtDll functions that you are calling 
give out a useful fixme message when called from these functions? At the 
moment you are mostly replacing some good fixme messages with bad fixme 
messages.

Rob



More information about the wine-devel mailing list