?? root.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 + -