#include <ntddk.h>
#include <stdio.h>
#include <stdlib.h>
#include "helloworld.h"
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriObj, PUNICODE_STRING theRegisterPath)
{
int i = 0;
UNICODE_STRING uDevice;
UNICODE_STRING uW32Dev;
PDEVICE_OBJECT pDevObj = NULL;
NTSTATUS status;
DbgPrint(TEXT("Driver hello world"));
pDriObj->DriverUnload = DriverUnload;
//RtlInitUnicodeString(&pDriObj->DriverName, L"EmptyDriver1.w7");
RtlInitUnicodeString(&uDevice, L"\\Device\\EmptyDevice");
RtlInitUnicodeString(&uW32Dev, L"\\DosDevices\\EmptyW32Dev");
for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
pDriObj->MajorFunction[i] = IrpHandle;
}
pDriObj->MajorFunction[IRP_MJ_CREATE] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_READ] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_SCSI] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_CLEANUP] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_CLOSE] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_WRITE] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_SET_INFORMATION] = IrpDispatchRoutin;
pDriObj->MajorFunction[IRP_MJ_QUERY_INFORMATION]= IrpDispatchRoutin;
pDriObj->DriverStartIo = NULL;
pDriObj->DriverUnload = DriverUnload;
status = IoCreateDevice(pDriObj, //DriverObject
0, //DeviceExtensionSize
&uDevice, //DeviceName
FILE_DEVICE_UNKNOWN, //DeviceType
0, //DeviceCharacteristics
FALSE, //Exclusive
&pDevObj);
KdPrint(("%d", status));
if(!NT_SUCCESS(status))
{
return status;
}
if(!pDevObj)
{
return STATUS_UNEXPECTED_IO_ERROR;
}
pDevObj->Flags |= DO_DIRECT_IO;
status = IoCreateSymbolicLink(&uW32Dev, &uDevice);
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
NTSTATUS IrpDispatchRoutin(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
char * irpName[] =
{
"IRP_MJ_CREATE "
"IRP_MJ_CREATE_NAMED_PIPE "
"IRP_MJ_CLOSE "
"IRP_MJ_READ "
"IRP_MJ_WRITE "
"IRP_MJ_QUERY_INFORMATION "
"IRP_MJ_SET_INFORMATION "
"IRP_MJ_QUERY_EA "
"IRP_MJ_SET_EA "
"IRP_MJ_FLUSH_BUFFERS "
"IRP_MJ_QUERY_VOLUME_INFORMATION "
"IRP_MJ_SET_VOLUME_INFORMATION "
"IRP_MJ_DIRECTORY_CONTROL "
"IRP_MJ_FILE_SYSTEM_CONTROL "
"IRP_MJ_DEVICE_CONTROL "
"IRP_MJ_INTERNAL_DEVICE_CONTROL "
"IRP_MJ_SHUTDOWN "
"IRP_MJ_LOCK_CONTROL "
"IRP_MJ_CLEANUP "
"IRP_MJ_CREATE_MAILSLOT "
"IRP_MJ_QUERY_SECURITY "
"IRP_MJ_SET_SECURITY "
"IRP_MJ_POWER "
"IRP_MJ_SYSTEM_CONTROL "
"IRP_MJ_DEVICE_CHANGE "
"IRP_MJ_QUERY_QUOTA "
"IRP_MJ_SET_QUOTA "
"IRP_MJ_PNP "
"IRP_MJ_MAXIMUM_FUNCTION "
};
PIO_STACK_LOCATION pIoStack = IoGetCurrentIrpStackLocation(pIrp);
if(pIoStack->MajorFunction >= ARRAYSIZE(irpName))
{
KdPrint(("UnKnow Irp"));
}
else
{
KdPrint(("Irp MajorFunction : %s\n", irpName[pIoStack->MajorFunction]) );
}
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS IrpHandle(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
//设置irp操作了多少字节
pIrp->IoStatus.Information = 0;
//处理IRP
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
void DriverUnload(PDRIVER_OBJECT pDrvObj)
{
UNICODE_STRING uW32Dev;
RtlInitUnicodeString(&uW32Dev, L"\\DosDevices\\EmptyW32Dev");
DbgPrint(TEXT("deleting symbollink\n"));
IoDeleteSymbolicLink(&uW32Dev);
DbgPrint(TEXT("deleting device\n"));
IoDeleteDevice(pDrvObj->DeviceObject);
}
void DriverUnload(IN PDRIVER_OBJECT);
NTSTATUS IrpDispatchRoutin(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
NTSTATUS IrpHandle(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
# $Id$
TARGETNAME=EmptyDriver1
TARGETPATH=obj
TARGETTYPE=DRIVER
# Create browse info
#BROWSER_INFO=1
#BROWSERFILE=<some path>
# Additional defines for the C/C++ preprocessor
C_DEFINES=$(C_DEFINES)
SOURCES=HelloWorld.c