亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? test_pnpeventdlg.cpp

?? 《windows驅(qū)動(dòng)開發(fā)程序XP》(武安河)的驅(qū)動(dòng)開發(fā)書籍源代碼
?? CPP
字號(hào):
// Test_PnPEventDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Test_PnPEvent.h"
#include "Test_PnPEventDlg.h"

#include <setupapi.h>
#include <winioctl.h>

#include "..\PnPEventioctl.h"
#include "..\PnPEventDeviceinterface.h"	// Has class GUID definition
GUID ClassGuid = PnPEventDevice_CLASS_GUID;

// This function is found in module OpenByIntf.cpp
HANDLE OpenByInterface(GUID* pClassGuid, DWORD instance, PDWORD pError);

GUID GUID_INTERFACE_PNPEVENT = PnPEventDevice_CLASS_GUID;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTest_PnPEventDlg dialog

CTest_PnPEventDlg::CTest_PnPEventDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTest_PnPEventDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTest_PnPEventDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_hInterfaceNotification = NULL;
	m_hHandleNotification = NULL;
	m_hDevice = INVALID_HANDLE_VALUE;
}
CTest_PnPEventDlg::~CTest_PnPEventDlg()
{							// CTestDlg::CTestDlg
	if (m_hInterfaceNotification)
		UnregisterDeviceNotification(m_hInterfaceNotification);
	if (m_hHandleNotification)
		UnregisterDeviceNotification(m_hHandleNotification);
	if (m_hDevice != INVALID_HANDLE_VALUE)
		CloseHandle(m_hDevice);
}							// CTestDlg::CTestDlg

void CTest_PnPEventDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTest_PnPEventDlg)
	DDX_Control(pDX, IDC_SENDEVENT, m_Sendevent);
	DDX_Control(pDX, IDC_EVENTS, m_Events);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTest_PnPEventDlg, CDialog)
	//{{AFX_MSG_MAP(CTest_PnPEventDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DEVICECHANGE()
	ON_BN_CLICKED(IDC_SENDEVENT, OnSendEvent)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest_PnPEventDlg message handlers

BOOL CTest_PnPEventDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	DEV_BROADCAST_DEVICEINTERFACE filter;
	filter.dbcc_size = sizeof(filter);
	filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
	filter.dbcc_classguid = GUID_INTERFACE_PNPEVENT;
	m_hInterfaceNotification = RegisterDeviceNotification(GetSafeHwnd(), &filter, DEVICE_NOTIFY_WINDOW_HANDLE);

//	EnumerateExistingDevices(&GUID_INTERFACE_PNPEVENT);
	DWORD Error;
	m_hDevice = OpenByInterface( &ClassGuid, 0, &Error);

	if (m_hDevice == INVALID_HANDLE_VALUE)
		{
			MessageBox("設(shè)備打不開", "錯(cuò)誤", MB_OK | MB_ICONHAND);
			return TRUE;
		}

	DEV_BROADCAST_HANDLE filter1 = {0};
	filter1.dbch_size = sizeof(filter1);
	filter1.dbch_devicetype = DBT_DEVTYP_HANDLE;
	filter1.dbch_handle = m_hDevice;
	m_hHandleNotification = RegisterDeviceNotification(GetSafeHwnd(), &filter1, DEVICE_NOTIFY_WINDOW_HANDLE);
	
	m_Sendevent.EnableWindow(TRUE);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTest_PnPEventDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTest_PnPEventDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

VOID CTest_PnPEventDlg::EnumerateExistingDevices(const GUID* guid)
{
	HDEVINFO info = SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
	if (info == INVALID_HANDLE_VALUE) return;

	SP_INTERFACE_DEVICE_DATA ifdata;
	ifdata.cbSize = sizeof(ifdata);
	DWORD devindex;
	for (devindex = 0; SetupDiEnumDeviceInterfaces(info, NULL, guid, devindex, &ifdata); ++devindex)
	{	// for each device
		DWORD needed;
		SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &needed, NULL);

		PSP_INTERFACE_DEVICE_DETAIL_DATA detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
		if (!detail) continue;
		detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
		if (!SetupDiGetDeviceInterfaceDetail(info, &ifdata, detail, needed, NULL, NULL))
		{						// can't get detail info
			free((PVOID) detail);
			continue;
		}						// can't get detail info

		CString devname = detail->DevicePath;
		free((PVOID) detail);
		OnNewDevice(devname, guid);
	}	// for each device

	SetupDiDestroyDeviceInfoList(info);

}

