mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.7 KiB
79 lines
1.7 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ixinfo.c
|
|
|
|
Abstract:
|
|
|
|
Author:
|
|
|
|
Ken Reneris (kenr) 08-Aug-1994
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "halp.h"
|
|
#include "pcmp_nt.inc"
|
|
|
|
|
|
extern ULONG HalpPerfInterruptHandler;
|
|
static HANDLE HalpProcessId = NULL;
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text(PAGE,HalpSetSystemInformation)
|
|
#endif
|
|
|
|
|
|
NTSTATUS
|
|
HalpSetSystemInformation (
|
|
IN HAL_SET_INFORMATION_CLASS InformationClass,
|
|
IN ULONG BufferSize,
|
|
IN PVOID Buffer
|
|
)
|
|
{
|
|
PAGED_CODE();
|
|
|
|
switch (InformationClass) {
|
|
case HalProfileSourceInterruptHandler:
|
|
|
|
//
|
|
// Set ISR handler for PerfVector
|
|
//
|
|
|
|
if (!(HalpFeatureBits & HAL_PERF_EVENTS)) {
|
|
return STATUS_UNSUCCESSFUL;
|
|
}
|
|
|
|
//
|
|
// Accept the interrupt handler if no other process
|
|
// has already hooked the interrupt or if we are in
|
|
// the context of the process that already hooked it.
|
|
//
|
|
|
|
if (HalpProcessId == NULL) {
|
|
HalpPerfInterruptHandler = *((PULONG) Buffer);
|
|
if (HalpPerfInterruptHandler != 0) {
|
|
HalpProcessId = PsGetCurrentProcessId();
|
|
}
|
|
} else if (HalpProcessId == PsGetCurrentProcessId()) {
|
|
HalpPerfInterruptHandler = *((PULONG) Buffer);
|
|
if (HalpPerfInterruptHandler == 0) {
|
|
HalpProcessId = NULL;
|
|
}
|
|
} else {
|
|
return STATUS_UNSUCCESSFUL;
|
|
}
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
return HaliSetSystemInformation (InformationClass, BufferSize, Buffer);
|
|
}
|