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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ch375dll.c

?? CH372USB芯片的動態連接庫程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
// 這是CH372和CH375的Windows98/ME/2000/XP簡化版驅動程序, 僅供學習USB驅動開發
// 稍加修改完全可以用于其它USB芯片, 不過作者希望你是用于CH372和CH375芯片
// 2003.09.08, 2003.12.28, 2004.10.15, 2004.12.05, 2004.12.10, 2005.01.20, 2005.02.23, 2005.07.15
//****************************************
//**  Copyright  (C)  W.ch  1999-2005   **
//**  Web:  http://www.winchiphead.com  **
//****************************************
//**  DLL for USB interface chip CH375  **
//**  C, VC5.0                          **
//****************************************
//
// USB總線接口芯片CH375的應用層接口庫  V0.1
// 南京沁恒電子有限公司  作者: W.ch 2005.07
// CH375-DLL  V0.1 , Support: Ctrl/Bulk/Int
// 運行環境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH372/CH375
//

#include	<windows.h>
#include	<stdlib.h>
#include	<stdio.h>
#include	<conio.h>
#include	<setupapi.h>
#include	<winioctl.h>
#include	<dbt.h>

#include	"CH375DLL.H"

BOOL	WINAPI	DLLMain(  // 動態鏈接庫的入口
	HINSTANCE	iInstance,
	ULONG		iReason,
	LPVOID		iReserved );


ULONG	WINAPI	dllInterruptThread(  // 中斷模擬線程
	LPVOID		iParameter );


#define		mTHIS_VERSION			0x01				// 當前版本


static const GUID CH375Guid = { 0x5e7f6bdf, 0x1ce5, 0x4d78, { 0xbb, 0xcf, 0xd2, 0xc, 0x44, 0x32, 0x9f, 0x7d } };	// GUID


HANDLE				dllHandle;			// CH375設備句柄
mPCH375_INT_ROUTINE	dllIntRoutine;		// CH375中斷服務回調程序
ULONG				dllIntThreadId;		// CH375中斷模擬線程的標識符
UCHAR				dllDeviceName[128];	// CH375設備名字符串


BOOL	WINAPI	DLLMain(  // 動態鏈接庫的入口
	HINSTANCE	iInstance,
	ULONG		iReason,
	LPVOID		iReserved )
{
	return( TRUE );
}