///////////////////////////////////////////////////////////////////////////////

BOOL CTest_PnPEventDlg::HandleDeviceChange(DWORD evtype, PDEV_BROADCAST_DEVICEINTERFACE dip)
{
	CString devname = dip->dbcc_name;
	CString msg;

	switch (evtype)
	{	// process device interface notification

	case DBT_DEVICEARRIVAL:
		OnNewDevice(devname, &dip->dbcc_classguid);
		break;

	case DBT_DEVICEREMOVECOMPLETE:
		{	// DBT_DEVICEREMOVECOMPLETE
			msg.Format("Device %s removed", (LPCTSTR) devname);
			m_Events.AddString(msg);
			break;
		}	// DBT_DEVICEREMOVECOMPLETE

	}	// process device interface notification
	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////


BOOL CTest_PnPEventDlg::HandleDeviceChange(DWORD evtype, PDEV_BROADCAST_HANDLE dhp)
{
	CString msg;

	if (dhp->dbch_handle != m_hDevice)
		return TRUE;	// notification for some other handle

	switch (evtype)
	{	// process handle notification

	case DBT_DEVICEQUERYREMOVE:
		msg.Format("DBT_DEVICEQUERYREMOVE");
		m_Events.AddString(msg);
		if (MessageBox("同意刪除設(shè)備嗎?", "刪除查詢", MB_YESNO) != IDYES)
			return BROADCAST_QUERY_DENY;
		MessageBox("關(guān)閉設(shè)備句柄");
		if (m_hHandleNotification)
			UnregisterDeviceNotification(m_hHandleNotification);
		m_hHandleNotification = NULL;
		if (m_hDevice != INVALID_HANDLE_VALUE)
			CloseHandle(m_hDevice);
		m_hDevice = INVALID_HANDLE_VALUE;
		m_Sendevent.EnableWindow(FALSE);
		break;

	case DBT_DEVICEREMOVEPENDING:
		msg.Format("DBT_DEVICEREMOVEPENDING");
		m_Events.AddString(msg);
		break;

	case DBT_DEVICEQUERYREMOVEFAILED:
		msg.Format("DBT_DEVICEQUERYREMOVEFAILED");
		m_Events.AddString(msg);
		break;

	case DBT_CUSTOMEVENT:
		msg.Format("DBT_CUSTOMEVENT");
		m_Events.AddString(msg);
		break;

	}	// process handle notification

	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
BOOL CTest_PnPEventDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
	if (!dwData) return TRUE;

	_DEV_BROADCAST_HDR* p = (_DEV_BROADCAST_HDR*) dwData;

	if (p->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
		return HandleDeviceChange(nEventType, (PDEV_BROADCAST_DEVICEINTERFACE) p);
	else if (p->dbch_devicetype == DBT_DEVTYP_HANDLE)
		return HandleDeviceChange(nEventType, (PDEV_BROADCAST_HANDLE) p);
	else
		return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
VOID CTest_PnPEventDlg::OnNewDevice(const CString& devname, const GUID* guid)
{
	CString msg;

	if (m_hDevice != INVALID_HANDLE_VALUE)
	{	// only supports 1 instance
		msg.Format("This test program can only handle one instance of PNPEVENT at a time.\n"
			"Therefore, the arrival of a new instance named \n%s is being ignored.",
			(LPCTSTR) devname);
		MessageBox(msg, "Warning", MB_OK | MB_ICONEXCLAMATION);
		return;
	}	// only supports 1 instance

	msg.Format("Device %s arrived", (LPCTSTR) devname);
	m_Events.AddString(msg);

//	DWORD Error;
//	m_hDevice = OpenByInterface( &ClassGuid, 0, &Error);

	msg = devname;

	msg.SetAt(2, '.');

	m_hDevice = CreateFile(msg, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

	if (m_hDevice == INVALID_HANDLE_VALUE)
		{
			MessageBox("設(shè)備打不開", "錯(cuò)誤", MB_OK | MB_ICONHAND);
			return;
		}

	DEV_BROADCAST_HANDLE filter = {0};
	filter.dbch_size = sizeof(filter);
	filter.dbch_devicetype = DBT_DEVTYP_HANDLE;
	filter.dbch_handle = m_hDevice;
	m_hHandleNotification = RegisterDeviceNotification(GetSafeHwnd(), &filter, DEVICE_NOTIFY_WINDOW_HANDLE);
	
	m_Sendevent.EnableWindow(TRUE);
}

void CTest_PnPEventDlg::OnSendEvent() 
{
	DWORD junk;
	if (m_hDevice == INVALID_HANDLE_VALUE) return;
	DeviceIoControl(m_hDevice, PNPEVENT_IOCTL_800, NULL, 0, NULL, 0, &junk, NULL);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区人| 成人午夜电影小说| 蜜桃传媒麻豆第一区在线观看| 麻豆精品在线看| 国产一区二区不卡在线| 波多野结衣在线一区| 91视频免费播放| 99re热这里只有精品免费视频 | 精品福利av导航| 国产日韩欧美麻豆| 亚洲综合色成人| 国产麻豆视频一区二区| 国产精品白丝av| 一本色道久久综合亚洲aⅴ蜜桃 | 国产成人av一区二区三区在线观看| 欧美美女一区二区在线观看| 日韩精品中文字幕一区二区三区| 久久久国产午夜精品| 亚洲视频每日更新| 成人蜜臀av电影| 97se亚洲国产综合在线| 欧美一级片在线观看| 国产精品每日更新在线播放网址| 日本不卡视频在线| 日韩一区二区电影网| 国产精品久久久久9999吃药| 日韩福利电影在线| 91天堂素人约啪| 精品国产91九色蝌蚪| 丝袜脚交一区二区| 91在线观看高清| 9191精品国产综合久久久久久| 中文字幕在线观看一区二区| 国产一区二区在线看| 欧美三级在线播放| 1区2区3区精品视频| 另类的小说在线视频另类成人小视频在线| 99精品一区二区三区| 欧美一级日韩免费不卡| 亚洲v日本v欧美v久久精品| 国产在线精品一区二区夜色| 91麻豆精品91久久久久同性| 国产精品久久久久久久蜜臀| 国产乱人伦偷精品视频免下载 | 亚洲欧洲精品一区二区三区| 久久er99热精品一区二区| 欧美女孩性生活视频| 亚洲乱码日产精品bd| aaa欧美色吧激情视频| 精品欧美乱码久久久久久 | 久久久99久久| 久久国产精品72免费观看| 欧美视频精品在线观看| 成人免费一区二区三区视频 | 国产精品久久久久精k8| 国产成人免费在线观看不卡| 久久婷婷综合激情| 免费在线观看一区二区三区| 国产成人av电影在线观看| 91视频精品在这里| 一区二区视频在线| 91色综合久久久久婷婷| 亚洲一线二线三线视频| 在线观看亚洲精品| 午夜久久电影网| 制服丝袜激情欧洲亚洲| 美腿丝袜亚洲三区| 欧美精品一区二区三区四区| 久久国产精品99久久人人澡| 亚洲精品一区二区三区99| 成人免费看黄yyy456| 一区二区三区不卡在线观看| 欧洲一区在线电影| 午夜精品久久一牛影视| 欧美刺激午夜性久久久久久久| 麻豆91精品91久久久的内涵| 久久久久久夜精品精品免费| 国产91精品露脸国语对白| 国产精品青草综合久久久久99| 91色在线porny| 亚洲va欧美va国产va天堂影院| 欧美一卡二卡在线| 国产一区欧美一区| 97精品久久久午夜一区二区三区| 久久日韩精品一区二区五区| 色婷婷久久久久swag精品| 狠狠色狠狠色综合| 亚洲国产精品久久不卡毛片 | 亚洲mv大片欧洲mv大片精品| 国产欧美一区二区精品性色| 91精品欧美久久久久久动漫| 色综合久久久久综合| 国产成人久久精品77777最新版本| 亚洲v日本v欧美v久久精品| 国产精品色眯眯| 久久亚洲欧美国产精品乐播| 欧美日韩在线不卡| 在线观看日韩毛片| 国产精品久久久久久久久免费桃花| 69久久99精品久久久久婷婷| 色网站国产精品| 成人高清视频免费观看| 国产一区在线不卡| 免费精品视频在线| 午夜精品久久一牛影视| 亚洲午夜久久久久久久久电影网 | 国产精品一级在线| 日本va欧美va瓶| 天天操天天干天天综合网| 一区二区三区高清| 亚洲精品成人悠悠色影视| 国产精品三级电影| 欧美激情一区在线| 国产欧美日本一区二区三区| 久久综合国产精品| 欧美变态tickling挠脚心| 欧美一区日韩一区| 337p亚洲精品色噜噜| 91精品国产综合久久久久久| 欧美男女性生活在线直播观看| 欧美日韩一卡二卡三卡 | 亚洲小少妇裸体bbw| 亚洲欧洲日韩一区二区三区| 亚洲天堂网中文字| 国产精品高清亚洲| 亚洲女与黑人做爰| 一区二区三区视频在线观看| 亚洲在线观看免费视频| 亚洲.国产.中文慕字在线| 偷拍一区二区三区| 日本欧美加勒比视频| 美洲天堂一区二卡三卡四卡视频 | 日韩美女主播在线视频一区二区三区| 欧美日本在线一区| 欧美一区二区大片| 久久九九全国免费| 国产精品国产三级国产普通话三级| 国产精品入口麻豆原神| 一区二区三区在线免费观看 | 久久av中文字幕片| 成人av资源站| 欧美日韩一区小说| 亚洲精品在线观看视频| 欧美国产激情一区二区三区蜜月| 亚洲丝袜自拍清纯另类| 性做久久久久久| 国产一区二三区| 成人久久视频在线观看| 欧美这里有精品| 日韩美女视频一区二区在线观看| 久久综合国产精品| 亚洲综合丁香婷婷六月香| 久久精品久久99精品久久| 床上的激情91.| 欧美久久久久久久久久| 久久久久久日产精品| 一区二区三区在线视频免费观看 | 国产精品中文字幕日韩精品| 成人午夜电影久久影院| 欧美蜜桃一区二区三区| 国产日韩欧美精品综合| 三级一区在线视频先锋 | 久久99国内精品| 91丝袜高跟美女视频| 精品免费一区二区三区| 亚洲你懂的在线视频| 久久99精品国产| 欧美日韩国产欧美日美国产精品| 欧美国产日本视频| 蜜臀av在线播放一区二区三区| aaa欧美日韩| 国产婷婷色一区二区三区在线| 午夜影院久久久| 一本到一区二区三区| 久久久久99精品国产片| 日韩精品一区第一页| 91在线视频网址| 亚洲精品在线观| 免费人成精品欧美精品 | 日韩美女视频在线| 夜色激情一区二区| 成人av在线观| 国产日产欧美一区二区三区| 日韩精品一级中文字幕精品视频免费观看| 国产成人av影院| 亚洲mv在线观看| 色老汉一区二区三区| 国产精品视频你懂的| 国产一区二区精品在线观看| 日韩一区二区电影| 日韩精品一二区| 欧美日韩国产在线观看| 一个色在线综合| 色狠狠一区二区三区香蕉| 亚洲视频在线一区| av一区二区三区在线| 国产日韩精品一区二区三区在线| 久久超碰97人人做人人爱| 欧美大片在线观看| 久久国产尿小便嘘嘘尿|