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

📄 test1394.cpp

📁 基于IEEE 1394总线的图像采集及处理系统软件技术研究
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        // time this will be set to anything but 0 (SUCCESS)
        dwRet = ERROR_INSUFFICIENT_BUFFER;
    }
    else 
	{

        dwRet = GetLastError();
 //       TRACE(TL_ERROR, (hWnd, "Error = 0x%x\r\n", dwRet));
    }

	if(bAutoAlloc)
		LocalFree(pGetLocalHostInfo);//释放

Exit_GetLocalHostInfo:

//    TRACE(TL_TRACE, (hWnd, "Exit GetLocalHostInformation = %d\r\n", dwRet));
    return(dwRet);
}

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.)
						);
	//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设备句柄

		// init the event (auto-reset type)
		mOverlapped.hEvent = ::CreateEvent(NULL ,FALSE ,FALSE ,NULL); 
		if ( mOverlapped.hEvent == NULL ) 
		{
			Status = STATUS_NO_MEMORY;
			Close();
		} 
		else 
		{
/*
			// now get version info
			VHPD_DRIVER_INFO info;
			Status = GetDriverInfo(&info);//得到驱动信息
			if ( Status != STATUS_SUCCESS ) {
				// failed
				Close();
			} else {
				mCheckedBuildDetected = (info.Flags&VHPD_INFOFLAG_CHECKED_BUILD) ? TRUE : FALSE;
				mDemoVersionDetected = (info.Flags&VHPD_INFOFLAG_DEMO_VERSION) ? TRUE : FALSE;
                //版本比较
				// now check the API version
				// currently used version must match to the driver installed
				if ( info.IFVersion != VHPD_IF_VERSION ) {
					// wrong version
					Status = STATUS_VERSION_MISMATCH;
					Close();
				} else {
					// success
					Status = STATUS_SUCCESS;
				} // check API version
			} // get version info*/
			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 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 + -