ULONG	WINAPI	dllInterruptThread(  // 中斷模擬線程,每個需要中斷功能的CH375設備都具有一個線程
	LPVOID		iParameter )
{
	HANDLE				dllHandleOverlap;	// CH375設備句柄,可以執行重疊操作
	HANDLE				mEvent;
	BOOL				mResult;
	ULONG				mLength;
	mWIN32_COMMAND		mCommand;
	OVERLAPPED			mOverlapped;
	mPCH375_INT_ROUTINE	mIntRoutine;
	dllHandleOverlap = CreateFile( (PUCHAR)iParameter, GENERIC_READ | GENERIC_WRITE,  // 打開設備,支持重疊操作
									FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
	if ( dllHandleOverlap != INVALID_HANDLE_VALUE ) {  // 打開設備成功
		mEvent = CreateEvent( NULL, TRUE, FALSE, NULL );  // 初始化完成事件
		while ( dllIntRoutine ) {  // 等待中斷直到取消
			mCommand.mFunction = mPipeInterUp;  // 從中斷數據上傳管道讀取數據
			mCommand.mLength = mCH375_PKT_LEN_SHORT;  // 數據長度
			mLength = sizeof( mWIN32_COMMAND );  // 緩沖區長度,數據長度加上命令結構頭的長度
			mOverlapped.Internal = 0;
			mOverlapped.InternalHigh = 0;
			mOverlapped.Offset = 0;
			mOverlapped.OffsetHigh = 0;
			mOverlapped.hEvent = mEvent;
			ResetEvent( mEvent );  // 初始化完成事件
			mResult = DeviceIoControl( dllHandleOverlap, IOCTL_CH375_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, &mOverlapped );
			if ( mResult == FALSE && GetLastError() == ERROR_IO_PENDING )  // 操作未完成,即暫時無中斷
				mResult = GetOverlappedResult( dllHandleOverlap, &mOverlapped, &mLength, TRUE );  // 等待中斷
			if ( mResult ) {  // 發生中斷事件則調用中斷服務回調程序
				if ( mIntRoutine = dllIntRoutine ) mIntRoutine( & mCommand.mBuffer[0] );  // 發生中斷事件則調用中斷服務回調程序,將當前的中斷特征數據提供給中斷服務程序
			}
			if ( mResult == FALSE && dllIntRoutine ) Sleep( 5 );  // 出錯則延時5毫秒
		}
		CloseHandle( mEvent );
		CloseHandle( dllHandleOverlap );  // 關閉句柄
	}
	dllIntThreadId = 0;
	ExitThread( 0 );  // 退出
	return( 0 );
}

ULONG	WINAPI	CH375GetVersion( )  // 獲得DLL版本號,返回版本號
{
	return( mTHIS_VERSION );
}

PVOID	WINAPI	CH375GetDeviceName(  // 返回指向CH375設備名稱的緩沖區,出錯則返回NULL
	ULONG			iIndex )  // 指定CH375設備序號,0對應第一個設備
{
	UCHAR								mBuffer[1024];
	LPGUID								mClassGuid;
	HDEVINFO							mDevInfo;
	SP_INTERFACE_DEVICE_DATA			mDevIfData;
	PSP_INTERFACE_DEVICE_DETAIL_DATA	mDevIfDetail;
	mClassGuid = ( LPGUID )&CH375Guid;  // 設備類
	mDevInfo = SetupDiGetClassDevs( mClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );  // 獲得指定設備類
	if ( mDevInfo == INVALID_HANDLE_VALUE ) return( NULL );
	mDevIfData.cbSize = sizeof( mDevIfData );
	if ( !SetupDiEnumDeviceInterfaces( mDevInfo, NULL, mClassGuid, iIndex, &mDevIfData ) ) {  // 枚舉指定序號的設備
		SetupDiDestroyDeviceInfoList( mDevInfo );
		return( NULL );
	}
	mDevIfDetail = ( PSP_INTERFACE_DEVICE_DETAIL_DATA ) mBuffer;
	mDevIfDetail -> cbSize = sizeof( SP_INTERFACE_DEVICE_DETAIL_DATA );
	if ( !SetupDiGetDeviceInterfaceDetail( mDevInfo, &mDevIfData, mDevIfDetail, 1020, NULL, NULL ) ) {  // 獲得設備詳細信息
		SetupDiDestroyDeviceInfoList( mDevInfo );
		return( NULL );
	}
	lstrcpy( dllDeviceName, mDevIfDetail -> DevicePath );  // 設備名稱
	SetupDiDestroyDeviceInfoList( mDevInfo );
	return( dllDeviceName );
}

HANDLE	WINAPI	CH375OpenDevice(  // 打開CH375設備,返回句柄,出錯則無效
	ULONG			iIndex )  // 指定CH375設備序號,0對應第一個設備
{
	dllHandle = CreateFile( CH375GetDeviceName( iIndex ), GENERIC_READ | GENERIC_WRITE,  // 打開設備,不支持重疊操作
						FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );  // 共享
	return( dllHandle );
}

VOID	WINAPI	CH375CloseDevice(  // 關閉CH375設備
	ULONG			iIndex )  // 指定CH375設備序號,必須是0
{
	dllIntRoutine = NULL;  // 取消中斷服務程序
	if ( dllIntThreadId ) CH375SetIntRoutine( 0, NULL );  // 等待線程結束
	CloseHandle( dllHandle );  // 關閉句柄
}

ULONG	WINAPI	CH375DriverCommand(  // 直接傳遞命令給驅動程序,出錯則返回0,否則返回數據長度
	ULONG			iIndex,  // 指定CH375設備序號,必須是0
	mPWIN32_COMMAND	ioCommand )  // 命令結構的指針
// 該程序在調用后返回數據長度,并且仍然返回命令結構,如果是讀操作,則數據返回在命令結構中,
// 返回的數據長度在操作失敗時為0,操作成功時為整個命令結構的長度,例如讀一個字節,則返回mWIN32_COMMAND_HEAD+1,
// 命令結構在調用前,分別提供:管道號或者命令功能代碼,存取數據的長度(可選),數據(可選)
// 命令結構在調用后,分別返回:操作狀態代碼,后續數據的長度(可選),
//   操作狀態代碼是由WINDOWS定義的代碼,可以參考NTSTATUS.H,
//   后續數據的長度是指讀操作返回的數據長度,數據存放在隨后的緩沖區中,對于寫操作一般為0
{
	ULONG	mLength;
	mLength = ioCommand -> mLength + mWIN32_COMMAND_HEAD;  // 數據緩沖區長度加上命令結構頭的長度
	if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, ioCommand, mLength, ioCommand, mLength, &mLength, NULL ) )
		return( mLength );  // 返回數據長度
	else return( 0 );  // 出錯
}

BOOL	WINAPI	CH375GetDeviceDescr(  // 讀取設備描述符
	ULONG			iIndex,  // 指定CH375設備序號,必須是0
	PVOID			oBuffer,  // 指向一個足夠大的緩沖區,用于保存描述符
	PULONG			ioLength )  // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
{
	UCHAR			mBuffer[ mMAX_COMMAND_LENGTH ];
	ULONG			mLength;
	mPWIN32_COMMAND	mpCommand;
	if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH;  // 限制長度
	mpCommand = (PVOID)mBuffer;
	mpCommand -> mFunction = mPipeDeviceCtrl;  // 通過綜合控制管道獲取USB設備描述符
	mpCommand -> mLength = sizeof( mUSB_SETUP_PKT );  // 數據長度,指寫入綜合控制管道的命令請求包的長度
	mpCommand -> mSetupPkt.mUspReqType = 0x80;  // 請求類型
	mpCommand -> mSetupPkt.mUspRequest = 0x06;  // 請求碼 USB_REQUEST_GET_DESCRIPTOR
	mpCommand -> mSetupPkt.mUspValueLow = 0x00;  // 描述符索引
	mpCommand -> mSetupPkt.mUspValueHigh = 0x01;  // 設備描述符 USB_DEVICE_DESCRIPTOR_TYPE
	mpCommand -> mSetupPkt.mUspIndex = 0x0000;  // 索引參數
	mpCommand -> mSetupPkt.mLength = (USHORT)*ioLength;  // 需要讀取的數據長度
	mLength = *ioLength + mWIN32_COMMAND_HEAD;  // 緩沖區長度,數據長度加上命令結構頭的長度
	if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, mpCommand, sizeof( mWIN32_COMMAND ), mpCommand, mLength, &mLength, NULL ) ) {
		*ioLength = mpCommand -> mLength;  //  返回實際讀取數據的長度
		CopyMemory( oBuffer, & mpCommand -> mBuffer[0], *ioLength );  // 返回讀取的數據
		return( TRUE );
	}
	else {  // 出錯
		*ioLength = 0;
		return( FALSE );
	}
}

BOOL	WINAPI	CH375GetConfigDescr(  // 讀取配置描述符
	ULONG			iIndex,  // 指定CH375設備序號,必須是0
	PVOID			oBuffer,  // 指向一個足夠大的緩沖區,用于保存描述符
	PULONG			ioLength )  // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
{
	UCHAR			mBuffer[ mMAX_COMMAND_LENGTH ];
	ULONG			mLength;
	mPWIN32_COMMAND	mpCommand;
	if ( *ioLength > mMAX_BUFFER_LENGTH ) *ioLength = mMAX_BUFFER_LENGTH;  // 限制長度
	mpCommand = (PVOID)mBuffer;
	mpCommand -> mFunction = mPipeDeviceCtrl;  // 通過綜合控制管道獲取USB設備描述符
	mpCommand -> mLength = sizeof( mUSB_SETUP_PKT );  // 數據長度,指寫入綜合控制管道的命令請求包的長度
	mpCommand -> mSetupPkt.mUspReqType = 0x80;  // 請求類型
	mpCommand -> mSetupPkt.mUspRequest = 0x06;  // 請求碼 USB_REQUEST_GET_DESCRIPTOR
	mpCommand -> mSetupPkt.mUspValueLow = 0x00;  // 描述符索引
	mpCommand -> mSetupPkt.mUspValueHigh = 0x02;  // 設備描述符 USB_CONFIG_DESCRIPTOR_TYPE
	mpCommand -> mSetupPkt.mUspIndex = 0x0000;  // 索引參數
	mpCommand -> mSetupPkt.mLength = (USHORT)*ioLength;  // 需要讀取的數據長度
	mLength = *ioLength + mWIN32_COMMAND_HEAD;  // 緩沖區長度,數據長度加上命令結構頭的長度
	if ( DeviceIoControl( dllHandle, IOCTL_CH375_COMMAND, mpCommand, sizeof( mWIN32_COMMAND ), mpCommand, mLength, &mLength, NULL ) ) {
		*ioLength = mpCommand -> mLength;  //  返回實際讀取數據的長度
		CopyMemory( oBuffer, & mpCommand -> mBuffer[0], *ioLength );  // 返回讀取的數據
		return( TRUE );
	}
	else {  // 出錯
		*ioLength = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲小说春色综合另类电影| 成人综合在线网站| 国产成人综合在线观看| 色悠久久久久综合欧美99| 日韩欧美国产wwwww| 一区二区三区在线视频播放| 久久电影网站中文字幕| 在线观看日韩av先锋影音电影院| 精品国产区一区| 午夜国产精品一区| 色88888久久久久久影院野外| 久久久久久久电影| 免费观看30秒视频久久| 欧美午夜精品电影| 亚洲免费av高清| 不卡一二三区首页| 久久精品一区八戒影视| 老色鬼精品视频在线观看播放| 欧美人体做爰大胆视频| 亚洲精品欧美激情| 99精品黄色片免费大全| 国产精品女同互慰在线看| 国产成人免费在线观看| www国产成人免费观看视频 深夜成人网| 一区二区三区在线观看视频| zzijzzij亚洲日本少妇熟睡| 亚洲国产精品二十页| 国产一区高清在线| 久久综合成人精品亚洲另类欧美 | 欧美亚洲国产bt| 1区2区3区欧美| 9i看片成人免费高清| 国产精品国产三级国产普通话三级| 国产一区视频在线看| 久久久久久久久一| 国产成人av一区二区| 欧美经典三级视频一区二区三区| 国产精品99久| 国产精品美女久久久久久久久 | 国产视频一区二区在线| 国产精品12区| 自拍偷自拍亚洲精品播放| 99精品桃花视频在线观看| 亚洲视频狠狠干| 欧美日本乱大交xxxxx| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩免费电影网站| 成人午夜电影网站| 亚洲精品久久久蜜桃| 欧美男人的天堂一二区| 麻豆一区二区三| 国产精品免费网站在线观看| 色综合久久久久| 日韩中文字幕不卡| 久久老女人爱爱| 91麻豆福利精品推荐| 五月综合激情日本mⅴ| 精品卡一卡二卡三卡四在线| 成人激情图片网| 亚洲综合清纯丝袜自拍| 日韩一区二区免费高清| 成人小视频在线观看| 一区二区在线观看免费视频播放| 欧美日韩国产综合一区二区三区 | 国产激情一区二区三区| 亚洲欧美视频一区| 欧美二区三区的天堂| 国产成人精品亚洲日本在线桃色 | 美女性感视频久久| 中文成人综合网| 欧美精品在线一区二区| 国产精品88888| 亚洲电影第三页| 精品捆绑美女sm三区| 日本黄色一区二区| 国产一区二区久久| 亚洲午夜三级在线| 久久一二三国产| 欧美私模裸体表演在线观看| 国产乱子伦一区二区三区国色天香| 综合在线观看色| xvideos.蜜桃一区二区| 91黄色免费版| 成人午夜短视频| 久久超碰97中文字幕| 一区二区三国产精华液| 中文字幕乱码久久午夜不卡 | caoporm超碰国产精品| 全部av―极品视觉盛宴亚洲| 国产精品盗摄一区二区三区| 欧美一级精品在线| 欧美性生活大片视频| av不卡在线播放| 国产一区二区三区日韩| 日本不卡一区二区| 亚洲第一激情av| 亚洲精品ww久久久久久p站| 国产午夜精品福利| 久久一留热品黄| 欧美成人r级一区二区三区| 欧美日韩aaa| 欧美性xxxxxxxx| 91麻豆成人久久精品二区三区| 国产精品中文字幕日韩精品| 天堂一区二区在线| 亚洲午夜三级在线| 亚洲综合在线五月| 亚洲国产精品视频| 亚洲综合精品久久| 亚洲综合网站在线观看| 伊人婷婷欧美激情| 亚洲一区二区三区四区在线观看 | 欧美日韩一级大片网址| 色婷婷精品大视频在线蜜桃视频| av一区二区不卡| 成人aaaa免费全部观看| 成人午夜大片免费观看| 成人国产精品免费网站| 不卡一区在线观看| 色偷偷成人一区二区三区91| 99在线精品观看| 91福利在线导航| 欧美日韩一区二区三区在线| 欧美日韩国产综合久久| 日韩视频免费观看高清完整版在线观看 | 亚洲高清三级视频| 日韩国产高清影视| 久久99精品久久久久婷婷| 国产成人精品免费一区二区| 国产jizzjizz一区二区| gogo大胆日本视频一区| 日本丶国产丶欧美色综合| 欧美色图12p| 日韩欧美精品三级| 国产肉丝袜一区二区| 综合激情成人伊人| 日韩国产欧美在线视频| 国内外成人在线视频| av不卡免费在线观看| 欧美在线观看禁18| 精品日韩在线一区| 国产精品久久久久影院| 亚洲一区二区三区在线看| 久久 天天综合| 91在线播放网址| 91精品欧美一区二区三区综合在 | 九九视频精品免费| 国产jizzjizz一区二区| 欧美吞精做爰啪啪高潮| 精品久久久久久久久久久久久久久 | 看电视剧不卡顿的网站| av综合在线播放| 日韩小视频在线观看专区| 国产精品久久久久aaaa樱花| 亚洲国产wwwccc36天堂| 国产成人亚洲精品狼色在线| 欧洲色大大久久| 久久婷婷一区二区三区| 亚洲一区二区在线免费看| 国产美女在线精品| 欧美在线观看一区二区| 久久精品视频一区| 天天综合色天天综合| aaa欧美日韩| 久久精品一区八戒影视| 三级在线观看一区二区| 丁香另类激情小说| 欧美变态凌虐bdsm| 天堂成人国产精品一区| www.久久精品| 久久久久久久久久久久电影| 婷婷开心久久网| 色婷婷综合久色| 国产精品美女久久久久高潮| 久久精品国产**网站演员| 欧洲一区二区av| 亚洲视频你懂的| 国产99久久久久| 26uuu色噜噜精品一区| 日韩国产一区二| 欧美日精品一区视频| 亚洲日本在线视频观看| 国产**成人网毛片九色 | 蜜臀av国产精品久久久久| 色综合久久久久久久久久久| 国产精品区一区二区三区 | 亚洲6080在线| 欧美性生交片4| 一区二区三区日韩精品视频| 99视频精品免费视频| 欧美国产亚洲另类动漫| 国产乱码精品一区二区三区忘忧草| 日韩欧美在线123| 老司机午夜精品| 日韩视频一区二区三区在线播放 | 中文字幕在线不卡视频| 成人精品视频一区| 国产精品精品国产色婷婷| 成人一区二区三区| 国产精品国产自产拍高清av王其 |