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

📄 hellowdm.cpp

📁 windows下的一个驱动程序, 实现电源管理的几个状态的简单处理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -