cca6867c创建于 2019年12月23日历史提交
// Driver.c: This file contains the driver entry points and callbacks.

#include <driver.h>
#include "driver.tmh"

// Declares Windows 10 TraceLogger provider here.
TRACELOGGING_DEFINE_PROVIDER(
	g_hAmtPtpDeviceTraceProvider,
	"AmtPtpDeviceTraceProvider",
	(0x871b1e2d, 0xcc5a, 0x4ade, 0xb7, 0x4e, 0x6c, 0xf1, 0x0, 0x4e, 0xf1, 0x49));

NTSTATUS
DriverEntry(
	_In_ PDRIVER_OBJECT  DriverObject,
	_In_ PUNICODE_STRING RegistryPath
)
{
	WDF_DRIVER_CONFIG config;
	NTSTATUS status;
	WDF_OBJECT_ATTRIBUTES attributes;

	// Initialize tracing
	DriverTraceInit(
		DriverObject,
		RegistryPath
	);
	
	TraceEvents(
		TRACE_LEVEL_INFORMATION, 
		TRACE_DRIVER, 
		"%!FUNC! Entry"
	);

	//
	// Register a cleanup callback so that we can call WPP_CLEANUP when
	// the framework driver object is deleted during driver unload.
	//
	WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
	attributes.EvtCleanupCallback = AmtPtpDeviceEvtDriverContextCleanup;

	WDF_DRIVER_CONFIG_INIT(&config,
		AmtPtpDeviceEvtDeviceAdd
	);

	status = WdfDriverCreate(DriverObject,
		RegistryPath,
		&attributes,
		&config,
		WDF_NO_HANDLE
	);

	if (!NT_SUCCESS(status)) {
		TraceEvents(
			TRACE_LEVEL_ERROR, 
			TRACE_DRIVER, 
			"%!FUNC! WdfDriverCreate failed %!STATUS!", 
			status
		);
		TraceLoggingWrite(
			g_hAmtPtpDeviceTraceProvider,
			EVENT_DRIVER_FUNCTIONAL,
			TraceLoggingString("DriverEntry", "Routine"),
			TraceLoggingString("WdfDriverCreate", "Context"),
			TraceLoggingInt32(status, "Status"),
			TraceLoggingString(EVENT_DRIVER_FUNC_SUBTYPE_CRITFAIL, EVENT_DRIVER_FUNC_SUBTYPE)
		);
		DriverTraceCleanup(DriverObject);
		return status;
	}

	TraceEvents(
		TRACE_LEVEL_INFORMATION,
		TRACE_DRIVER,
		"%!FUNC! Exit"
	);

	return status;
}

VOID
DriverTraceInit(
	_In_ PDRIVER_OBJECT  DriverObject,
	_In_ PUNICODE_STRING RegistryPath
)
{
	// Initialize WPP Tracing
	WPP_INIT_TRACING(
		DriverObject,
		RegistryPath
	);

	// Initialize TraceLogger Tracing
	TraceLoggingRegister(g_hAmtPtpDeviceTraceProvider);
}

VOID
DriverTraceCleanup(
	_In_ WDFOBJECT DriverObject
)
{
	UNREFERENCED_PARAMETER(DriverObject);

	TraceLoggingUnregister(g_hAmtPtpDeviceTraceProvider);
	// This actually directly calls WppCleanupUm() in UMDF drivers
	WPP_CLEANUP(WdfDriverWdmGetDriverObject((WDFDRIVER) Driver));
}

NTSTATUS
AmtPtpDeviceEvtDeviceAdd(
	_In_    WDFDRIVER       Driver,
	_Inout_ PWDFDEVICE_INIT DeviceInit
)
{
	NTSTATUS status = STATUS_SUCCESS;

	TraceEvents(
		TRACE_LEVEL_INFORMATION, 
		TRACE_DRIVER, 
		"%!FUNC! Entry"
	);

	TraceEvents(
		TRACE_LEVEL_INFORMATION,
		TRACE_DRIVER, 
		"%!FUNC! Set FDO driver filter"
	);

	WdfFdoInitSetFilter(DeviceInit);

	status = AmtPtpCreateDevice(
		Driver, 
		DeviceInit
	);

	TraceEvents(
		TRACE_LEVEL_INFORMATION, 
		TRACE_DRIVER, 
		"%!FUNC! Exit"
	);
	return status;
}

VOID
AmtPtpDeviceEvtDriverContextCleanup(
	_In_ WDFOBJECT DriverObject
)
{
	TraceEvents(
		TRACE_LEVEL_INFORMATION, 
		TRACE_DRIVER, 
		"%!FUNC! Entry"
	);

	//
	// Stop WPP Tracing
	//
	DriverTraceCleanup(DriverObject);
}