?? dlgpgconfiguration.cpp
字號:
// DlgPgConfiguration.cpp : implementation file
//
#include "stdafx.h"
#include "TestApp.h"
#include "DlgPgConfiguration.h"
#include "ddx_ex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgPgConfiguration dialog
CDlgPgConfiguration::CDlgPgConfiguration(CWnd* pParent /*=NULL*/)
: CDialogPage(CDlgPgConfiguration::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgPgConfiguration)
m_ValVendorLeafSize = 0;
m_ValModelLeafSize = 0;
m_ValUnitDepDirSize = 0;
m_ValUnitDirSize = 0;
m_ValHCGapCount = 63;
m_CheckHCSetGapCount = FALSE;
m_CheckModelLeaf = FALSE;
m_CheckUnitDepDir = FALSE;
m_CheckVendorLeaf = FALSE;
m_CheckUnitDir = FALSE;
m_nEachValue = 0;
//}}AFX_DATA_INIT
}
void CDlgPgConfiguration::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgPgConfiguration)
DDX_Control(pDX, IDC_CHECK_MODEL_LEAF, m_ButtonGetModelLeaf);
DDX_Control(pDX, IDC_CHECK_VENDOR_LEAF, m_ButtonGetVendorLeaf);
DDX_Control(pDX, IDC_CHECK_UNIT_DIR, m_ButtonGetUnitDir);
DDX_Control(pDX, IDC_CHECK_UNIT_DEP_DIR, m_ButtonGetUnitDepDir);
DDX_Control(pDX, IDC_CHECK_HC_GAPCOUNT, m_ButtonHCSetGapCount);
DDX_Control(pDX, IDC_EDIT_NEW_GAPCOUNT, m_EditCtrlHCGapCountValue);
DDX_Text(pDX, IDC_EDIT_NEW_GAPCOUNT, m_ValHCGapCount);
DDV_MinMaxDWord(pDX, m_ValHCGapCount, 1, 63);
DDX_Check(pDX, IDC_CHECK_HC_GAPCOUNT, m_CheckHCSetGapCount);
DDX_Check(pDX, IDC_CHECK_MODEL_LEAF, m_CheckModelLeaf);
DDX_Check(pDX, IDC_CHECK_UNIT_DEP_DIR, m_CheckUnitDepDir);
DDX_Check(pDX, IDC_CHECK_VENDOR_LEAF, m_CheckVendorLeaf);
DDX_Check(pDX, IDC_CHECK_UNIT_DIR, m_CheckUnitDir);
DDX_Control(pDX, IDC_COMBO_DEVPROP_SPEED, m_ComboDevPropSpeed);
DDX_Radio(pDX, IDC_RADIO_HCGET_UNI_ID, m_nEachValue);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgPgConfiguration, CDialog)
//{{AFX_MSG_MAP(CDlgPgConfiguration)
ON_BN_CLICKED(IDC_BUTTON_CONFIG_INFO, OnButtonConfigInfo)
ON_BN_CLICKED(IDC_BUTTON_DEV_GET, OnButtonDevGet)
ON_BN_CLICKED(IDC_BUTTON_HC_GET, OnButtonHcGet)
ON_BN_CLICKED(IDC_BUTTON_DEV_SET, OnButtonDevSet)
ON_BN_CLICKED(IDC_BUTTON_HC_SET, OnButtonHcSet)
ON_BN_CLICKED(IDC_CHECK_HC_GAPCOUNT, OnCheckHCGapCount)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgPgConfiguration message handlers
void CDlgPgConfiguration::OnSelectionChange(BOOL bSelected)
{
if ( bSelected == TRUE ) {
// reset check boxes everytime we are selected,
// this is because actual opened device may have changed
m_ValVendorLeafSize = 0;
m_ValModelLeafSize = 0;
m_ValUnitDepDirSize = 0;
m_ValUnitDirSize = 0;
UpdateCheckBoxes();
UpdateData(FALSE);
}
}
BOOL CDlgPgConfiguration::OnInitDialog()
{
CDialog::OnInitDialog();
// fill combo box for set max. speed to device
m_ComboDevPropSpeed.Init(g_SpeedSelectorTab);
UpdateCheckBoxes();
UpdateEditBoxesStates();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//首先用OnButtonConfigInfo()得到所有緩沖區的大小,然后開辟相應大小的緩沖區,用OnButtonDevGet()再次發送IRP得到所需內容
//這兩個函數以及驅動程序中的相應代碼需要驗證
void CDlgPgConfiguration::OnButtonConfigInfo()
{
/*
typedef struct _Get_1394_CONFIG_INFO_PARAMS
{
CONFIG_ROM ConfigRom; // config rom
ULONG UnitDirectoryBufferSize;
IO_ADDRESS UnitDirectoryLocation; // Starting Location of Unit Directory
ULONG UnitDependentDirectoryBufferSize;
IO_ADDRESS UnitDependentDirectoryLocation;
ULONG VendorLeafBufferSize; // Size available to get vendor leafs
ULONG ModelLeafBufferSize; // Size available to get model leafs
} Get_Config_Info_Params,*PGet_Config_Info_Params;
*/
Get_Config_Info_Params InfoParams;
InfoParams.UnitDirectoryBufferSize = 0;
InfoParams.UnitDependentDirectoryBufferSize = 0;
InfoParams.VendorLeafBufferSize = 0;
InfoParams.ModelLeafBufferSize = 0;
DWORD Status = g_CurrentDev.GetDeviceConfigInfo(&InfoParams,sizeof(Get_Config_Info_Params));
if ( Status == STATUS_SUCCESS )
{
// save new buffer sizes, update check boxes enable state
m_ValUnitDirSize = InfoParams.UnitDirectoryBufferSize;
m_ValUnitDepDirSize = InfoParams.UnitDependentDirectoryBufferSize;
m_ValVendorLeafSize = InfoParams.VendorLeafBufferSize;
m_ValModelLeafSize = InfoParams.ModelLeafBufferSize;
UpdateCheckBoxes();
}
else
{
PrintOut(NL"GetDeviceConfigInfo() failed"NL);
PrintError(Status);
}
PrintOut(NL);
}
void CDlgPgConfiguration::OnButtonDevGet()
{
/*
const unsigned int UnitDirectory = 0;
const unsigned int UnitDependentDirectory = 1;
const unsigned int VendorLeaf = 2;
const unsigned int ModelLeaf = 3;
*/
unsigned int BlockType;
unsigned char* BlockBufPtr;
DWORD BufSize;
DWORD Status;
DWORD i;
if ( UpdateData(TRUE) )
{
if ( m_CheckUnitDir )
{
BufSize = m_ValUnitDirSize;
BlockBufPtr = NULL;
BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);
BlockType = UnitDirectory;
Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
if (Status == STATUS_SUCCESS)
{
// write the results to output window
// PrintOut("UnitDirectory (%d bytes) successfully read:", BufSize);
for (i=0; i<BufSize; i++) {
if ( (i % 4) == 0 ) {
PrintOut(NL" ");
}
// PrintOut("0x%02X ", *BlockBufPtr);
// BlockBufPtr++;
}
PrintOut(NL);
}
PrintOut(NL);
}
if ( m_CheckUnitDepDir )
{
BufSize = m_ValUnitDepDirSize;
BlockBufPtr = NULL;
BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);
BlockType = UnitDependentDirectory;
Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
if (Status == STATUS_SUCCESS) {
// write the results to output window
// PrintOut("UnitDependentDirectory (%d bytes) successfully read:", BufSize);
for (i=0; i<BufSize; i++) {
if ( (i % 4) == 0 ) {
PrintOut(NL" ");
}
// PrintOut("0x%02X ", *BlockBufPtr);
// BlockBufPtr++;
}
PrintOut(NL);
}
PrintOut(NL);
}
/*
typedef struct _TEXTUAL_LEAF {
USHORT TL_CRC; // using 1994 CRC algorithm
USHORT TL_Length; // length of leaf in quads
ULONG TL_Spec_Id; // vendor defined
ULONG TL_Language_Id; // language Id
UCHAR TL_Data; // variable length data
} TEXTUAL_LEAF, *PTEXTUAL_LEAF;
*/
if ( m_CheckVendorLeaf )
{
BufSize = (sizeof(TEXTUAL_LEAF)-1) + m_ValVendorLeafSize;
BlockBufPtr = NULL;
BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);
BlockType = VendorLeaf;
Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
if (Status == STATUS_SUCCESS) {
// write the results to output window
// PrintOut("VendorLeaf (%d bytes) successfully read:"NL, BufSize);
// ### it seems that string length field doesn磘 match the real value
/* PrintOut(" String length: %d bytes String CRC: 0x%04X"NL,
(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLength),
(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafCRC));
PrintOut(" Language ID: 0x%X Specification ID of Language ID: 0x%X"NL,
((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLangID,
((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafSpecID);
PrintOut(" String is: ");
PrintOut("%S"NL,((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafData);
*/
}
PrintOut(NL);
}
if ( m_CheckModelLeaf )
{
BufSize = (sizeof(TEXTUAL_LEAF)-1) + m_ValModelLeafSize;
BlockBufPtr = NULL;
BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);
BlockType = ModelLeaf;
Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
if (Status == STATUS_SUCCESS) {
/* // write the results to output window
PrintOut("ModelLeaf (%d bytes) successfully read:"NL, BufSize);
// ### it seems that string length field doesn磘 match the real value
PrintOut(" String length: %d bytes String CRC: 0x%04X"NL,
(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLength),
(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafCRC));
PrintOut(" Language ID: 0x%X Specification ID of Language ID: 0x%X"NL,
((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLangID,
((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafSpecID);
PrintOut(" String is: ");
PrintOut("%S"NL,((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafData);
*/
}
PrintOut(NL);
}
}
}
void CDlgPgConfiguration::OnButtonDevSet()
{
DEVICE_XMIT_PROPERTIES XmitProps;
if ( UpdateData(TRUE) ) {
XmitProps.fulSpeed = m_ComboDevPropSpeed.GetCurItemData();
// call driver (through class library)
DWORD Status = g_CurrentDev.SetDeviceXmitProperties(&XmitProps);
if (Status == STATUS_SUCCESS) {
PrintOut("New Device Xmit Properties successfully set"NL);
} else {
PrintOut(NL"SetDeviceXmitProperties() failed"NL);
PrintError(Status);
}
PrintOut(NL);
}
}
//get、set host的函數OnButtonHcGet()和OnButtonHcSet()也需要測試
/*總共有六種類型,前三種分配空間,發送IRP即可
第四種與分配計算機端的1394地址空間有關
第五種和第六種都存在可能分配的緩沖區不夠的問題,可先發一個IRP過去,如果返回
ERROR_INSUFFICIENT_BUFFER,則返回了正確的緩沖區長度,重新分配,重發IRP
*/
void CDlgPgConfiguration::OnButtonHcGet()
{
/*
//
typedef struct _GET_LOCAL_HOST_INFORMATION {
ULONG Status;
ULONG nLevel;
ULONG ulBufferSize;
UCHAR Information[1];
} GET_LOCAL_HOST_INFORMATION, *PGET_LOCAL_HOST_INFORMATION;
*/
PGET_LOCAL_HOST_INFORMATION pGetLocalHostInfo;
ULONG nLength;
if ( UpdateData(TRUE) )
{
if ( m_nEachValue == 0 ) //GET_HOST_UNIQUE_ID GET_LOCAL_HOST_INFO1 主機控制器ID
{
nLength = sizeof(GET_LOCAL_HOST_INFORMATION) + sizeof(GET_LOCAL_HOST_INFO1);
pGetLocalHostInfo = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, nLength);
pGetLocalHostInfo->Status = 0;
pGetLocalHostInfo->nLevel = GET_HOST_UNIQUE_ID;
pGetLocalHostInfo->ulBufferSize = nLength;
// call driver (through class library)
DWORD Status = g_CurrentDev.GetLocalHostInfo(pGetLocalHostInfo);
if ( Status == STATUS_SUCCESS && pGetLocalHostInfo->Status == 0 )
{
// display information
PrintOut("get host success"NL);
PGET_LOCAL_HOST_INFO1 LocalHostInfo1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -