?? driver.cpp
字號:
#include "Driver.h"
/************************************************************************
* 函數名稱:DriverEntry
* 功能描述:初始化驅動程序,定位和申請硬件資源,創建內核對象
* 參數列表:
pDriverObject:從I/O管理器中傳進來的驅動對象
pRegistryPath:驅動程序在注冊表的中的路徑
* 返回 值:返回初始化驅動狀態
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
KdPrint(("DriverA:Enter DriverEntry\n"));
//注冊其他驅動調用函數入口
pDriverObject->DriverUnload = HelloWDMUnload;
pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
for (int i = 0; i < arraysize(pDriverObject->MajorFunction); ++i)
pDriverObject->MajorFunction[i] = HelloWDMDispatchAny;
pDriverObject->MajorFunction[IRP_MJ_POWER] = HelloWDMPower;
pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
KdPrint(("DriverA:Leave DriverEntry\n"));
return STATUS_SUCCESS;
}
#pragma LOCKEDCODE
VOID OnTimerDpc( IN PKDPC pDpc,
IN PVOID pContext,
IN PVOID SysArg1,
IN PVOID SysArg2 )
{
PDEVICE_OBJECT pDevObj = (PDEVICE_OBJECT)pContext;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
PIRP currentPendingIRP = pdx->currentPendingIRP;
KdPrint(("DriverA:complete IRP_MJ_READ irp!\n"));
//設置完成狀態為STATUS_CANCELLED
currentPendingIRP->IoStatus.Status = STATUS_SUCCESS;
currentPendingIRP->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( currentPendingIRP, IO_NO_INCREMENT );
}
/************************************************************************
* 函數名稱:CreateDevice
* 功能描述:初始化設備對象
* 參數列表:
pDriverObject:從I/O管理器中傳進來的驅動對象
PhysicalDeviceObject:從I/O管理器中傳進來的物理設備對象
* 返回 值:返回初始化狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
PAGED_CODE();
KdPrint(("DriverA:Enter AddDevice\n"));
NTSTATUS status;
PDEVICE_OBJECT fdo;
//創建設備名稱
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDeviceA");
//創建設備
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&fdo);
if( !NT_SUCCESS(status))
return status;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
pdx->fdo = fdo;
pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
pdx->ustrDeviceName = devName;
// KeInitializeTimer( &pdx->pollingTimer );
// KeInitializeDpc( &pdx->pollingDPC,
// OnTimerDpc,
// (PVOID) fdo );
//創建符號鏈接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\DriverA");
pdx->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink(&(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName);
if( !NT_SUCCESS(status))
{
IoDeleteSymbolicLink(&pdx->ustrSymLinkName);
status = IoCreateSymbolicLink(&symLinkName,&devName);
if( !NT_SUCCESS(status))
{
return status;
}
}
fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
KdPrint(("DriverA:Leave AddDevice\n"));
return STATUS_SUCCESS;
}
/************************************************************************
* 函數名稱:HelloDDKUnload
* 功能描述:負責驅動程序的卸載操作
* 參數列表:
pDriverObject:驅動對象
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
VOID HelloWDMUnload (IN PDRIVER_OBJECT pDriverObject)
{
PAGED_CODE();
KdPrint(("DriverA:Enter DriverUnload\n"));
KdPrint(("DriverA:Leave DriverUnload\n"));
}
///////////////////////////////////////////////////////////////////////////////
#pragma LOCKEDCODE // make no assumptions about pageability of dispatch fcns
NTSTATUS HelloWDMDispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp)
{ // DispatchAny
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
#if DBG
static 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",
};
UCHAR type = stack->MajorFunction;
if (type >= arraysize(irpname))
KdPrint(("DriverA - Unknown IRP, major type %X\n", type));
else
KdPrint(("DriverA - %s\n", irpname[type]));
#endif
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return status;
} // DispatchAny
/*
#pragma PAGEDCODE
NTSTATUS HelloWDMRead(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("DriverA:Enter A Read\n"));
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("DriverA:Leave A Read\n"));
return status;
}
#pragma PAGEDCODE
NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("DriverA:Enter A DispatchRoutine\n"));
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("DriverA:Leave A DispatchRoutine\n"));
return status;
}
#pragma PAGEDCODE
NTSTATUS HelloWDMCreate(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("DriverA:Enter A Create\n"));
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("DriverA:Leave A Create\n"));
return status;
}
#pragma PAGEDCODE
NTSTATUS HelloWDMClose(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("DriverA:Enter A Close\n"));
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("DriverA:Leave A Close\n"));
return status;
}
#pragma PAGEDCODE
NTSTATUS HelloWDMDeviceIOControl(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
KdPrint(("Enter DriverA DeviceIOControl\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = ntStatus;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave DriverA DeviceIOControl\n"));
return ntStatus;
}
//Power code
#pragma PAGEDCODE
NTSTATUS HelloWDMPower(IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PAGED_CODE();
KdPrint(("DriverA:Enter HelloWDMDispatchPower\n"));
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) =
{
HandleWaitWake, // IRP_MN_WAIT_WAKE
HandlePowerSeq, // IRP_MN_POWER_SEQUENCE
HandleSetPower, // IRP_MN_SET_POWER
HandleQueryPower, // IRP_MN_QUERY_POWER
};
ULONG fcn = stack->MinorFunction;
if (fcn >= arraysize(fcntab))
{ // 未知的子功能代碼
status = DefaultPnpHandler(pdx, Irp); // some function we don't know about
return status;
}
status = (*fcntab[fcn])(pdx, Irp);
KdPrint(("DriverA:Leave HelloWDMDispatchPower\n"));
return status;
}
NTSTATUS HandleQueryPower( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
KdPrint(("DriverA:Enter HandleQueryPower\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
IoCopyCurrentIrpStackLocationToNext(Irp);
PoStartNextPowerIrp(Irp);
ntStatus = PoCallDriver( pdx -> NextStackDevice, Irp);
if(ntStatus == STATUS_PENDING)
{
IoMarkIrpPending(Irp);
}
KdPrint(("DriverA:Leave HandleQueryPower\n"));
return ntStatus;
}
NTSTATUS HandleSetPower( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
KdPrint(("DriverA:Enter HandleSetPower\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
switch(stack -> Parameters.Power.Type)
{
case SystemPowerState:
switch(stack -> Parameters.Power.State.SystemState)
{
case PowerSystemWorking:
//resume1:
//goto resume1;
break;
case PowerSystemSleeping3:
break;
case PowerSystemHibernate:
break;
default:
break;
}
break;
case DevicePowerState:
break;
default:
break;
}
PoStartNextPowerIrp(Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
KdPrint(("DriverA:Leave HandleSetPower\n"));
return STATUS_SUCCESS;
}
NTSTATUS HandleWaitWake( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
KdPrint(("DriverA:Enter HandleWaitWake\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
KdPrint(("DriverA:Leave HandleWaitWake\n"));
return ntStatus;
}
NTSTATUS HandlePowerSeq( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
KdPrint(("DriverA:Enter HandlePowerSeq\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
KdPrint(("DriverA:Leave HandlePowerSeq\n"));
return ntStatus;
}
/************************************************************************
* 函數名稱:DefaultPnpHandler
* 功能描述:對PNP IRP進行缺省處理
* 參數列表:
pdx:設備對象的擴展
Irp:從IO請求包
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx, PIRP Irp)
{
PAGED_CODE();
KdPrint(("DriverA:Enter DefaultPnpHandler\n"));
IoSkipCurrentIrpStackLocation(Irp);
KdPrint(("DriverA:Leave DefaultPnpHandler\n"));
return IoCallDriver(pdx->NextStackDevice, Irp);
}
/************************************************************************
* 函數名稱:HandleRemoveDevice
* 功能描述:對IRP_MN_REMOVE_DEVICE IRP進行處理
* 參數列表:
fdo:功能設備對象
Irp:從IO請求包
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx, PIRP Irp)
{
PAGED_CODE();
KdPrint(("DriverA:Enter HandleRemoveDevice\n"));
Irp->IoStatus.Status = STATUS_SUCCESS;
NTSTATUS status = STATUS_SUCCESS;
// NTSTATUS status = DefaultPnpHandler(pdx, Irp);
IoDeleteSymbolicLink(&(UNICODE_STRING)pdx->ustrSymLinkName);
//調用IoDetachDevice()把fdo從設備棧中脫開:
if (pdx->NextStackDevice)
IoDetachDevice(pdx->NextStackDevice);
//刪除fdo:
IoDeleteDevice(pdx->fdo);
KdPrint(("DriverA:Leave HandleRemoveDevice\n"));
return status;
}
/************************************************************************
* 函數名稱:HelloWDMPnp
* 功能描述:對即插即用IRP進行處理
* 參數列表:
fdo:功能設備對象
Irp:從IO請求包
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PAGED_CODE();
KdPrint(("DriverA:Enter Pnp\n"));
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) =
{
DefaultPnpHandler, // IRP_MN_START_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_REMOVE_DEVICE
HandleRemoveDevice, // IRP_MN_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_CANCEL_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_CANCEL_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_DEVICE_RELATIONS
DefaultPnpHandler, // IRP_MN_QUERY_INTERFACE
DefaultPnpHandler, // IRP_MN_QUERY_CAPABILITIES
DefaultPnpHandler, // IRP_MN_QUERY_RESOURCES
DefaultPnpHandler, // IRP_MN_QUERY_RESOURCE_REQUIREMENTS
DefaultPnpHandler, // IRP_MN_QUERY_DEVICE_TEXT
DefaultPnpHandler, // IRP_MN_FILTER_RESOURCE_REQUIREMENTS
DefaultPnpHandler, //
DefaultPnpHandler, // IRP_MN_READ_CONFIG
DefaultPnpHandler, // IRP_MN_WRITE_CONFIG
DefaultPnpHandler, // IRP_MN_EJECT
DefaultPnpHandler, // IRP_MN_SET_LOCK
DefaultPnpHandler, // IRP_MN_QUERY_ID
DefaultPnpHandler, // IRP_MN_QUERY_PNP_DEVICE_STATE
DefaultPnpHandler, // IRP_MN_QUERY_BUS_INFORMATION
DefaultPnpHandler, // IRP_MN_DEVICE_USAGE_NOTIFICATION
DefaultPnpHandler, // IRP_MN_SURPRISE_REMOVAL
};
ULONG fcn = stack->MinorFunction;
if (fcn >= arraysize(fcntab))
{ // unknown function
status = DefaultPnpHandler(pdx, Irp); // some function we don't know about
return status;
} // unknown function
#if DBG
static char* fcnname[] =
{
"IRP_MN_START_DEVICE",
"IRP_MN_QUERY_REMOVE_DEVICE",
"IRP_MN_REMOVE_DEVICE",
"IRP_MN_CANCEL_REMOVE_DEVICE",
"IRP_MN_STOP_DEVICE",
"IRP_MN_QUERY_STOP_DEVICE",
"IRP_MN_CANCEL_STOP_DEVICE",
"IRP_MN_QUERY_DEVICE_RELATIONS",
"IRP_MN_QUERY_INTERFACE",
"IRP_MN_QUERY_CAPABILITIES",
"IRP_MN_QUERY_RESOURCES",
"IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
"IRP_MN_QUERY_DEVICE_TEXT",
"IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
"",
"IRP_MN_READ_CONFIG",
"IRP_MN_WRITE_CONFIG",
"IRP_MN_EJECT",
"IRP_MN_SET_LOCK",
"IRP_MN_QUERY_ID",
"IRP_MN_QUERY_PNP_DEVICE_STATE",
"IRP_MN_QUERY_BUS_INFORMATION",
"IRP_MN_DEVICE_USAGE_NOTIFICATION",
"IRP_MN_SURPRISE_REMOVAL",
};
KdPrint(("PNP Request (%s)\n", fcnname[fcn]));
#endif // DBG
status = (*fcntab[fcn])(pdx, Irp);
KdPrint(("DriverA:Leave Pnp\n"));
return status;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -