?? display.c
字號:
/*++
Copyright (c) 1997-1998 Microsoft Corporation
Module Name:
DISPLAY.C
Abstract:
This source file contains the routines which update the edit control
to display information about the selected USB device.
Environment:
user mode
Revision History:
04-25-97 : created
--*/
//*****************************************************************************
// I N C L U D E S
//*****************************************************************************
#include <windows.h>
#include <basetyps.h>
#include "vndrlist.h"
#include "usbview.h"
#include "usb100.h"
//*****************************************************************************
// D E F I N E S
//*****************************************************************************
#define BUFFERALLOCINCREMENT 8192
#define BUFFERMINFREESPACE 1024
//*****************************************************************************
// T Y P E D E F S
//*****************************************************************************
//*****************************************************************************
// G L O B A L S P R I V A T E T O T H I S F I L E
//*****************************************************************************
// Workspace for text info which is used to update the edit control
//
CHAR *TextBuffer = NULL;
int TextBufferLen = 0;
int TextBufferPos = 0;
//*****************************************************************************
// L O C A L F U N C T I O N P R O T O T Y P E S
//*****************************************************************************
VOID
DisplayHubInfo (
PUSB_HUB_INFORMATION HubInfo
);
VOID
DisplayConnectionInfo (
PUSB_NODE_CONNECTION_INFORMATION ConnectInfo,
PSTRING_DESCRIPTOR_NODE StringDescs
);
VOID
DisplayPipeInfo (
ULONG NumPipes,
USB_PIPE_INFO *PipeInfo
);
VOID
DisplayConfigDesc (
PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
PSTRING_DESCRIPTOR_NODE StringDescs
);
VOID
DisplayConfigurationDescriptor (
PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
PSTRING_DESCRIPTOR_NODE StringDescs
);
VOID
DisplayInterfaceDescriptor (
PUSB_INTERFACE_DESCRIPTOR InterfaceDesc,
PSTRING_DESCRIPTOR_NODE StringDescs
);
VOID
DisplayEndpointDescriptor (
PUSB_ENDPOINT_DESCRIPTOR EndpointDesc
);
VOID
DisplayHidDescriptor (
PUSB_HID_DESCRIPTOR HidDesc
);
VOID
DisplayStringDescriptor (
UCHAR Index,
PSTRING_DESCRIPTOR_NODE StringDescs
);
VOID
DisplayUnknownDescriptor (
PUSB_COMMON_DESCRIPTOR CommonDesc
);
PCHAR
GetVendorString (
USHORT idVendor
);
//*****************************************************************************
// L O C A L F U N C T I O N S
//*****************************************************************************
//*****************************************************************************
//
// CreateTextBuffer()
//
//*****************************************************************************
BOOL
CreateTextBuffer (
)
{
// Allocate the buffer
//
TextBuffer = ALLOC(BUFFERALLOCINCREMENT);
if (TextBuffer == NULL)
{
OOPS();
return FALSE;
}
TextBufferLen = BUFFERALLOCINCREMENT;
// Reset the buffer position and terminate the buffer
//
*TextBuffer = 0;
TextBufferPos = 0;
return TRUE;
}
//*****************************************************************************
//
// DestroyTextBuffer()
//
//*****************************************************************************
VOID
DestroyTextBuffer (
)
{
if (TextBuffer != NULL)
{
FREE(TextBuffer);
TextBuffer = NULL;
}
}
//*****************************************************************************
//
// ResetTextBuffer()
//
//*****************************************************************************
BOOL
ResetTextBuffer (
)
{
// Fail if the text buffer has not been allocated
//
if (TextBuffer == NULL)
{
OOPS();
return FALSE;
}
// Reset the buffer position and terminate the buffer
//
*TextBuffer = 0;
TextBufferPos = 0;
return TRUE;
}
//*****************************************************************************
//
// AppendTextBuffer()
//
//*****************************************************************************
VOID __cdecl
AppendTextBuffer (
LPCTSTR lpFormat,
...
)
{
va_list arglist;
va_start(arglist, lpFormat);
// Make sure we have a healthy amount of space free in the buffer,
// reallocating the buffer if necessary.
//
if (TextBufferLen - TextBufferPos < BUFFERMINFREESPACE)
{
CHAR *TextBufferTmp;
TextBufferTmp = REALLOC(TextBuffer, TextBufferLen+BUFFERALLOCINCREMENT);
if (TextBufferTmp != NULL)
{
TextBuffer = TextBufferTmp;
TextBufferLen += BUFFERALLOCINCREMENT;
}
else
{
// If GlobalReAlloc fails, the original memory is not freed,
// and the original handle and pointer are still valid.
//
OOPS();
return;
}
}
// Add the text to the end of the buffer, updating the buffer position.
//
TextBufferPos += wvsprintf(TextBuffer + TextBufferPos,
lpFormat,
arglist);
}
//*****************************************************************************
//
// UpdateEditControl()
//
// hTreeItem - Handle of selected TreeView item for which information should
// be displayed in the edit control.
//
//*****************************************************************************
VOID
UpdateEditControl (
HWND hEditWnd,
HWND hTreeWnd,
HTREEITEM hTreeItem
)
{
TV_ITEM tvi;
PUSBDEVICEINFO info;
// Start with an empty text buffer.
//
if (!ResetTextBuffer())
{
return;
}
//
// Get the name of the TreeView item, along with the a pointer to the
// info we stored about the item in the item's lParam.
//
tvi.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM;
tvi.hItem = hTreeItem;
tvi.pszText = (LPSTR)TextBuffer;
tvi.cchTextMax = TextBufferLen-2; // leave space for "\r\n'
TreeView_GetItem(hTreeWnd,
&tvi);
info = (PUSBDEVICEINFO)tvi.lParam;
//
// If we didn't store any info for the item, just display the item's
// name, else display the info we stored for the item.
//
if (info != NULL)
{
if (info->ConnectionInfo == NULL)
{
// Must be Root HUB, external devices have Connection Info
//
AppendTextBuffer("Root Hub: %s\r\n",
info->HubName);
DisplayHubInfo(&info->HubInfo->u.HubInformation);
}
else
{
if (info->HubInfo != NULL)
{
// Must be external HUB external
//
AppendTextBuffer("External Hub: %s\r\n",
info->HubName);
DisplayHubInfo(&info->HubInfo->u.HubInformation);
}
else
{
// Must be external non-HUB device. Nothing special to
// display here that isn't displayed in connection info
// below.
}
// Display info common to any external device
//
DisplayConnectionInfo(info->ConnectionInfo,
info->StringDescs);
if (info->ConfigDesc)
{
DisplayConfigDesc((PUSB_CONFIGURATION_DESCRIPTOR)(info->ConfigDesc + 1),
info->StringDescs);
}
}
}
// All done formatting text buffer with info, now update the edit
// control with the contents of the text buffer
//
SetWindowText(hEditWnd, TextBuffer);
}
//*****************************************************************************
//
// DisplayHubInfo()
//
// HubInfo - Info about the hub.
//
//*****************************************************************************
VOID
DisplayHubInfo (
PUSB_HUB_INFORMATION HubInfo
)
{
USHORT wHubChar;
AppendTextBuffer("Hub Power: %s\r\n",
HubInfo->HubIsBusPowered ?
"Bus Power" : "Self Power");
AppendTextBuffer("Number of Ports: %d\r\n",
HubInfo->HubDescriptor.bNumberOfPorts);
wHubChar = HubInfo->HubDescriptor.wHubCharacteristics;
switch (wHubChar & 0x0003)
{
case 0x0000:
AppendTextBuffer("Power switching: Ganged\r\n");
break;
case 0x0001:
AppendTextBuffer("Power switching: Individual\r\n");
break;
case 0x0002:
case 0x0003:
AppendTextBuffer("Power switching: None\r\n");
break;
}
switch (wHubChar & 0x0004)
{
case 0x0000:
AppendTextBuffer("Compound device: No\r\n");
break;
case 0x0004:
AppendTextBuffer("Compound device: Yes\r\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -