📄 test1394.cpp
字号:
// Test1394.cpp: implementation of the CTest1394 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "test1394show.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 GetLocalHostInfo)
{
DWORD Status;
// we don't support auto alloc for nLevel = 5 or 6
if (GetLocalHostInfo->nLevel == 6)
{
PGET_LOCAL_HOST_INFORMATION pGetLocalHostInformation;
PGET_LOCAL_HOST_INFO6 LocalHostInfo6;
ULONG ulBufferSize;
ULONG CsrDataLength;
ULONG CsrDataAddress;
DWORD dwRet;
// let's get the CsrDataAddress from Status. (from the dialog)
CsrDataAddress = GetLocalHostInfo->Status;
// first thing is to get the buffer size we need...
ulBufferSize = sizeof(GET_LOCAL_HOST_INFORMATION) + sizeof(GET_LOCAL_HOST_INFO6);
pGetLocalHostInformation = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
LocalHostInfo6 = (PGET_LOCAL_HOST_INFO6)&pGetLocalHostInformation->Information;
pGetLocalHostInformation->nLevel = 6;
pGetLocalHostInformation->ulBufferSize = ulBufferSize;
LocalHostInfo6->CsrBaseAddress.Off_High = INITIAL_REGISTER_SPACE_HI;
LocalHostInfo6->CsrBaseAddress.Off_Low = CsrDataAddress;
dwRet = GetLocalHostInformation(pGetLocalHostInformation,FALSE);
if (dwRet == ERROR_INSUFFICIENT_BUFFER) {
// we should have our buffer info.
// TRACE(TL_TRACE, (hWnd, "Insufficient Buffer\r\n"));
// TRACE(TL_TRACE, (hWnd, "CsrDataLength = 0x%x\r\n", LocalHostInfo6->CsrDataLength));
CsrDataLength = LocalHostInfo6->CsrDataLength;
LocalFree(pGetLocalHostInformation);
// start over with a big enough buffer
ulBufferSize = sizeof(GET_LOCAL_HOST_INFORMATION) + sizeof(GET_LOCAL_HOST_INFO6) + CsrDataLength;
pGetLocalHostInformation = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
LocalHostInfo6 = (PGET_LOCAL_HOST_INFO6)&pGetLocalHostInformation->Information;
pGetLocalHostInformation->nLevel = 6;
pGetLocalHostInformation->ulBufferSize = ulBufferSize;
LocalHostInfo6->CsrBaseAddress.Off_High = INITIAL_REGISTER_SPACE_HI;
LocalHostInfo6->CsrBaseAddress.Off_Low = CsrDataAddress;
LocalHostInfo6->CsrDataLength = CsrDataLength;
dwRet = GetLocalHostInformation( pGetLocalHostInformation,FALSE );
if (LocalHostInfo6->CsrBaseAddress.Off_Low == SPEED_MAP_LOCATION) //还有tobology map
{
PSPEED_MAP SpeedMap;
PGET_LOCAL_HOST_INFORMATION pGetTopologyMap;
PGET_LOCAL_HOST_INFO6 pTopologyInfo;
PTOPOLOGY_MAP TopologyMap;
ULONG NodeCount, i, j;
SpeedMap = (PSPEED_MAP)&LocalHostInfo6->CsrDataBuffer;
// get the node count from the topology map
pGetTopologyMap = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, sizeof(GET_LOCAL_HOST_INFO6) + 4096);
pGetTopologyMap->ulBufferSize = sizeof(GET_LOCAL_HOST_INFO6) + 4096;
pGetTopologyMap->nLevel = 6;
pTopologyInfo = (PGET_LOCAL_HOST_INFO6)&pGetTopologyMap->Information;
pTopologyInfo->CsrDataLength = 4096; //0x400;
pTopologyInfo->CsrBaseAddress.Off_High = INITIAL_REGISTER_SPACE_HI;
pTopologyInfo->CsrBaseAddress.Off_Low = TOPOLOGY_MAP_LOCATION;
dwRet = GetLocalHostInformation( pGetTopologyMap,
FALSE
);
TopologyMap = (PTOPOLOGY_MAP)&pTopologyInfo->CsrDataBuffer;
NodeCount = TopologyMap->TOP_Node_Count;
LocalFree(TopologyMap);
if (!dwRet) {
// TRACE(TL_TRACE, (hWnd, "SpeedCodes = \t"));
for (i=0; i < NodeCount; i++) {
for (j=0; j < NodeCount; j++) {
// TRACE(TL_TRACE, (hWnd, "%d\t", SpeedMap->SPD_Speed_Code[i*64+j]));
}
// TRACE(TL_TRACE, (hWnd, "\r\n\t\t"));
}
}
else {
// TRACE(TL_ERROR, (hWnd, "Error getting NodeCount\r\n"));
}
// TRACE(TL_TRACE, (hWnd, "\r\n"));
}
LocalFree(pGetLocalHostInformation);
}
else
LocalFree(pGetLocalHostInformation);
}
else
Status = GetLocalHostInformation(GetLocalHostInfo,TRUE);
return Status;
}
DWORD CTest1394::GetLocalHostInformation( PGET_LOCAL_HOST_INFORMATION GetLocalHostInfo, BOOL bAutoAlloc)
{
PGET_LOCAL_HOST_INFORMATION pGetLocalHostInfo;
DWORD dwRet, dwBytesRet;
ULONG ulBufferSize;
GetLocalHostInfo->Status = 0;
if(bAutoAlloc)
{
if (GetLocalHostInfo->nLevel == 1)
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO1);
else if (GetLocalHostInfo->nLevel == 2)
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO2);
else if (GetLocalHostInfo->nLevel == 3)
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO3);
else if (GetLocalHostInfo->nLevel == 4)
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO4);
else if (GetLocalHostInfo->nLevel == 5)
{
dwRet = ERROR_INVALID_FUNCTION;
goto Exit_GetLocalHostInfo;
// ulBufferSize = sizeof(GET_LOCAL_HOST_INFO5);
}
else if (GetLocalHostInfo->nLevel == 6)
{
dwRet = ERROR_INVALID_FUNCTION;
goto Exit_GetLocalHostInfo;
}
ulBufferSize += sizeof(GET_LOCAL_HOST_INFORMATION);
pGetLocalHostInfo = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
*pGetLocalHostInfo = *GetLocalHostInfo;
}
else
{
pGetLocalHostInfo = GetLocalHostInfo;
ulBufferSize = GetLocalHostInfo->ulBufferSize;
}
dwRet = IoctlSync(
IOCTL_TEST1394_GET_LOCAL_HOST_INFO,
pGetLocalHostInfo,
ulBufferSize,
pGetLocalHostInfo,
ulBufferSize,
NULL
);
if ((dwRet) && (!pGetLocalHostInfo->Status))
{
dwRet = ERROR_SUCCESS;
if (pGetLocalHostInfo->nLevel == 1) {
PGET_LOCAL_HOST_INFO1 LocalHostInfo1;
LocalHostInfo1 = (PGET_LOCAL_HOST_INFO1)&pGetLocalHostInfo->Information;
/* TRACE(TL_TRACE, (hWnd, "UniqueId.LowPart = 0x%x\r\n", LocalHostInfo1->UniqueId.LowPart));
TRACE(TL_TRACE, (hWnd, "UniqueId.HighPart = 0x%x\r\n", LocalHostInfo1->UniqueId.HighPart));
*/ }
else if (pGetLocalHostInfo->nLevel == 2) {
PGET_LOCAL_HOST_INFO2 LocalHostInfo2;
LocalHostInfo2 = (PGET_LOCAL_HOST_INFO2)&pGetLocalHostInfo->Information;
/* TRACE(TL_TRACE, (hWnd, "HostCapabilities = 0x%x\r\n", LocalHostInfo2->HostCapabilities));
TRACE(TL_TRACE, (hWnd, "MaxAsyncReadRequest = 0x%x\r\n", LocalHostInfo2->MaxAsyncReadRequest));
TRACE(TL_TRACE, (hWnd, "MaxAsyncWriteRequest = 0x%x\r\n", LocalHostInfo2->MaxAsyncWriteRequest));
*/ }
else if (pGetLocalHostInfo->nLevel == 3) {
PGET_LOCAL_HOST_INFO3 LocalHostInfo3;
LocalHostInfo3 = (PGET_LOCAL_HOST_INFO3)&pGetLocalHostInfo->Information;
// TRACE(TL_TRACE, (hWnd, "deciWattsSupplied = 0x%x\r\n", LocalHostInfo3->deciWattsSupplied));
// TRACE(TL_TRACE, (hWnd, "Voltage = 0x%x\r\n", LocalHostInfo3->Voltage));
}
else if (pGetLocalHostInfo->nLevel == 4) {
PGET_LOCAL_HOST_INFO4 LocalHostInfo4;
LocalHostInfo4 = (PGET_LOCAL_HOST_INFO4)&pGetLocalHostInfo->Information;
// TRACE(TL_TRACE, (hWnd, "PhysAddrMappingRoutine = 0x%x\r\n", LocalHostInfo4->PhysAddrMappingRoutine));
// TRACE(TL_TRACE, (hWnd, "Context = 0x%x\r\n", LocalHostInfo4->Context));
}
else if (pGetLocalHostInfo->nLevel == 5) {
PGET_LOCAL_HOST_INFO5 LocalHostInfo5;
LocalHostInfo5 = (PGET_LOCAL_HOST_INFO5)&pGetLocalHostInfo->Information;
// TRACE(TL_TRACE, (hWnd, "ConfigRom = 0x%x\r\n", LocalHostInfo5->ConfigRom));
// TRACE(TL_TRACE, (hWnd, "ConfigRomLength = 0x%x\r\n", LocalHostInfo5->ConfigRomLength));
}
else if (pGetLocalHostInfo->nLevel == 6) {
PGET_LOCAL_HOST_INFO6 LocalHostInfo6;
LocalHostInfo6 = (PGET_LOCAL_HOST_INFO6)&pGetLocalHostInfo->Information;
// TRACE(TL_TRACE, (hWnd, "CsrBaseAddress = 0x%x\r\n", LocalHostInfo6->CsrBaseAddress));
// TRACE(TL_TRACE, (hWnd, "CsrDataLength = 0x%x\r\n", LocalHostInfo6->CsrDataLength));
// TRACE(TL_TRACE, (hWnd, "CsrDataBuffer = 0x%x\r\n", &LocalHostInfo6->CsrDataBuffer));
if (LocalHostInfo6->CsrBaseAddress.Off_Low == SPEED_MAP_LOCATION) {
PSPEED_MAP SpeedMap;
ULONG NumNodes, i;
SpeedMap = (PSPEED_MAP)&LocalHostInfo6->CsrDataBuffer;
// TRACE(TL_TRACE, (hWnd, "SpeedMap.SPD_Length = 0x%x\r\n", SpeedMap->SPD_Length));
// TRACE(TL_TRACE, (hWnd, "SpeedMap.SPD_CRC = 0x%x\r\n", SpeedMap->SPD_CRC));
// TRACE(TL_TRACE, (hWnd, "SpeedMap.SPD_Generation = 0x%x\r\n", SpeedMap->SPD_Generation));
}
else if (LocalHostInfo6->CsrBaseAddress.Off_Low == TOPOLOGY_MAP_LOCATION) {
PTOPOLOGY_MAP TopologyMap;
ULONG i;
PSELF_ID SelfId;
PSELF_ID_MORE SelfIdMore;
BOOL bMore;
TopologyMap = (PTOPOLOGY_MAP)&LocalHostInfo6->CsrDataBuffer;
/*
TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Length = 0x%x\r\n", TopologyMap->TOP_Length));
TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_CRC = 0x%x\r\n", TopologyMap->TOP_CRC));
TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Generation = 0x%x\r\n", TopologyMap->TOP_Generation));
TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Node_Count = 0x%x\r\n", TopologyMap->TOP_Node_Count));
TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Self_ID_Count = 0x%x\r\n", TopologyMap->TOP_Self_ID_Count));
*/
for (i=0; i < TopologyMap->TOP_Self_ID_Count; i++) {
SelfId = &TopologyMap->TOP_Self_ID_Array[i];
/*
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Phys_ID = 0x%x\r\n", i, SelfId->SID_Phys_ID));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Packet_ID = 0x%x\r\n", i, SelfId->SID_Packet_ID));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Gap_Count = 0x%x\r\n", i, SelfId->SID_Gap_Count));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Link_Active = 0x%x\r\n", i, SelfId->SID_Link_Active));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Zero = 0x%x\r\n", i, SelfId->SID_Zero));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Power_Class = 0x%x\r\n", i, SelfId->SID_Power_Class));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Contender = 0x%x\r\n", i, SelfId->SID_Contender));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Delay = 0x%x\r\n", i, SelfId->SID_Delay));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Speed = 0x%x\r\n", i, SelfId->SID_Speed));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_More_Packets = 0x%x\r\n", i, SelfId->SID_More_Packets));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Initiated_Rst = 0x%x\r\n", i, SelfId->SID_Initiated_Rst));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Port3 = 0x%x\r\n", i, SelfId->SID_Port3));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Port2 = 0x%x\r\n", i, SelfId->SID_Port2));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Port1 = 0x%x\r\n", i, SelfId->SID_Port1));
*/
if (SelfId->SID_More_Packets)
bMore = TRUE;
else
bMore = FALSE;
while (bMore) {
i++;
SelfIdMore = (PSELF_ID_MORE)&TopologyMap->TOP_Self_ID_Array[i];
/*
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Phys_ID = 0x%x\r\n", i, SelfIdMore->SID_Phys_ID));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Packet_ID = 0x%x\r\n", i, SelfIdMore->SID_Packet_ID));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortA = 0x%x\r\n", i, SelfIdMore->SID_PortA));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Reserved2 = 0x%x\r\n", i, SelfIdMore->SID_Reserved2));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Sequence = 0x%x\r\n", i, SelfIdMore->SID_Sequence));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_One = 0x%x\r\n", i, SelfIdMore->SID_One));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortE = 0x%x\r\n", i, SelfIdMore->SID_PortE));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortD = 0x%x\r\n", i, SelfIdMore->SID_PortD));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortC = 0x%x\r\n", i, SelfIdMore->SID_PortC));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortB = 0x%x\r\n", i, SelfIdMore->SID_PortB));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_More_Packets = 0x%x\r\n", i, SelfIdMore->SID_More_Packets));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Reserved3 = 0x%x\r\n", i, SelfIdMore->SID_Reserved3));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortH = 0x%x\r\n", i, SelfIdMore->SID_PortH));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortG = 0x%x\r\n", i, SelfIdMore->SID_PortG));
TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortF = 0x%x\r\n", i, SelfIdMore->SID_PortF));
*/
if (SelfIdMore->SID_More_Packets)
bMore = TRUE;
else
bMore = FALSE;
}
}
}
else {
// TRACE(TL_TRACE, (hWnd, "Unknown Data Buffer.\r\n"));
}
}
}
else if (pGetLocalHostInfo->Status) {
// this means its an insufficient buffer, that's the only
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -