?? test1394.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 + -