mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 15:18:33 +00:00
178 lines
4.9 KiB
C
178 lines
4.9 KiB
C
/*
|
|
* PROJECT: ReactOS kernel-mode tests
|
|
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
|
* PURPOSE: Kernel-Mode Test Suite Process Notification Routines test
|
|
* PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
|
|
*/
|
|
|
|
#include <kmt_test.h>
|
|
|
|
//#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
static
|
|
VOID
|
|
NTAPI
|
|
CreateProcessNotifyRoutine(
|
|
IN HANDLE ParentId,
|
|
IN HANDLE ProcessId,
|
|
IN BOOLEAN Create)
|
|
{
|
|
ok_irql(PASSIVE_LEVEL);
|
|
if (!Create)
|
|
ok_eq_pointer(ProcessId, PsGetCurrentProcessId());
|
|
else
|
|
ok(ProcessId != PsGetCurrentProcessId(),
|
|
"ProcessId %p equals current\n", ProcessId);
|
|
DPRINT("%s(%p, %p, %d)\n", __FUNCTION__, ParentId, ProcessId, Create);
|
|
}
|
|
|
|
static
|
|
VOID
|
|
TestCreateProcessNotify(VOID)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(NULL, TRUE);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(NULL, FALSE);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(NULL, TRUE);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(NULL, TRUE);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, TRUE);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, FALSE);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
/* TODO: test whether the callback is notified on process creation */
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, TRUE);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine, TRUE);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
/* TODO: register the same routine twice */
|
|
/* TODO: register more than the maximum number of notifications */
|
|
}
|
|
|
|
static
|
|
VOID
|
|
NTAPI
|
|
CreateThreadNotifyRoutine(
|
|
IN HANDLE ProcessId,
|
|
IN HANDLE ThreadId,
|
|
IN BOOLEAN Create)
|
|
{
|
|
ok_irql(PASSIVE_LEVEL);
|
|
if (!Create)
|
|
{
|
|
ok_eq_pointer(ProcessId, PsGetCurrentProcessId());
|
|
ok_eq_pointer(ThreadId, PsGetCurrentThreadId());
|
|
}
|
|
else
|
|
{
|
|
ok(ThreadId != PsGetCurrentThreadId(),
|
|
"ThreadId %p equals current\n", ThreadId);
|
|
}
|
|
DPRINT("%s(%p, %p, %d)\n", __FUNCTION__, ProcessId, ThreadId, Create);
|
|
}
|
|
|
|
static
|
|
VOID
|
|
TestCreateThreadNotify(VOID)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = PsRemoveCreateThreadNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetCreateThreadNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsRemoveCreateThreadNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsRemoveCreateThreadNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsRemoveCreateThreadNotifyRoutine(CreateThreadNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetCreateThreadNotifyRoutine(CreateThreadNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
/* TODO: test whether the callback is notified on thread creation */
|
|
|
|
Status = PsRemoveCreateThreadNotifyRoutine(CreateThreadNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsRemoveCreateThreadNotifyRoutine(CreateThreadNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
/* TODO: register the same routine twice */
|
|
/* TODO: register more than the maximum number of notifications */
|
|
}
|
|
|
|
static
|
|
VOID
|
|
NTAPI
|
|
LoadImageNotifyRoutine(
|
|
IN PUNICODE_STRING FullImageName OPTIONAL,
|
|
IN HANDLE ProcessId,
|
|
IN PIMAGE_INFO ImageInfo)
|
|
{
|
|
ok_irql(PASSIVE_LEVEL);
|
|
DPRINT("%s('%wZ', %p, %p)\n", __FUNCTION__, FullImageName, ProcessId, ImageInfo);
|
|
}
|
|
|
|
static
|
|
VOID
|
|
TestLoadImageNotify(VOID)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = PsRemoveLoadImageNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetLoadImageNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsRemoveLoadImageNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsRemoveLoadImageNotifyRoutine(NULL);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsRemoveLoadImageNotifyRoutine(LoadImageNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
Status = PsSetLoadImageNotifyRoutine(LoadImageNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
/* TODO: test whether the callback is notified on image load */
|
|
|
|
Status = PsRemoveLoadImageNotifyRoutine(LoadImageNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_SUCCESS);
|
|
|
|
Status = PsRemoveLoadImageNotifyRoutine(LoadImageNotifyRoutine);
|
|
ok_eq_hex(Status, STATUS_PROCEDURE_NOT_FOUND);
|
|
|
|
/* TODO: register the same routine twice */
|
|
/* TODO: register more than the maximum number of notifications */
|
|
}
|
|
|
|
START_TEST(PsNotify)
|
|
{
|
|
TestCreateProcessNotify();
|
|
TestCreateThreadNotify();
|
|
TestLoadImageNotify();
|
|
}
|