1. fixed field names of the SYSTEM_PAGEFILE_INFORMATION structure

2. implemented EnumPageFilesA/W()

svn path=/trunk/; revision=11548
This commit is contained in:
Thomas Bluemel 2004-11-06 01:42:04 +00:00
parent 6903fc73af
commit 3b90d19697
5 changed files with 182 additions and 72 deletions

View file

@ -474,11 +474,11 @@ struct _SYSTEM_OBJECT_INFORMATION
typedef
struct _SYSTEM_PAGEFILE_INFORMATION
{
ULONG RelativeOffset;
ULONG CurrentSizePages;
ULONG TotalUsedPages;
ULONG PeakUsedPages;
UNICODE_STRING PagefileFileName;
ULONG NextEntryOffset;
ULONG TotalSize;
ULONG TotalInUse;
ULONG PeakUsage;
UNICODE_STRING PageFileName;
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;

View file

@ -1,36 +1,9 @@
/* $Id: stubs.c,v 1.9 2004/11/05 23:53:06 weiden Exp $ */
/* $Id: stubs.c,v 1.10 2004/11/06 01:42:04 weiden Exp $ */
#include "precomp.h"
#define NDEBUG
#include <debug.h>
/*
* @unimplemented
*/
BOOL
STDCALL
EnumPageFilesA(PENUM_PAGE_FILE_CALLBACKA pCallbackRoutine,
LPVOID lpContext)
{
DPRINT1("PSAPI: EnumPageFilesA is UNIMPLEMENTED!\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @unimplemented
*/
BOOL
STDCALL
EnumPageFilesW(PENUM_PAGE_FILE_CALLBACKW pCallbackRoutine,
LPVOID lpContext)
{
DPRINT1("PSAPI: EnumPageFilesW is UNIMPLEMENTED!\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @unimplemented

View file

@ -1,4 +1,4 @@
/* $Id: win32.c,v 1.13 2004/11/05 23:53:06 weiden Exp $
/* $Id: win32.c,v 1.14 2004/11/06 01:42:04 weiden Exp $
*/
/*
* COPYRIGHT: See COPYING in the top level directory
@ -935,15 +935,15 @@ GetProcessImageFileNameW(HANDLE hProcess,
DWORD nSize)
{
PUNICODE_STRING ImageFileName;
ULONG BufferSize;
SIZE_T BufferSize;
NTSTATUS Status;
DWORD Ret = 0;
BufferSize = sizeof(UNICODE_STRING) + (nSize * sizeof(WCHAR));
ImageFileName = (PUNICODE_STRING)LocalAlloc(LMEM_FIXED, BufferSize);
if(ImageFileName != NULL)
{
DWORD Ret;
Status = NtQueryInformationProcess(hProcess,
ProcessImageFileName,
ImageFileName,
@ -957,9 +957,7 @@ GetProcessImageFileNameW(HANDLE hProcess,
lpImageFileName[ImageFileName->Length / sizeof(WCHAR)] = L'\0';
Ret = ImageFileName->Length / sizeof(WCHAR);
}
else
{
if(Status == STATUS_INFO_LENGTH_MISMATCH)
else if(Status == STATUS_INFO_LENGTH_MISMATCH)
{
/* XP sets this error code for some reason if the buffer is too small */
SetLastError(ERROR_INSUFFICIENT_BUFFER);
@ -968,11 +966,8 @@ GetProcessImageFileNameW(HANDLE hProcess,
{
SetLastErrorByStatus(Status);
}
Ret = 0;
}
LocalFree((HLOCAL)ImageFileName);
return Ret;
}
return 0;
@ -989,15 +984,15 @@ GetProcessImageFileNameA(HANDLE hProcess,
DWORD nSize)
{
PUNICODE_STRING ImageFileName;
ULONG BufferSize;
SIZE_T BufferSize;
NTSTATUS Status;
DWORD Ret = 0;
BufferSize = sizeof(UNICODE_STRING) + (nSize * sizeof(WCHAR));
ImageFileName = (PUNICODE_STRING)LocalAlloc(LMEM_FIXED, BufferSize);
if(ImageFileName != NULL)
{
DWORD Ret;
Status = NtQueryInformationProcess(hProcess,
ProcessImageFileName,
ImageFileName,
@ -1018,9 +1013,7 @@ GetProcessImageFileNameA(HANDLE hProcess,
lpImageFileName[ImageFileName->Length / sizeof(WCHAR)] = '\0';
Ret = ImageFileName->Length / sizeof(WCHAR);
}
else
{
if(Status == STATUS_INFO_LENGTH_MISMATCH)
else if(Status == STATUS_INFO_LENGTH_MISMATCH)
{
/* XP sets this error code for some reason if the buffer is too small */
SetLastError(ERROR_INSUFFICIENT_BUFFER);
@ -1029,15 +1022,159 @@ GetProcessImageFileNameA(HANDLE hProcess,
{
SetLastErrorByStatus(Status);
}
Ret = 0;
}
LocalFree((HLOCAL)ImageFileName);
return Ret;
}
return 0;
}
/* EOF */
typedef struct _INTERNAL_ENUM_PAGE_FILES_CONTEXT
{
PENUM_PAGE_FILE_CALLBACKA pCallbackRoutine;
LPVOID lpContext;
} INTERNAL_ENUM_PAGE_FILES_CONTEXT, *PINTERNAL_ENUM_PAGE_FILES_CONTEXT;
static BOOL
InternalAnsiPageFileCallback(LPVOID pContext,
PENUM_PAGE_FILE_INFORMATION pPageFileInfo,
LPCWSTR lpFilename)
{
size_t slen;
LPSTR AnsiFileName;
PINTERNAL_ENUM_PAGE_FILES_CONTEXT Context = (PINTERNAL_ENUM_PAGE_FILES_CONTEXT)pContext;
slen = wcslen(lpFilename);
AnsiFileName = (LPSTR)LocalAlloc(LMEM_FIXED, (slen + 1) * sizeof(CHAR));
if(AnsiFileName != NULL)
{
BOOL Ret;
WideCharToMultiByte(CP_ACP,
0,
lpFilename,
-1, /* only works if the string is NULL-terminated!!! */
AnsiFileName,
(slen + 1) * sizeof(CHAR),
NULL,
NULL);
Ret = Context->pCallbackRoutine(Context->lpContext, pPageFileInfo, AnsiFileName);
LocalFree((HLOCAL)AnsiFileName);
return Ret;
}
return FALSE;
}
/*
* @implemented
*/
BOOL
STDCALL
EnumPageFilesA(PENUM_PAGE_FILE_CALLBACKA pCallbackRoutine,
LPVOID lpContext)
{
INTERNAL_ENUM_PAGE_FILES_CONTEXT Context;
Context.pCallbackRoutine = pCallbackRoutine;
Context.lpContext = lpContext;
return EnumPageFilesW(InternalAnsiPageFileCallback, &Context);
}
/*
* @implemented
*/
BOOL
STDCALL
EnumPageFilesW(PENUM_PAGE_FILE_CALLBACKW pCallbackRoutine,
LPVOID lpContext)
{
NTSTATUS Status;
PVOID Buffer;
ULONG BufferSize = 0;
BOOL Ret = FALSE;
for(;;)
{
BufferSize += 0x1000;
Buffer = LocalAlloc(LMEM_FIXED, BufferSize);
if(Buffer == NULL)
{
return FALSE;
}
Status = NtQuerySystemInformation(SystemPagefileInformation,
Buffer,
BufferSize,
NULL);
if(Status == STATUS_INFO_LENGTH_MISMATCH)
{
LocalFree((HLOCAL)Buffer);
}
else
{
break;
}
}
if(NT_SUCCESS(Status))
{
ENUM_PAGE_FILE_INFORMATION Information;
PSYSTEM_PAGEFILE_INFORMATION pfi = (PSYSTEM_PAGEFILE_INFORMATION)Buffer;
ULONG Offset = 0;
do
{
PWCHAR Colon;
pfi = (PSYSTEM_PAGEFILE_INFORMATION)((ULONG_PTR)pfi + Offset);
Information.cb = sizeof(Information);
Information.Reserved = 0;
Information.TotalSize = pfi->TotalSize;
Information.TotalInUse = pfi->TotalInUse;
Information.PeakUsage = pfi->PeakUsage;
/* strip the \??\ prefix from the file name. We do this by searching for the first
: character and then just change Buffer to point to the previous character. */
Colon = wcschr(pfi->PageFileName.Buffer, L':');
if(Colon != NULL)
{
pfi->PageFileName.Buffer = --Colon;
}
/* FIXME - looks like the PageFileName string is always NULL-terminated on win.
At least I haven't encountered a different case so far, we should
propably manually NULL-terminate the string here... */
if(!pCallbackRoutine(lpContext, &Information, pfi->PageFileName.Buffer))
{
break;
}
Offset = pfi->NextEntryOffset;
} while(Offset != 0);
Ret = TRUE;
}
else
{
SetLastErrorByStatus(Status);
}
LocalFree((HLOCAL)Buffer);
return Ret;
}
/* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: sysinfo.c,v 1.56 2004/11/05 17:42:20 ekohl Exp $
/* $Id: sysinfo.c,v 1.57 2004/11/06 01:42:04 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -856,12 +856,12 @@ QSI_DEF(SystemPageFileInformation)
UNICODE_STRING FileName; /* FIXME */
/* FIXME */
Spfi->RelativeOffset = 0;
Spfi->NextEntryOffset = 0;
Spfi->CurrentSizePages = MiFreeSwapPages + MiUsedSwapPages;
Spfi->TotalUsedPages = MiUsedSwapPages;
Spfi->PeakUsedPages = MiUsedSwapPages; /* FIXME */
Spfi->PagefileFileName = FileName;
Spfi->TotalSize = MiFreeSwapPages + MiUsedSwapPages;
Spfi->TotalInUse = MiUsedSwapPages;
Spfi->PeakUsage = MiUsedSwapPages; /* FIXME */
Spfi->PageFileName = FileName;
return (STATUS_SUCCESS);
}

View file

@ -445,10 +445,10 @@ typedef struct _SYSTEM_OBJECT_INFORMATION {
typedef struct _SYSTEM_PAGEFILE_INFORMATION {
ULONG NextEntryOffset;
ULONG CurrentSize;
ULONG TotalUsed;
ULONG PeakUsed;
UNICODE_STRING FileName;
ULONG TotalSize;
ULONG TotalInUse;
ULONG PeakUsage;
UNICODE_STRING PageFileName;
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
typedef struct _SYSTEM_INSTRUCTION_EMULATION_INFORMATION {