📄 test1394.cpp
字号:
// 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 + -