mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
Long due update to PSAPI
svn path=/trunk/; revision=4478
This commit is contained in:
parent
01da24f40c
commit
a812f4e0b2
6 changed files with 440 additions and 66 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: module.c,v 1.3 2002/08/31 15:36:55 hyperion Exp $
|
/* $Id: module.c,v 1.4 2003/04/02 22:09:56 hyperion Exp $
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
@ -11,6 +11,8 @@
|
||||||
* 10/06/2002: Created
|
* 10/06/2002: Created
|
||||||
* 29/08/2002: Generalized the interface to improve reusability,
|
* 29/08/2002: Generalized the interface to improve reusability,
|
||||||
* more efficient use of memory operations
|
* more efficient use of memory operations
|
||||||
|
* 12/02/2003: malloc and free renamed to PsaiMalloc and PsaiFree,
|
||||||
|
* for better reusability
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
|
@ -19,7 +21,7 @@
|
||||||
#include <ntdll/ldr.h>
|
#include <ntdll/ldr.h>
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
NTAPI
|
||||||
PsaEnumerateSystemModules
|
PsaEnumerateSystemModules
|
||||||
(
|
(
|
||||||
IN PSYSMOD_ENUM_ROUTINE Callback,
|
IN PSYSMOD_ENUM_ROUTINE Callback,
|
||||||
|
@ -62,13 +64,14 @@ PsaEnumerateSystemModules
|
||||||
/* free the buffer, and reallocate it to the new size. RATIONALE: since we
|
/* free the buffer, and reallocate it to the new size. RATIONALE: since we
|
||||||
ignore the buffer's content at this point, there's no point in a realloc(),
|
ignore the buffer's content at this point, there's no point in a realloc(),
|
||||||
that could end up copying a large chunk of data we'd discard anyway */
|
that could end up copying a large chunk of data we'd discard anyway */
|
||||||
free(pnModuleCount);
|
PsaiFree(pnModuleCount);
|
||||||
pTmp = malloc(nSize);
|
pTmp = PsaiMalloc(nSize);
|
||||||
|
|
||||||
if(pTmp == NULL)
|
if(pTmp == NULL)
|
||||||
{
|
{
|
||||||
/* failure */
|
/* failure */
|
||||||
nErrCode = STATUS_NO_MEMORY;
|
nErrCode = STATUS_NO_MEMORY;
|
||||||
|
DPRINT(FAILED_WITH_STATUS, "PsaiMalloc", nErrCode);
|
||||||
goto esm_Finalize;
|
goto esm_Finalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,13 +121,13 @@ PsaEnumerateSystemModules
|
||||||
|
|
||||||
esm_Finalize:
|
esm_Finalize:
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pnModuleCount);
|
PsaiFree(pnModuleCount);
|
||||||
|
|
||||||
return (nErrCode);
|
return (nErrCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
NTAPI
|
||||||
PsaEnumerateProcessModules
|
PsaEnumerateProcessModules
|
||||||
(
|
(
|
||||||
IN HANDLE ProcessHandle,
|
IN HANDLE ProcessHandle,
|
||||||
|
|
|
@ -1,35 +1,52 @@
|
||||||
/* $Id: process.c,v 1.3 2002/08/31 15:36:55 hyperion Exp $
|
/* $Id: process.c,v 1.4 2003/04/02 22:09:56 hyperion Exp $
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* LICENSE: See LGPL.txt in the top level directory
|
* LICENSE: See LGPL.txt in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
* FILE: reactos/lib/psapi/enum/process.c
|
* FILE: reactos/lib/psapi/enum/process.c
|
||||||
* PURPOSE: Enumerate processes
|
* PURPOSE: Enumerate processes and threads
|
||||||
* PROGRAMMER: KJK::Hyperion <noog@libero.it>
|
* PROGRAMMER: KJK::Hyperion <noog@libero.it>
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
* 10/06/2002: Created
|
* 10/06/2002: Created
|
||||||
* 29/08/2002: Generalized the interface to improve reusability,
|
* 29/08/2002: Generalized the interface to improve reusability,
|
||||||
* more efficient use of memory operations
|
* more efficient use of memory operations
|
||||||
|
* 12/02/2003: malloc and free renamed to PsaiMalloc and PsaiFree,
|
||||||
|
* for better reusability. PsaEnumerateProcesses now
|
||||||
|
* expanded into:
|
||||||
|
* - PsaCaptureProcessesAndThreads
|
||||||
|
* - PsaFreeCapture
|
||||||
|
* - PsaWalkProcessesAndThreads
|
||||||
|
* - PsaWalkProcesses
|
||||||
|
* - PsaWalkThreads
|
||||||
|
* - PsaWalkFirstProcess
|
||||||
|
* - PsaWalkNextProcess
|
||||||
|
* - PsaWalkFirstThread
|
||||||
|
* - PsaWalkNextThread
|
||||||
|
* - PsaEnumerateProcessesAndThreads
|
||||||
|
* - PsaEnumerateProcesses
|
||||||
|
* - PsaEnumerateThreads
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <internal/psapi.h>
|
#include <internal/psapi.h>
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
NTAPI
|
||||||
PsaEnumerateProcesses
|
PsaCaptureProcessesAndThreads
|
||||||
(
|
(
|
||||||
IN PPROC_ENUM_ROUTINE Callback,
|
OUT PSYSTEM_PROCESSES * ProcessesAndThreads
|
||||||
IN OUT PVOID CallbackContext
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
register NTSTATUS nErrCode = STATUS_SUCCESS;
|
NTSTATUS nErrCode = STATUS_SUCCESS;
|
||||||
PSYSTEM_PROCESS_INFORMATION pInfoBuffer = NULL;
|
PSYSTEM_PROCESSES pInfoBuffer = NULL;
|
||||||
PSYSTEM_PROCESS_INFORMATION pInfoHead = NULL;
|
SIZE_T nSize = 32768;
|
||||||
ULONG nSize = 32768;
|
|
||||||
|
/* parameter validation */
|
||||||
|
if(!ProcessesAndThreads)
|
||||||
|
return STATUS_INVALID_PARAMETER_1;
|
||||||
|
|
||||||
/* FIXME: if the system has loaded several processes and threads, the buffer
|
/* FIXME: if the system has loaded several processes and threads, the buffer
|
||||||
could get really big. But if there's several processes and threads, the
|
could get really big. But if there's several processes and threads, the
|
||||||
|
@ -39,19 +56,19 @@ PsaEnumerateProcesses
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
void * pTmp;
|
void * pTmp;
|
||||||
|
|
||||||
/* free the buffer, and reallocate it to the new size. RATIONALE: since we
|
/* free the buffer, and reallocate it to the new size. RATIONALE: since we
|
||||||
ignore the buffer's contents at this point, there's no point in a realloc()
|
ignore the buffer's contents at this point, there's no point in a realloc()
|
||||||
that could end up copying a large chunk of data we'd discard anyway */
|
that could end up copying a large chunk of data we'd discard anyway */
|
||||||
free(pInfoBuffer);
|
PsaiFree(pInfoBuffer);
|
||||||
pTmp = malloc(nSize);
|
pTmp = PsaiMalloc(nSize);
|
||||||
|
|
||||||
if(pTmp == NULL)
|
if(pTmp == NULL)
|
||||||
{
|
{
|
||||||
/* failure */
|
/* failure */
|
||||||
DPRINT(FAILED_WITH_STATUS, "malloc", STATUS_NO_MEMORY);
|
DPRINT(FAILED_WITH_STATUS, "PsaiMalloc", STATUS_NO_MEMORY);
|
||||||
nErrCode = STATUS_NO_MEMORY;
|
nErrCode = STATUS_NO_MEMORY;
|
||||||
goto esp_Finalize;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfoBuffer = pTmp;
|
pInfoBuffer = pTmp;
|
||||||
|
@ -75,36 +92,281 @@ PsaEnumerateProcesses
|
||||||
if(!NT_SUCCESS(nErrCode))
|
if(!NT_SUCCESS(nErrCode))
|
||||||
{
|
{
|
||||||
DPRINT(FAILED_WITH_STATUS, "NtQuerySystemInformation", nErrCode);
|
DPRINT(FAILED_WITH_STATUS, "NtQuerySystemInformation", nErrCode);
|
||||||
goto esp_Finalize;
|
return nErrCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* list head */
|
|
||||||
pInfoHead = pInfoBuffer;
|
|
||||||
|
|
||||||
/* scan the list */
|
/* success */
|
||||||
while(1)
|
*ProcessesAndThreads = pInfoBuffer;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaWalkProcessesAndThreads
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads,
|
||||||
|
IN PPROC_ENUM_ROUTINE ProcessCallback,
|
||||||
|
IN OUT PVOID ProcessCallbackContext,
|
||||||
|
IN PTHREAD_ENUM_ROUTINE ThreadCallback,
|
||||||
|
IN OUT PVOID ThreadCallbackContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
register NTSTATUS nErrCode = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* parameter validation */
|
||||||
|
if(!ProcessCallback && !ThreadCallback)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
ProcessesAndThreads = PsaWalkFirstProcess(ProcessesAndThreads);
|
||||||
|
|
||||||
|
/* scan the process list */
|
||||||
|
do
|
||||||
{
|
{
|
||||||
/* notify the callback */
|
/* if the caller provided a process callback */
|
||||||
nErrCode = Callback(pInfoHead, CallbackContext);
|
if(ProcessCallback)
|
||||||
|
{
|
||||||
|
/* notify the callback */
|
||||||
|
nErrCode = ProcessCallback(ProcessesAndThreads, ProcessCallbackContext);
|
||||||
|
|
||||||
|
/* if the callback returned an error, break out */
|
||||||
|
if(!NT_SUCCESS(nErrCode))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if the caller provided a thread callback */
|
||||||
|
if(ThreadCallback)
|
||||||
|
{
|
||||||
|
ULONG i;
|
||||||
|
PSYSTEM_THREADS pCurThread;
|
||||||
|
|
||||||
|
/* scan the current process's thread list */
|
||||||
|
for
|
||||||
|
(
|
||||||
|
i = 0, pCurThread = PsaWalkFirstThread(ProcessesAndThreads);
|
||||||
|
i < ProcessesAndThreads->ThreadCount;
|
||||||
|
++ i, pCurThread = PsaWalkNextThread(pCurThread)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
/* notify the callback */
|
||||||
|
nErrCode = ThreadCallback(pCurThread, ThreadCallbackContext);
|
||||||
|
|
||||||
|
/* if the callback returned an error, break out */
|
||||||
|
if(!NT_SUCCESS(nErrCode)) goto epat_Breakout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* if the callback returned an error or this is the end of the process list,
|
|
||||||
break out */
|
|
||||||
if(!NT_SUCCESS(nErrCode) || pInfoHead->RelativeOffset == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* move to the next process */
|
/* move to the next process */
|
||||||
pInfoHead =
|
ProcessesAndThreads = PsaWalkNextProcess(ProcessesAndThreads);
|
||||||
(SYSTEM_PROCESS_INFORMATION*)
|
|
||||||
((ULONG)pInfoHead + pInfoHead->RelativeOffset);
|
|
||||||
}
|
}
|
||||||
|
/* repeat until the end of the string */
|
||||||
|
while(ProcessesAndThreads);
|
||||||
|
|
||||||
esp_Finalize:
|
epat_Breakout:
|
||||||
|
/* return the last status */
|
||||||
|
return (nErrCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaEnumerateProcessesAndThreads
|
||||||
|
(
|
||||||
|
IN PPROC_ENUM_ROUTINE ProcessCallback,
|
||||||
|
IN OUT PVOID ProcessCallbackContext,
|
||||||
|
IN PTHREAD_ENUM_ROUTINE ThreadCallback,
|
||||||
|
IN OUT PVOID ThreadCallbackContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
register NTSTATUS nErrCode;
|
||||||
|
PSYSTEM_PROCESSES pInfoBuffer;
|
||||||
|
|
||||||
|
/* parameter validation */
|
||||||
|
if(!ProcessCallback && !ThreadCallback)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* get the processes and threads list */
|
||||||
|
nErrCode = PsaCaptureProcessesAndThreads(&pInfoBuffer);
|
||||||
|
|
||||||
|
/* failure */
|
||||||
|
if(!NT_SUCCESS(nErrCode))
|
||||||
|
goto epat_Finalize;
|
||||||
|
|
||||||
|
/* walk the processes and threads list */
|
||||||
|
nErrCode = PsaWalkProcessesAndThreads
|
||||||
|
(
|
||||||
|
pInfoBuffer,
|
||||||
|
ProcessCallback,
|
||||||
|
ProcessCallbackContext,
|
||||||
|
ThreadCallback,
|
||||||
|
ThreadCallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
epat_Finalize:
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pInfoBuffer);
|
PsaFreeCapture(pInfoBuffer);
|
||||||
|
|
||||||
/* return the last status */
|
/* return the last status */
|
||||||
return (nErrCode);
|
return (nErrCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
VOID
|
||||||
|
NTAPI
|
||||||
|
PsaFreeCapture
|
||||||
|
(
|
||||||
|
IN PVOID Capture
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PsaiFree(Capture);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaWalkProcesses
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads,
|
||||||
|
IN PPROC_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return PsaWalkProcessesAndThreads
|
||||||
|
(
|
||||||
|
ProcessesAndThreads,
|
||||||
|
Callback,
|
||||||
|
CallbackContext,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaWalkThreads
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads,
|
||||||
|
IN PTHREAD_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return PsaWalkProcessesAndThreads
|
||||||
|
(
|
||||||
|
ProcessesAndThreads,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
Callback,
|
||||||
|
CallbackContext
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaEnumerateProcesses
|
||||||
|
(
|
||||||
|
IN PPROC_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return PsaEnumerateProcessesAndThreads
|
||||||
|
(
|
||||||
|
Callback,
|
||||||
|
CallbackContext,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaEnumerateThreads
|
||||||
|
(
|
||||||
|
IN PTHREAD_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return PsaEnumerateProcessesAndThreads
|
||||||
|
(
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
Callback,
|
||||||
|
CallbackContext
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PSYSTEM_PROCESSES
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkFirstProcess
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return ProcessesAndThreads;
|
||||||
|
}
|
||||||
|
|
||||||
|
PSYSTEM_PROCESSES
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkNextProcess
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES CurrentProcess
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if(CurrentProcess->NextEntryDelta == 0)
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
return
|
||||||
|
(PSYSTEM_PROCESSES)
|
||||||
|
((ULONG_PTR)CurrentProcess + CurrentProcess->NextEntryDelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
PSYSTEM_THREADS
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkFirstThread
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES CurrentProcess
|
||||||
|
)
|
||||||
|
{
|
||||||
|
static SIZE_T nOffsetOfThreads = 0;
|
||||||
|
|
||||||
|
#define printoffset(__T__, __F__) fprintf(stderr, "%02X %s->%s\n", offsetof(__T__, __F__), #__T__, #__F__)
|
||||||
|
|
||||||
|
/* get the offset of the Threads field (dependant on the kernel version) */
|
||||||
|
if(!nOffsetOfThreads)
|
||||||
|
{
|
||||||
|
switch(SharedUserData->NtMajorVersion)
|
||||||
|
{
|
||||||
|
/* NT 3 and 4 */
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
nOffsetOfThreads = offsetof(SYSTEM_PROCESSES_NT4, Threads);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NT 5 and later */
|
||||||
|
default:
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
nOffsetOfThreads = offsetof(SYSTEM_PROCESSES_NT5, Threads);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (PSYSTEM_THREADS)((ULONG_PTR)CurrentProcess + nOffsetOfThreads);
|
||||||
|
}
|
||||||
|
|
||||||
|
PSYSTEM_THREADS
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkNextThread
|
||||||
|
(
|
||||||
|
IN PSYSTEM_THREADS CurrentThread
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return (PSYSTEM_THREADS)
|
||||||
|
(
|
||||||
|
(ULONG_PTR)CurrentThread +
|
||||||
|
(
|
||||||
|
offsetof(SYSTEM_PROCESSES, Threads[1]) -
|
||||||
|
offsetof(SYSTEM_PROCESSES, Threads[0])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: psapi.h,v 1.3 2002/08/31 15:36:55 hyperion Exp $
|
/* $Id: psapi.h,v 1.4 2003/04/02 22:09:56 hyperion Exp $
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* internal/psapi.h
|
* internal/psapi.h
|
||||||
|
@ -32,20 +32,26 @@
|
||||||
/* OBJECTS */
|
/* OBJECTS */
|
||||||
|
|
||||||
/* TYPES */
|
/* TYPES */
|
||||||
typedef NTSTATUS STDCALL (*PPROC_ENUM_ROUTINE)
|
typedef NTSTATUS NTAPI (*PPROC_ENUM_ROUTINE)
|
||||||
(
|
(
|
||||||
IN PSYSTEM_PROCESS_INFORMATION CurrentProcess,
|
IN PSYSTEM_PROCESSES CurrentProcess,
|
||||||
IN OUT PVOID CallbackContext
|
IN OUT PVOID CallbackContext
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef NTSTATUS STDCALL (*PSYSMOD_ENUM_ROUTINE)
|
typedef NTSTATUS NTAPI (*PTHREAD_ENUM_ROUTINE)
|
||||||
|
(
|
||||||
|
IN PSYSTEM_THREADS CurrentThread,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef NTSTATUS NTAPI (*PSYSMOD_ENUM_ROUTINE)
|
||||||
(
|
(
|
||||||
IN ULONG ModuleCount,
|
IN ULONG ModuleCount,
|
||||||
IN PSYSTEM_MODULE_ENTRY CurrentModule,
|
IN PSYSTEM_MODULE_ENTRY CurrentModule,
|
||||||
IN OUT PVOID CallbackContext
|
IN OUT PVOID CallbackContext
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef NTSTATUS STDCALL (*PPROCMOD_ENUM_ROUTINE)
|
typedef NTSTATUS NTAPI (*PPROCMOD_ENUM_ROUTINE)
|
||||||
(
|
(
|
||||||
IN HANDLE ProcessHandle,
|
IN HANDLE ProcessHandle,
|
||||||
IN PLDR_MODULE CurrentModule,
|
IN PLDR_MODULE CurrentModule,
|
||||||
|
@ -57,7 +63,88 @@ typedef NTSTATUS STDCALL (*PPROCMOD_ENUM_ROUTINE)
|
||||||
|
|
||||||
/* PROTOTYPES */
|
/* PROTOTYPES */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
NTAPI
|
||||||
|
PsaCaptureProcessesAndThreads
|
||||||
|
(
|
||||||
|
OUT PSYSTEM_PROCESSES * ProcessesAndThreads
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaWalkProcessesAndThreads
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads,
|
||||||
|
IN PPROC_ENUM_ROUTINE ProcessCallback,
|
||||||
|
IN OUT PVOID ProcessCallbackContext,
|
||||||
|
IN PTHREAD_ENUM_ROUTINE ThreadCallback,
|
||||||
|
IN OUT PVOID ThreadCallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaEnumerateProcessesAndThreads
|
||||||
|
(
|
||||||
|
IN PPROC_ENUM_ROUTINE ProcessCallback,
|
||||||
|
IN OUT PVOID ProcessCallbackContext,
|
||||||
|
IN PTHREAD_ENUM_ROUTINE ThreadCallback,
|
||||||
|
IN OUT PVOID ThreadCallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
PsaFreeCapture
|
||||||
|
(
|
||||||
|
IN PVOID Capture
|
||||||
|
);
|
||||||
|
|
||||||
|
PSYSTEM_PROCESSES
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkFirstProcess
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads
|
||||||
|
);
|
||||||
|
|
||||||
|
PSYSTEM_PROCESSES
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkNextProcess
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES CurrentProcess
|
||||||
|
);
|
||||||
|
|
||||||
|
PSYSTEM_THREADS
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkFirstThread
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES CurrentProcess
|
||||||
|
);
|
||||||
|
|
||||||
|
PSYSTEM_THREADS
|
||||||
|
FASTCALL
|
||||||
|
PsaWalkNextThread
|
||||||
|
(
|
||||||
|
IN PSYSTEM_THREADS CurrentThread
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaWalkProcesses
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads,
|
||||||
|
IN PPROC_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
PsaWalkThreads
|
||||||
|
(
|
||||||
|
IN PSYSTEM_PROCESSES ProcessesAndThreads,
|
||||||
|
IN PTHREAD_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
PsaEnumerateProcesses
|
PsaEnumerateProcesses
|
||||||
(
|
(
|
||||||
IN PPROC_ENUM_ROUTINE Callback,
|
IN PPROC_ENUM_ROUTINE Callback,
|
||||||
|
@ -65,7 +152,15 @@ PsaEnumerateProcesses
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
NTAPI
|
||||||
|
PsaEnumerateThreads
|
||||||
|
(
|
||||||
|
IN PTHREAD_ENUM_ROUTINE Callback,
|
||||||
|
IN OUT PVOID CallbackContext
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
PsaEnumerateSystemModules
|
PsaEnumerateSystemModules
|
||||||
(
|
(
|
||||||
IN PSYSMOD_ENUM_ROUTINE Callback,
|
IN PSYSMOD_ENUM_ROUTINE Callback,
|
||||||
|
@ -73,7 +168,7 @@ PsaEnumerateSystemModules
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
NTAPI
|
||||||
PsaEnumerateProcessModules
|
PsaEnumerateProcessModules
|
||||||
(
|
(
|
||||||
IN HANDLE ProcessHandle,
|
IN HANDLE ProcessHandle,
|
||||||
|
@ -81,6 +176,12 @@ PsaEnumerateProcessModules
|
||||||
IN OUT PVOID CallbackContext
|
IN OUT PVOID CallbackContext
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* The user must define these functions. They are called by PSAPI to allocate
|
||||||
|
memory. This allows PSAPI to be called from any environment */
|
||||||
|
void *PsaiMalloc(SIZE_T size);
|
||||||
|
void *PsaiRealloc(void *ptr, SIZE_T size);
|
||||||
|
void PsaiFree(void *ptr);
|
||||||
|
|
||||||
/* MACROS */
|
/* MACROS */
|
||||||
#define DEFINE_DBG_MSG(__str__) "PSAPI: " __str__ "\n"
|
#define DEFINE_DBG_MSG(__str__) "PSAPI: " __str__ "\n"
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: makefile,v 1.3 2002/08/31 15:36:56 hyperion Exp $
|
# $Id: makefile,v 1.4 2003/04/02 22:09:57 hyperion Exp $
|
||||||
|
|
||||||
PATH_TO_TOP = ../..
|
PATH_TO_TOP = ../..
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@ TARGET_SDKLIBS = ntdll.a kernel32.a
|
||||||
|
|
||||||
TARGET_CFLAGS = -I./include -Wall
|
TARGET_CFLAGS = -I./include -Wall
|
||||||
|
|
||||||
|
TARGET_LFLAGS = -nostartfiles -nostdlib
|
||||||
|
|
||||||
TARGET_BASE = 0x68F70000
|
TARGET_BASE = 0x68F70000
|
||||||
|
|
||||||
TARGET_OBJECTS = \
|
TARGET_OBJECTS = \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: malloc.c,v 1.3 2002/08/31 17:11:24 hyperion Exp $
|
/* $Id: malloc.c,v 1.4 2003/04/02 22:09:57 hyperion Exp $
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT: None
|
* COPYRIGHT: None
|
||||||
|
@ -9,6 +9,8 @@
|
||||||
* PROGRAMMER: KJK::Hyperion <noog@libero.it>
|
* PROGRAMMER: KJK::Hyperion <noog@libero.it>
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
* 10/06/2002: Created
|
* 10/06/2002: Created
|
||||||
|
* 12/02/2003: malloc and free renamed to PsaiMalloc and PsaiFree,
|
||||||
|
* for better reusability
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
|
@ -46,17 +48,17 @@ PVOID STDCALL MemAlloc
|
||||||
return pBuf;
|
return pBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *malloc(size_t size)
|
void *PsaiMalloc(SIZE_T size)
|
||||||
{
|
{
|
||||||
return MemAlloc(NULL, NULL, size);
|
return MemAlloc(NULL, NULL, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *realloc(void *ptr, size_t size)
|
void *PsaiRealloc(void *ptr, SIZE_T size)
|
||||||
{
|
{
|
||||||
return MemAlloc(NULL, ptr, size);
|
return MemAlloc(NULL, ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void free(void *ptr)
|
void PsaiFree(void *ptr)
|
||||||
{
|
{
|
||||||
MemAlloc(NULL, ptr, 0);
|
MemAlloc(NULL, ptr, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: win32.c,v 1.5 2003/02/02 19:26:08 hyperion Exp $
|
/* $Id: win32.c,v 1.6 2003/04/02 22:09:57 hyperion Exp $
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
@ -143,7 +143,7 @@ typedef struct _ENUM_PROCESSES_CONTEXT
|
||||||
/* callback routine */
|
/* callback routine */
|
||||||
NTSTATUS STDCALL EnumProcessesCallback
|
NTSTATUS STDCALL EnumProcessesCallback
|
||||||
(
|
(
|
||||||
IN PSYSTEM_PROCESS_INFORMATION CurrentProcess,
|
IN PSYSTEM_PROCESSES CurrentProcess,
|
||||||
IN OUT PVOID CallbackContext
|
IN OUT PVOID CallbackContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -165,7 +165,7 @@ NTSTATUS STDCALL EnumProcessesCallback
|
||||||
}
|
}
|
||||||
|
|
||||||
/* exported interface */
|
/* exported interface */
|
||||||
/*
|
/*!
|
||||||
@brief Enumerate the process identifiers of the currently active processes
|
@brief Enumerate the process identifiers of the currently active processes
|
||||||
|
|
||||||
@param lpidProcess Array that receives the list of process identifiers
|
@param lpidProcess Array that receives the list of process identifiers
|
||||||
|
@ -194,7 +194,11 @@ BOOL STDCALL EnumProcesses
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enumerate the process ids */
|
/* enumerate the process ids */
|
||||||
nErrCode = PsaEnumerateProcesses(&EnumProcessesCallback, &epcContext);
|
nErrCode = PsaEnumerateProcesses
|
||||||
|
(
|
||||||
|
&EnumProcessesCallback,
|
||||||
|
&epcContext
|
||||||
|
);
|
||||||
|
|
||||||
*lpcbNeeded = (cb - epcContext.nCount) * sizeof(DWORD);
|
*lpcbNeeded = (cb - epcContext.nCount) * sizeof(DWORD);
|
||||||
|
|
||||||
|
@ -492,7 +496,7 @@ DWORD FASTCALL internalGetMappedFileName(
|
||||||
nBufSize = nSize * sizeof(WCHAR);
|
nBufSize = nSize * sizeof(WCHAR);
|
||||||
|
|
||||||
/* allocate the memory */
|
/* allocate the memory */
|
||||||
pmsnName = malloc(nBufSize + offsetof(MEMORY_SECTION_NAME, NameBuffer));
|
pmsnName = PsaiMalloc(nBufSize + offsetof(MEMORY_SECTION_NAME, NameBuffer));
|
||||||
|
|
||||||
if(pmsnName == NULL)
|
if(pmsnName == NULL)
|
||||||
{
|
{
|
||||||
|
@ -527,7 +531,7 @@ DWORD FASTCALL internalGetMappedFileName(
|
||||||
#if 0
|
#if 0
|
||||||
#else
|
#else
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pmsnName);
|
PsaiFree(pmsnName);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -546,7 +550,7 @@ DWORD FASTCALL internalGetMappedFileName(
|
||||||
#if 0
|
#if 0
|
||||||
#else
|
#else
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pmsnName);
|
PsaiFree(pmsnName);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(pmsnName->SectionFileName.Length < nSize)
|
if(pmsnName->SectionFileName.Length < nSize)
|
||||||
|
@ -572,7 +576,7 @@ DWORD FASTCALL internalGetMappedFileName(
|
||||||
#if 0
|
#if 0
|
||||||
#else
|
#else
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pmsnName);
|
PsaiFree(pmsnName);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(strAnsi.Length < nSize)
|
if(strAnsi.Length < nSize)
|
||||||
|
@ -589,7 +593,7 @@ DWORD FASTCALL internalGetMappedFileName(
|
||||||
}
|
}
|
||||||
__finally
|
__finally
|
||||||
{
|
{
|
||||||
free(pmsnName);
|
PsaiFree(pmsnName);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -715,7 +719,7 @@ NTSTATUS STDCALL GetModuleInformationCallback
|
||||||
UNICODE_STRING wstrUnicodeBuf;
|
UNICODE_STRING wstrUnicodeBuf;
|
||||||
|
|
||||||
/* allocate the local buffer */
|
/* allocate the local buffer */
|
||||||
pwcUnicodeBuf = malloc(pwstrSource->Length);
|
pwcUnicodeBuf = PsaiMalloc(pwstrSource->Length);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
__try
|
__try
|
||||||
|
@ -767,7 +771,7 @@ NTSTATUS STDCALL GetModuleInformationCallback
|
||||||
__finally
|
__finally
|
||||||
{
|
{
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pwcUnicodeBuf);
|
PsaiFree(pwcUnicodeBuf);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* success */
|
/* success */
|
||||||
|
@ -775,7 +779,7 @@ NTSTATUS STDCALL GetModuleInformationCallback
|
||||||
|
|
||||||
exitWithStatus:
|
exitWithStatus:
|
||||||
/* free the buffer */
|
/* free the buffer */
|
||||||
free(pwcUnicodeBuf);
|
PsaiFree(pwcUnicodeBuf);
|
||||||
return nErrCode;
|
return nErrCode;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue