📄 hellowdm.cpp
字号:
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))
{ // 未知的子功能代码
status = DefaultPnpHandler(pdx, Irp); // some function we don't know about
return status;
}
#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(("Leave HelloWDMPnp\n"));
return status;
}
/************************************************************************
* 函数名称:HelloWDMDispatchRoutine
* 功能描述:对缺省IRP进行处理
* 参数列表:
fdo:功能设备对象
Irp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PAGED_CODE();
KdPrint(("Enter HelloWDMDispatchRoutine\n"));
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0; // no bytes xfered
IoCompleteRequest( Irp, IO_NO_INCREMENT );
KdPrint(("Leave HelloWDMDispatchRoutine\n"));
return STATUS_SUCCESS;
}
/************************************************************************
* 函数名称:HelloWDMUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
DriverObject:驱动对象
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject)
{
PAGED_CODE();
KdPrint(("Enter HelloWDMUnload\n"));
KdPrint(("Leave HelloWDMUnload\n"));
}
NTSTATUS HelloWDMDispatchPower(IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PAGED_CODE();
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(("Leave HelloWDMDispatchPower\n"));
return status;
}
NTSTATUS HandleQueryPower( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG port1 = 0x0;
USHORT value2 = 0x0;
port1 = 0x80;
value2= 0x03;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
IoCopyCurrentIrpStackLocationToNext(Irp);
port1 = 0x80;
value2= 0x04;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
PoStartNextPowerIrp(Irp);
port1 = 0x80;
value2= 0x05;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
ntStatus = PoCallDriver( pdx -> NextStackDevice, Irp);
port1 = 0x80;
value2= 0x06;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
if(ntStatus == STATUS_PENDING)
{
port1 = 0x80;
value2= 0x07;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
IoMarkIrpPending(Irp);
port1 = 0x80;
value2= 0x08;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
}
port1 = 0x80;
value2= 0x09;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
return ntStatus;
}
NTSTATUS HandleSetPower( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
ULONG port1 = 0x0;
USHORT value2 = 0x0;
switch(stack -> Parameters.Power.Type)
{
case SystemPowerState:
switch(stack -> Parameters.Power.State.SystemState)
{
case PowerSystemWorking:
port1 = 0x80;
value2= 0x89;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
//resume1:
//goto resume1;
break;
case PowerSystemSleeping3:
port1 = 0x80;
value2= 0x33;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
break;
case PowerSystemHibernate:
port1 = 0x80;
value2= 0x77;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
break;
default:
break;
}
break;
case DevicePowerState:
port1 = 0x80;
value2= 0xDD;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
break;
default:
break;
}
PoStartNextPowerIrp(Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS HandleWaitWake( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG port1 = 0x0;
USHORT value2 = 0x0;
port1 = 0x80;
value2= 0x01;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
return ntStatus;
}
NTSTATUS HandlePowerSeq( IN PDEVICE_EXTENSION pdx, IN PIRP Irp)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG port1 = 0x0;
USHORT value2 = 0x0;
port1 = 0x80;
value2= 0x02;
WRITE_PORT_USHORT( (PUSHORT)port1, (USHORT)value2);
return ntStatus;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -