mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +00:00
1. fixed field names of the SYSTEM_PAGEFILE_INFORMATION structure
2. implemented EnumPageFilesA/W() svn path=/trunk/; revision=11548
This commit is contained in:
parent
6903fc73af
commit
3b90d19697
5 changed files with 182 additions and 72 deletions
|
@ -474,12 +474,12 @@ struct _SYSTEM_OBJECT_INFORMATION
|
||||||
typedef
|
typedef
|
||||||
struct _SYSTEM_PAGEFILE_INFORMATION
|
struct _SYSTEM_PAGEFILE_INFORMATION
|
||||||
{
|
{
|
||||||
ULONG RelativeOffset;
|
ULONG NextEntryOffset;
|
||||||
ULONG CurrentSizePages;
|
ULONG TotalSize;
|
||||||
ULONG TotalUsedPages;
|
ULONG TotalInUse;
|
||||||
ULONG PeakUsedPages;
|
ULONG PeakUsage;
|
||||||
UNICODE_STRING PagefileFileName;
|
UNICODE_STRING PageFileName;
|
||||||
|
|
||||||
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
|
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
|
||||||
|
|
||||||
// SystemCacheInformation (21)
|
// SystemCacheInformation (21)
|
||||||
|
|
|
@ -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"
|
#include "precomp.h"
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#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
|
* @unimplemented
|
||||||
|
|
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
@ -935,15 +935,15 @@ GetProcessImageFileNameW(HANDLE hProcess,
|
||||||
DWORD nSize)
|
DWORD nSize)
|
||||||
{
|
{
|
||||||
PUNICODE_STRING ImageFileName;
|
PUNICODE_STRING ImageFileName;
|
||||||
ULONG BufferSize;
|
SIZE_T BufferSize;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
DWORD Ret = 0;
|
||||||
|
|
||||||
BufferSize = sizeof(UNICODE_STRING) + (nSize * sizeof(WCHAR));
|
BufferSize = sizeof(UNICODE_STRING) + (nSize * sizeof(WCHAR));
|
||||||
|
|
||||||
ImageFileName = (PUNICODE_STRING)LocalAlloc(LMEM_FIXED, BufferSize);
|
ImageFileName = (PUNICODE_STRING)LocalAlloc(LMEM_FIXED, BufferSize);
|
||||||
if(ImageFileName != NULL)
|
if(ImageFileName != NULL)
|
||||||
{
|
{
|
||||||
DWORD Ret;
|
|
||||||
Status = NtQueryInformationProcess(hProcess,
|
Status = NtQueryInformationProcess(hProcess,
|
||||||
ProcessImageFileName,
|
ProcessImageFileName,
|
||||||
ImageFileName,
|
ImageFileName,
|
||||||
|
@ -957,22 +957,17 @@ GetProcessImageFileNameW(HANDLE hProcess,
|
||||||
lpImageFileName[ImageFileName->Length / sizeof(WCHAR)] = L'\0';
|
lpImageFileName[ImageFileName->Length / sizeof(WCHAR)] = L'\0';
|
||||||
Ret = ImageFileName->Length / sizeof(WCHAR);
|
Ret = ImageFileName->Length / sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(Status == STATUS_INFO_LENGTH_MISMATCH)
|
SetLastErrorByStatus(Status);
|
||||||
{
|
|
||||||
/* XP sets this error code for some reason if the buffer is too small */
|
|
||||||
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetLastErrorByStatus(Status);
|
|
||||||
}
|
|
||||||
Ret = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalFree((HLOCAL)ImageFileName);
|
LocalFree((HLOCAL)ImageFileName);
|
||||||
return Ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -989,15 +984,15 @@ GetProcessImageFileNameA(HANDLE hProcess,
|
||||||
DWORD nSize)
|
DWORD nSize)
|
||||||
{
|
{
|
||||||
PUNICODE_STRING ImageFileName;
|
PUNICODE_STRING ImageFileName;
|
||||||
ULONG BufferSize;
|
SIZE_T BufferSize;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
DWORD Ret = 0;
|
||||||
|
|
||||||
BufferSize = sizeof(UNICODE_STRING) + (nSize * sizeof(WCHAR));
|
BufferSize = sizeof(UNICODE_STRING) + (nSize * sizeof(WCHAR));
|
||||||
|
|
||||||
ImageFileName = (PUNICODE_STRING)LocalAlloc(LMEM_FIXED, BufferSize);
|
ImageFileName = (PUNICODE_STRING)LocalAlloc(LMEM_FIXED, BufferSize);
|
||||||
if(ImageFileName != NULL)
|
if(ImageFileName != NULL)
|
||||||
{
|
{
|
||||||
DWORD Ret;
|
|
||||||
Status = NtQueryInformationProcess(hProcess,
|
Status = NtQueryInformationProcess(hProcess,
|
||||||
ProcessImageFileName,
|
ProcessImageFileName,
|
||||||
ImageFileName,
|
ImageFileName,
|
||||||
|
@ -1018,26 +1013,168 @@ GetProcessImageFileNameA(HANDLE hProcess,
|
||||||
lpImageFileName[ImageFileName->Length / sizeof(WCHAR)] = '\0';
|
lpImageFileName[ImageFileName->Length / sizeof(WCHAR)] = '\0';
|
||||||
Ret = ImageFileName->Length / sizeof(WCHAR);
|
Ret = ImageFileName->Length / sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(Status == STATUS_INFO_LENGTH_MISMATCH)
|
SetLastErrorByStatus(Status);
|
||||||
{
|
|
||||||
/* XP sets this error code for some reason if the buffer is too small */
|
|
||||||
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetLastErrorByStatus(Status);
|
|
||||||
}
|
|
||||||
Ret = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalFree((HLOCAL)ImageFileName);
|
LocalFree((HLOCAL)ImageFileName);
|
||||||
return Ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
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 */
|
||||||
|
|
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -856,12 +856,12 @@ QSI_DEF(SystemPageFileInformation)
|
||||||
UNICODE_STRING FileName; /* FIXME */
|
UNICODE_STRING FileName; /* FIXME */
|
||||||
|
|
||||||
/* FIXME */
|
/* FIXME */
|
||||||
Spfi->RelativeOffset = 0;
|
Spfi->NextEntryOffset = 0;
|
||||||
|
|
||||||
Spfi->CurrentSizePages = MiFreeSwapPages + MiUsedSwapPages;
|
Spfi->TotalSize = MiFreeSwapPages + MiUsedSwapPages;
|
||||||
Spfi->TotalUsedPages = MiUsedSwapPages;
|
Spfi->TotalInUse = MiUsedSwapPages;
|
||||||
Spfi->PeakUsedPages = MiUsedSwapPages; /* FIXME */
|
Spfi->PeakUsage = MiUsedSwapPages; /* FIXME */
|
||||||
Spfi->PagefileFileName = FileName;
|
Spfi->PageFileName = FileName;
|
||||||
return (STATUS_SUCCESS);
|
return (STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -445,10 +445,10 @@ typedef struct _SYSTEM_OBJECT_INFORMATION {
|
||||||
|
|
||||||
typedef struct _SYSTEM_PAGEFILE_INFORMATION {
|
typedef struct _SYSTEM_PAGEFILE_INFORMATION {
|
||||||
ULONG NextEntryOffset;
|
ULONG NextEntryOffset;
|
||||||
ULONG CurrentSize;
|
ULONG TotalSize;
|
||||||
ULONG TotalUsed;
|
ULONG TotalInUse;
|
||||||
ULONG PeakUsed;
|
ULONG PeakUsage;
|
||||||
UNICODE_STRING FileName;
|
UNICODE_STRING PageFileName;
|
||||||
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
|
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
|
||||||
|
|
||||||
typedef struct _SYSTEM_INSTRUCTION_EMULATION_INFORMATION {
|
typedef struct _SYSTEM_INSTRUCTION_EMULATION_INFORMATION {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue