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

📄 test1394.cpp

📁 1394测试程序
💻 CPP
字号:
// Test1394.cpp: implementation of the CTest1394 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "testapp.h"
#include "Test1394.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTest1394::CTest1394()
{
	// initialize members
	mFileHandle = NULL;
	ZeroMemory(&mOverlapped,sizeof(mOverlapped));
	InitializeCriticalSection(&mCritSect);
	mDevDetail=NULL;

	mCheckedBuildDetected = FALSE;
	mDemoVersionDetected = FALSE;
}

CTest1394::~CTest1394()
{
	// close file handle, free mDevDetail
	Close();
	// free resources
	DeleteCriticalSection(&mCritSect);
}

void CTest1394::Close()
{
	if ( mFileHandle != NULL ) {
		::CloseHandle(mFileHandle);
		mFileHandle = NULL;
	}

	if ( mOverlapped.hEvent != NULL ) {
		::CloseHandle(mOverlapped.hEvent);
		mOverlapped.hEvent = NULL;
	}

	// delete detail info if any
	if ( mDevDetail!=NULL ) {
		delete[] (char*)mDevDetail;
		mDevDetail = NULL;
	}
}

//DEL HDEVINFO CTest1394::CreateDeviceList( GUID *InterfaceGuid)
//DEL {
//DEL 	HDEVINFO h;
//DEL 
//DEL 	h = SetupDiGetClassDevs(
//DEL 				(GUID*)InterfaceGuid,									// LPGUID ClassGuid, 
//DEL 				NULL,																  // PCTSTR Enumerator, 
//DEL 				NULL,																	// HWND hwndParent, 
//DEL 				DIGCF_DEVICEINTERFACE | DIGCF_PRESENT	// DWORD Flags
//DEL 				);
//DEL 	return ( (h==INVALID_HANDLE_VALUE) ? NULL : h );
//DEL }

//DEL void CTest1394::DestroyDeviceList(HDEVINFO DeviceList)
//DEL {
//DEL 	if ( DeviceList!=NULL ) {
//DEL 		SetupDiDestroyDeviceInfoList(DeviceList);
//DEL 	}
//DEL }

DWORD CTest1394::ForceBusReset( ULONG fulFlags)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_BUS_RESET,
							&fulFlags,
							sizeof(ULONG),
							NULL,
							0,
							NULL
							);

	return Status;
}

DWORD CTest1394::GetLocalHostInfo( PGET_LOCAL_HOST_INFORMATION pGetLocalHostInfo)
{
	DWORD Status;
	Status = IoctlSync(
							IOCTL_TEST1394_GET_LOCAL_HOST_INFO,
							pGetLocalHostInfo,
							pGetLocalHostInfo->ulBufferSize,
							pGetLocalHostInfo,
							pGetLocalHostInfo->ulBufferSize,
							NULL
							);
	return Status;
}

DWORD CTest1394::SetLocalHostProperties(PSET_LOCAL_HOST_PROPERTIES pHCProps)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_SET_LOCAL_HOST_PROPERTIES,
							pHCProps,
							sizeof(SET_LOCAL_HOST_PROPERTIES),
							NULL,
							0,
							NULL
							);

	return Status;
}

DWORD CTest1394::GetNodeAddress(GET_1394_ADDRESS *GetNodeAdr)
{
	DWORD Status;
	Status = IoctlSync(
							IOCTL_TEST1394_GET_ADDR_FROM_DEVICE_OBJECT,
							GetNodeAdr,
							sizeof(GET_1394_ADDRESS),
							GetNodeAdr,
							sizeof(GET_1394_ADDRESS),
							NULL
							);

	return Status;
}

DWORD CTest1394::GetResetGenerationCount( PULONG GenerationCount)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_GET_GENERATION_COUNT,
							GenerationCount,
							sizeof(PULONG),
							GenerationCount,
							sizeof(PULONG),
							NULL
							);

	return Status;
}

DWORD CTest1394::GetSpeedBetweenDevices( PGET_MAX_SPEED_BETWEEN_DEVICES pGetMaxSpeed)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_GET_MAX_SPEED_BETWEEN_DEVICES,
							pGetMaxSpeed,
							sizeof(GET_MAX_SPEED_BETWEEN_DEVICES),
							pGetMaxSpeed,
							sizeof(GET_MAX_SPEED_BETWEEN_DEVICES),
							NULL
							);

	return Status;
}

DWORD CTest1394::IoctlSync(
					DWORD IoctlCode,
					void* InBuffer,
					DWORD InBufferSize,
					void* OutBuffer,
					DWORD OutBufferSize,
					DWORD *BytesReturned
					)
{
	DWORD Status;
	DWORD BytesRet = 0;
	BOOL succ;

	// check if the driver was opened
	if ( mFileHandle == NULL ) {
		return STATUS_DEVICE_NOT_OPEN;
	}

	// IOCTL requests must be serialized
	// because there is only one event object per instance
	EnterCriticalSection(&mCritSect);

	// call the device driver
	succ = DeviceIoControl(
						mFileHandle,        // driver handle
						IoctlCode,			// IOCTL code,驱动中的必须与应用程序中的相对应
						InBuffer,			// input buffer
						InBufferSize,       // input buffer size
						OutBuffer,     	    // output buffer
						OutBufferSize,      // output buffer size
						&BytesRet,          // number of bytes returned
						&mOverlapped		// overlapped structure (async.)
						);
/*	// call the device driver
	succ = DeviceIoControl(
						mFileHandle,        // driver handle
						IoctlCode,			// IOCTL code,驱动中的必须与应用程序中的相对应
						InBuffer,			// input buffer
						InBufferSize,       // input buffer size
						OutBuffer,     	    // output buffer
						OutBufferSize,      // output buffer size
						&BytesRet,          // number of bytes returned
						NULL		
						);*/
	//DeviceIoControl调用成功,返回值nonzero,不成功,返回值为zero,调用GetLastError得到错误描述
	if ( succ ) 
	{
		// ioctl completed successfully
		Status = STATUS_SUCCESS;//STATUS_SUCCESS 为 0 
	} 
	else 
	{
		Status = GetLastError();
		
		if ( Status == ERROR_IO_PENDING ) 
		{
			// the operation is pending, wait for completion
			succ = GetOverlappedResult(
								mFileHandle,
								&mOverlapped,
								&BytesRet,  // byte count
								TRUE        // wait flag
								);
			if ( succ ) 
			{
				// completed successfully
				Status = STATUS_SUCCESS;
			}
			else 
			{
				Status = GetLastError();
			}
		}
	}

	LeaveCriticalSection(&mCritSect);

	if ( BytesReturned != NULL ) {
		*BytesReturned = BytesRet;
	}

	return Status;
}

DWORD CTest1394::Open(int DeviceNumber, HDEVINFO DeviceList,const GUID *InterfaceGuid)
{
	DWORD Status;
	HANDLE h;
	char *Name;
	SP_DEVICE_INTERFACE_DATA	DevData;//a device interface
	DWORD len;
	BOOL succ;

	if ( mFileHandle!=NULL ) 
	{	// already open
		return STATUS_SUCCESS;
	}

	// check parameters
	if ( (DeviceList==NULL) || (InterfaceGuid==NULL) ) 
	{
		return STATUS_INVALID_FUNCTION_PARAM;
	}

	// delete old detail data if any
	if ( mDevDetail!=NULL ) 
	{
		delete[] (char*)mDevDetail;
		mDevDetail = NULL;
	}

	// enumerate the interface
	// get the device information for the given device number
	ZeroMemory(&DevData,sizeof(DevData));
	DevData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
	succ = SetupDiEnumDeviceInterfaces(DeviceList, NULL, (GUID*)InterfaceGuid, DeviceNumber, &DevData );
	if (!succ) 
	{
		Status = GetLastError();
		if ( Status==ERROR_NO_MORE_ITEMS ) 
		{
			Status = STATUS_NO_SUCH_DEV_INSTANCE;
		}
		return Status;
	}
	// get the length of the detailed information, allocate buffer
	SetupDiGetDeviceInterfaceDetail(DeviceList, &DevData, NULL, 0, &len, NULL);
	mDevDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) new char[len];	//lint !e433 !e826
	if ( mDevDetail==NULL ) 
	{
		return STATUS_MEM_ALLOC_FAILED;
	}
	// now get the  detailed device information
	ZeroMemory(mDevDetail,len);
	mDevDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
	succ = SetupDiGetDeviceInterfaceDetail(DeviceList, &DevData, mDevDetail, len, &len, NULL);
	if (!succ) 
	{
		return GetLastError();
	}
	// set device name
	Name = mDevDetail->DevicePath;

	//正式开始对驱动的操作
	// try to open the device driver
	h = ::CreateFile(
					Name,//设备名
					GENERIC_READ | GENERIC_WRITE,				// access mode
					FILE_SHARE_WRITE | FILE_SHARE_READ, // share mode
					NULL,																// security desc.
					OPEN_EXISTING,											// how to create
					FILE_FLAG_OVERLAPPED,								// file attributes
					NULL																// template file
					);
	if ( h == INVALID_HANDLE_VALUE ) 
		Status = STATUS_DEVICE_NOT_FOUND;
	else 
	{
		// save handle
		mFileHandle = h;//打开的1394设备句柄
		Status = STATUS_SUCCESS;
		//不使用OVERLAP

		// init the event (auto-reset type)
		mOverlapped.hEvent = ::CreateEvent(NULL ,FALSE ,FALSE ,NULL); 
		if ( mOverlapped.hEvent == NULL ) 
		{
			Status = STATUS_NO_MEMORY;
			Close();
		} 
		else 
		{
			Status = STATUS_SUCCESS;
		} // initialize event
	} // open device handle
	
	return Status;
}

DWORD CTest1394::SendPhyConfigPacket( PPHY_CONFIGURATION_PACKET SendPCP)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_SEND_PHY_CONFIG_PACKET,
							SendPCP,
							sizeof(PHY_CONFIGURATION_PACKET),
							NULL,
							0,
							NULL
							);

	return Status;
}

DWORD CTest1394::SetDeviceXmitProperties( PDEVICE_XMIT_PROPERTIES XmitProps)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_SET_DEVICE_XMIT_PROPERTIES,
							XmitProps,
							sizeof(DEVICE_XMIT_PROPERTIES),
							NULL,
							0,
							NULL
							);

	return Status;
}

char* CTest1394::GetDevicePathName()
{
	if ( mDevDetail!=NULL ) 
	{
		return ( mDevDetail->DevicePath );
	} 
	else 
	{
		return NULL;
	}
}

DWORD CTest1394::BusResetNotification(ULONG fulFlags)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_BUS_RESET_NOTIFICATION,
							&fulFlags,
							sizeof(ULONG),
							NULL,
							0,
							NULL
							);

	return Status;
}

DWORD CTest1394::GetDriverInfo(PVERSION_DATA DriverInfo)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_GET_DRIVER_INFO,
							NULL,
							0,
							DriverInfo,
							sizeof(VERSION_DATA),
							NULL
							);

	return Status;
}

DWORD CTest1394::GetDeviceInfoBlock(unsigned int* BlockType,
									unsigned char* BlockBuf,
									DWORD* BlockBufLength)
{
	DWORD Status;
	Status = IoctlSync(
							IOCTL_TEST1394_GET_CONFIG_INFO_BLOCK,
							BlockType,
							sizeof(unsigned int),
							BlockBuf,
							*BlockBufLength,
							BlockBufLength
							);
	return Status;
}

DWORD CTest1394::GetDeviceConfigInfo(PGet_Config_Info_Params pInfo,ULONG uBufSize)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_GET_CONFIG_INFO_PARAMS,
							NULL,
							0,
							pInfo,
							uBufSize,
							NULL
							);

	return Status;
}

DWORD CTest1394::AsyncRead(PASYNC_READ pAsyncRead,ULONG ulBufferSize)
{/*
	DWORD Status;
	
	Status = IoctlSync(
							IOCTL_TEST1394_ASYNC_READ,
							pAsyncRead,
							ulBufferSize,
							pAsyncRead,
							ulBufferSize,
							NULL
							);	
	return Status;*/
	DWORD Status;
	DWORD BytesRet = 0;
	BOOL succ;

	// check if the driver was opened
	if ( mFileHandle == NULL ) {
		return STATUS_DEVICE_NOT_OPEN;
	}
/*
	LARGE_INTEGER  litmp ;
	LONGLONG  QPart1,QPart2 ;
	double  dfMinus, dfFreq, dfTim ;

	QueryPerformanceFrequency(&litmp) ; 
	 // 获得计数器的时钟频率
	dfFreq = (double)litmp.QuadPart ;

	QueryPerformanceCounter(&litmp) ; 
	 // 获得初始值
	QPart1 = litmp.QuadPart ;
*/
	// call the device driver
	succ = DeviceIoControl(
						mFileHandle,        // driver handle
						IOCTL_TEST1394_ASYNC_READ,			// IOCTL code,驱动中的必须与应用程序中的相对应
						pAsyncRead,			// input buffer
						ulBufferSize,       // input buffer size
						pAsyncRead,     	    // output buffer
						ulBufferSize,      // output buffer size
						&BytesRet,          // number of bytes returned
						NULL		
						);/*
	QueryPerformanceCounter(&litmp) ; 
	// 获得中止值
	QPart2 = litmp.QuadPart ;

	dfMinus = (double)(QPart2 - QPart1) ;
	dfTim = dfMinus / dfFreq ;  
	// 获得对应的时间值
	CString strTime;
	strTime.Format("%f秒 \r\n", dfTim);
	PrintOut( strTime.GetBufferSetLength( strTime.GetLength() ) );
	strTime.ReleaseBuffer();*/
	//DeviceIoControl调用成功,返回值nonzero,不成功,返回值为zero,调用GetLastError得到错误描述
	if ( succ ) 
	{
		// ioctl completed successfully
		Status = STATUS_SUCCESS;//STATUS_SUCCESS 为 0 
	} 
	else 
	{
		Status = GetLastError();		
	}	
	return Status;
}

DWORD CTest1394::AsyncWrite(PASYNC_WRITE pAsyncWrite,ULONG ulBufferSize)
{
	DWORD Status;
	Status = IoctlSync(
							IOCTL_TEST1394_ASYNC_WRITE,
							pAsyncWrite,
							ulBufferSize,
							pAsyncWrite,
							ulBufferSize,
							NULL
							);		
	return Status;
}

DWORD CTest1394::AllocateAddressRange(PALLOCATE_ADDRESS_RANGE pAllocateAddressRange, ULONG ulBufferSize)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_ALLOC_ADDR_RANGE,
							pAllocateAddressRange,
							ulBufferSize,
							pAllocateAddressRange,
							ulBufferSize,
							NULL
							);
	return Status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -