⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 root.c

📁 ddk wizard for vc programe
💻 C
字号:
/*
[!output PROJECT_NAME].c

Author: <your name>
Last Updated: 2003-11-07

This file is generated by SevenCat's DDK Wizard

*/
#include <ntddk.h>

#include "[!output PROJECT_NAME].h"


#if DBG
#define dprintf DbgPrint
#else
#define dprintf
#endif

#define kprintf DbgPrint

#define NT_DEVICE_NAME	L"\\Device\\[!output DDK_NAME]"
#define DOS_DEVICE_NAME L"\\DosDevices\\[!output DDK_NAME]"



NTSTATUS [!output DDK_NAME]DispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);

NTSTATUS [!output DDK_NAME]DispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);

NTSTATUS [!output DDK_NAME]DispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);

VOID [!output DDK_NAME]Unload(IN PDRIVER_OBJECT DriverObject);

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS ntStatus;
	PDEVICE_OBJECT DeviceObject = NULL;
	UNICODE_STRING ntDeviceName, dosDeviceName;
	PDEVICE_EXTENSION DeviceExtension;
	BOOLEAN	fSymbolicLink = FALSE;

	dprintf("[!output DDK_NAME] DriverEntry: %S\n", RegistryPath->Buffer);

	//
	// A real driver would:
	//
	//     1. Report it's resources (IoReportResourceUsage)
	//
	//     2. Attempt to locate the device(s) it supports

	//
	// OK, we've claimed our resources & found our h/w, so create
	// a device and initialize stuff...
	//

	RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME);

	//
	// Create an EXCLUSIVE device, i.e. only 1 thread at a time can send
	// i/o requests.
	//

	ntStatus = IoCreateDevice(
		DriverObject,
		sizeof(DEVICE_EXTENSION), // DeviceExtensionSize
		&ntDeviceName, // DeviceName
		FILE_DEVICE_[!output DDK_UPPER_NAME], // DeviceType
		0, // DeviceCharacteristics
		TRUE, // Exclusive
		&DeviceObject // [OUT]
		);

	if (!NT_SUCCESS(ntStatus))
	{
		dprintf("[!output DDK_NAME] IoCreateDevice=0x%x\n", ntStatus);
		goto __failed;
	}

	DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;

	//
	// Set up synchronization objects, state info,, etc.
	//

	//
	// Create a symbolic link that Win32 apps can specify to gain access
	// to this driver/device
	//

	RtlInitUnicodeString(&dosDeviceName, DOS_DEVICE_NAME);

	ntStatus = IoCreateSymbolicLink(&dosDeviceName, &ntDeviceName);

	if (!NT_SUCCESS(ntStatus))
	{
		dprintf("[!output DDK_NAME] IoCreateSymbolicLink=0x%x\n", ntStatus);
		goto __failed;
	}

	fSymbolicLink = TRUE;

	//
	// Create dispatch points for device control, create, close.
	//

	DriverObject->MajorFunction[IRP_MJ_CREATE]         = [!output DDK_NAME]DispatchCreate;
	DriverObject->MajorFunction[IRP_MJ_CLOSE]          = [!output DDK_NAME]DispatchClose;
	DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = [!output DDK_NAME]DispatchDeviceControl;
	DriverObject->DriverUnload                         = [!output DDK_NAME]Unload;

	if (!NT_SUCCESS(ntStatus))
	{
		goto __failed;
	}

	return ntStatus;

__failed:

	if (fSymbolicLink)
	{
		IoDeleteSymbolicLink(&dosDeviceName);
	}

	if (DeviceObject)
	{
		IoDeleteDevice(DeviceObject);
	}

	return ntStatus;
}

NTSTATUS [!output DDK_NAME]DispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
	NTSTATUS ntStatus;

	Irp->IoStatus.Status = STATUS_SUCCESS;
	Irp->IoStatus.Information = 0;

	dprintf("[!output DDK_NAME] IRP_MJ_CREATE\n");

	ntStatus = Irp->IoStatus.Status;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	return ntStatus;
}

NTSTATUS [!output DDK_NAME]DispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
	NTSTATUS ntStatus;

	Irp->IoStatus.Status = STATUS_SUCCESS;
	Irp->IoStatus.Information = 0;

	dprintf("[!output DDK_NAME] IRP_MJ_CLOSE\n");

	ntStatus = Irp->IoStatus.Status;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	return ntStatus;
}

NTSTATUS [!output DDK_NAME]DispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
	NTSTATUS ntStatus;
	PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
	PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
	PVOID lpInOutBuffer;
	ULONG nInBufferSize, nOutBufferSize, dwIoControlCode;

	Irp->IoStatus.Status = STATUS_SUCCESS;
	Irp->IoStatus.Information = 0;

	//
	// Get the pointer to the input/output buffer and it's length
	//

	lpInOutBuffer = Irp->AssociatedIrp.SystemBuffer;
	nInBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
	nOutBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;

	dprintf("[!output DDK_NAME] IRP_MJ_DEVICE_CONTROL\n");

	dwIoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;

	switch (dwIoControlCode)
	{
	case IOCTL_[!output DDK_UPPER_NAME]_HELLO:
		{
			//
			// Some app is saying hello
			//

			break;
		}

	default:
		Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;

		dprintf("[!output DDK_NAME] unknown IRP_MJ_DEVICE_CONTROL\n");

		break;
	}

	//
	// DON'T get cute and try to use the status field of
	// the irp in the return status.  That IRP IS GONE as
	// soon as you call IoCompleteRequest.
	//

	ntStatus = Irp->IoStatus.Status;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	//
	// We never have pending operation so always return the status code.
	//

	return ntStatus;
}

VOID [!output DDK_NAME]Unload(IN PDRIVER_OBJECT DriverObject)
{
	UNICODE_STRING dosDeviceName;

	//
	// Free any resources
	//

	//
	// Delete the symbolic link
	//

	RtlInitUnicodeString(&dosDeviceName, DOS_DEVICE_NAME);

	IoDeleteSymbolicLink(&dosDeviceName);

	//
	// Delete the device object
	//

	IoDeleteDevice(DriverObject->DeviceObject);

	dprintf("[!output DDK_NAME] unloaded\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -