windows-nt/Source/XPSP1/NT/tools/wppconfig/rev1/km-init.tpl
2020-09-26 16:20:57 +08:00

227 lines
6.8 KiB
Smarty

`**********************************************************************`
`* This is an include template file for tracewpp preprocessor. *`
`* *`
`* Copyright 1999-2001 Microsoft Corporation. All Rights Reserved. *`
`**********************************************************************`
// template `TemplateFile`
//
// Defines a set of functions that simplifies
// kernel mode registration for tracing
//
#define WMIREG_FLAG_CALLBACK 0x80000000 // not exposed in DDK
#ifndef WPPINIT_EXPORT
# define WPPINIT_EXPORT
#endif
WPPINIT_EXPORT
NTSTATUS
WppTraceCallback(
IN UCHAR minorFunction,
IN PVOID DataPath,
IN ULONG BufferLength,
IN PVOID Buffer,
IN PVOID Context,
OUT PULONG Size
)
/*++
Routine Description:
Callback routine for IoWMIRegistrationControl.
Arguments:
Return Value:
status
Comments:
if return value is STATUS_BUFFER_TOO_SMALL and BufferLength >= 4,
then first ulong of buffer contains required size
--*/
{
WPP_PROJECT_CONTROL_BLOCK *cb = (WPP_PROJECT_CONTROL_BLOCK*)Context;
NTSTATUS status = STATUS_SUCCESS;
UNREFERENCED_PARAMETER(DataPath);
// DbgPrintEx(XX_FLTR, DPFLTR_TRACE_LEVEL,
// "%!FUNC!(%!SYSCTRL!) %p", minorFunction, Context);
*Size = 0;
switch(minorFunction)
{
case IRP_MN_REGINFO:
{
PWMIREGINFOW wmiRegInfo;
PCUNICODE_STRING regPath;
PWCHAR stringPtr;
ULONG registryPathOffset;
ULONG bufferNeeded;
UNICODE_STRING nullRegistryPath;
regPath = cb->Registration.RegistryPath;
if (regPath == NULL)
{
// No registry path specified. This is a bad thing for
// the device to do, but is not fatal
RtlInitUnicodeString(&nullRegistryPath, NULL);
regPath = &nullRegistryPath;
}
registryPathOffset = FIELD_OFFSET(WMIREGINFOW, WmiRegGuid)
+ 1 * sizeof(WMIREGGUIDW);
bufferNeeded = registryPathOffset +
regPath->Length + sizeof(USHORT);
if (bufferNeeded <= BufferLength)
{
RtlZeroMemory(Buffer, BufferLength);
wmiRegInfo = (PWMIREGINFO)Buffer;
wmiRegInfo->BufferSize = bufferNeeded;
wmiRegInfo->RegistryPath = registryPathOffset;
wmiRegInfo->GuidCount = 1;
wmiRegInfo->WmiRegGuid[0].Guid = *cb->Registration.ControlGuid;
wmiRegInfo->WmiRegGuid[0].Flags =
WMIREG_FLAG_TRACE_CONTROL_GUID | WMIREG_FLAG_TRACED_GUID;
stringPtr = (PWCHAR)((PUCHAR)Buffer + registryPathOffset);
*stringPtr++ = regPath->Length;
RtlCopyMemory(stringPtr,
regPath->Buffer,
regPath->Length);
status = STATUS_SUCCESS;
*Size = bufferNeeded;
} else {
status = STATUS_BUFFER_TOO_SMALL;
if (BufferLength >= sizeof(ULONG)) {
*((PULONG)Buffer) = bufferNeeded;
*Size = sizeof(ULONG);
}
}
break;
}
case IRP_MN_ENABLE_EVENTS:
case IRP_MN_DISABLE_EVENTS:
{
PWNODE_HEADER Wnode = (PWNODE_HEADER)Buffer;
ULONG Level;
ULONG ReturnLength ;
if (cb == NULL )
{
status = STATUS_WMI_GUID_NOT_FOUND;
break;
}
if (BufferLength >= sizeof(WNODE_HEADER)) {
status = STATUS_SUCCESS;
if (minorFunction == IRP_MN_DISABLE_EVENTS) {
cb->Control.Level = 0;
cb->Control.Flags[0] = 0;
cb->Control.Logger = 0;
} else {
TRACEHANDLE lh;
lh = (TRACEHANDLE)( Wnode->HistoricalContext );
cb->Control.Logger = lh;
if ((status = WmiQueryTraceInformation( TraceEnableLevelClass,
&Level,
sizeof(Level),
&ReturnLength,
(PVOID)Wnode)) == STATUS_SUCCESS)
{
cb->Control.Level = (UCHAR)Level;
}
status = WmiQueryTraceInformation( TraceEnableFlagsClass,
&cb->Control.Flags[0],
sizeof(cb->Control.Flags[0]),
&ReturnLength,
(PVOID)Wnode);
}
} else {
status = STATUS_INVALID_PARAMETER;
}
break;
}
case IRP_MN_ENABLE_COLLECTION:
case IRP_MN_DISABLE_COLLECTION:
{
status = STATUS_SUCCESS;
break;
}
case IRP_MN_QUERY_ALL_DATA:
case IRP_MN_QUERY_SINGLE_INSTANCE:
case IRP_MN_CHANGE_SINGLE_INSTANCE:
case IRP_MN_CHANGE_SINGLE_ITEM:
case IRP_MN_EXECUTE_METHOD:
{
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
default:
{
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
}
// DbgPrintEx(XX_FLTR, DPFLTR_TRACE_LEVEL,
// "%!FUNC!(%!SYSCTRL!) => %!status! (size = %d)", minorFunction, status, *Size);
return(status);
}
WPPINIT_EXPORT
void WppInitKm(
IN PUNICODE_STRING RegistryPath,
IN OUT WPP_REGISTRATION_BLOCK* WppReg
)
{
RegistryPath; // unused
while(WppReg) {
WPP_TRACE_CONTROL_BLOCK *cb = (WPP_TRACE_CONTROL_BLOCK*)WppReg;
WppReg -> Callback = WppTraceCallback;
WppReg -> RegistryPath = NULL;
cb -> FlagsLen = WppReg -> FlagsLen;
cb -> Level = 0;
cb -> Flags[0] = 0;
IoWMIRegistrationControl((PDEVICE_OBJECT)WppReg,
WMIREG_ACTION_REGISTER | WMIREG_FLAG_CALLBACK);
WppReg = WppReg->Next;
}
}
WPPINIT_EXPORT
void WppCleanupKm(
WPP_REGISTRATION_BLOCK* WppReg
)
{
while (WppReg) {
IoWMIRegistrationControl((PDEVICE_OBJECT)WppReg,
WMIREG_ACTION_DEREGISTER | WMIREG_FLAG_CALLBACK);
WppReg = WppReg -> Next;
}
}