📄 1394api.c
字号:
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
1394api.c
Abstract
Author:
Peter Binder (pbinder) 4/08/98
Revision History:
Date Who What
-------- --------- ------------------------------------------------------------
4/08/98 pbinder birth
--*/
#define _1394API_C
#include "pch.h"
#undef _1394API_C
ULONG
WINAPI
GetLocalHostInformation(
HWND hWnd,
PSTR szDeviceName,
PGET_LOCAL_HOST_INFORMATION getLocalHostInfo,
BOOL bAutoAlloc
)
{
PGET_LOCAL_HOST_INFORMATION pGetLocalHostInfo;
HANDLE hDevice;
DWORD dwRet, dwBytesRet;
ULONG ulBufferSize;
TRACE(TL_TRACE, (hWnd, "Enter GetLocalHostInformation\r\n"));
TRACE(TL_TRACE, (hWnd, "nLevel = 0x%x\r\n", getLocalHostInfo->nLevel));
TRACE(TL_TRACE, (hWnd, "ulBufferSize = 0x%x\r\n", getLocalHostInfo->ulBufferSize));
// set Status = 0, this means even if we fail, buffer won't get updated and
// it will stay at zero and we will get the true error from the ioctl call
getLocalHostInfo->Status = 0;
if (bAutoAlloc) {
// we don't support auto alloc for nLevel = 5 or 6
switch (getLocalHostInfo->nLevel)
{
case 1:
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO1);
break;
case 2:
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO2);
break;
case 3:
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO3);
break;
case 4:
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO4);
break;
case 7:
ulBufferSize = sizeof(GET_LOCAL_HOST_INFO7);
break;
case 5:
case 6:
default:
dwRet = ERROR_INVALID_FUNCTION;
goto Exit_GetLocalHostInfo;
break;
}
ulBufferSize += sizeof(GET_LOCAL_HOST_INFORMATION);
pGetLocalHostInfo = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
if (!pGetLocalHostInfo)
{
dwRet = GetLastError();
TRACE(TL_ERROR, (hWnd, "Could not allocate pGetLocalHostInfo!\r\n"));
goto Exit_GetLocalHostInfo;
}
*pGetLocalHostInfo = *getLocalHostInfo;
}
else
{
pGetLocalHostInfo = getLocalHostInfo;
ulBufferSize = getLocalHostInfo->ulBufferSize;
}
hDevice = OpenDevice(hWnd, szDeviceName, FALSE);
if (hDevice != INVALID_HANDLE_VALUE) {
dwRet = DeviceIoControl( hDevice,
IOCTL_GET_LOCAL_HOST_INFORMATION,
pGetLocalHostInfo,
ulBufferSize,
pGetLocalHostInfo,
ulBufferSize,
&dwBytesRet,
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) {
GET_LOCAL_HOST_INFO5 LocalHostInfo5;
CopyMemory (&LocalHostInfo5, pGetLocalHostInfo->Information, sizeof (GET_LOCAL_HOST_INFO5));
TRACE(TL_TRACE, (hWnd, "ConfigRom = 0x%x\r\n", LocalHostInfo5.ConfigRom));
TRACE(TL_TRACE, (hWnd, "ConfigRomLength = 0x%p\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->nLevel == 7)
{
GET_LOCAL_HOST_INFO7 LocalHostInfo7;
CopyMemory (&LocalHostInfo7, pGetLocalHostInfo->Information, sizeof (GET_LOCAL_HOST_INFO7));
TRACE(TL_TRACE, (hWnd, "Host DMA Capabilities = 0x%x\r\n", LocalHostInfo7.HostDmaCapabilities));
TRACE(TL_TRACE, (hWnd, "Max DMA Buffer Size =0x%x\r\n", LocalHostInfo7.MaxDmaBufferSize));
}
}
else if (pGetLocalHostInfo->Status) {
// this means its an insufficient buffer, that's the only
// 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));
}
// free up resources
CloseHandle(hDevice);
}
else {
dwRet = GetLastError();
TRACE(TL_ERROR, (hWnd, "Error = 0x%x\r\n", dwRet));
}
Exit_GetLocalHostInfo:
if ((bAutoAlloc) && (pGetLocalHostInfo))
LocalFree(pGetLocalHostInfo);
TRACE(TL_TRACE, (hWnd, "Exit GetLocalHostInformation = %d\r\n", dwRet));
return(dwRet);
} // GetLocalHostInformation
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -