/*++ Copyright (c) 1997-1999 Microsoft Corporation Revision History: --*/ // SelectInstanceName.cpp : implementation file // #include "stdafx.h" #include "EnumGuid.h" #include "SelName.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include "wmihlp.h" ///////////////////////////////////////////////////////////////////////////// // CSelectInstanceName dialog CSelectInstanceName::CSelectInstanceName(LPGUID lpGuid, PTCHAR lpInstanceName, LPDWORD lpSize, CWnd* pParent /*=NULL*/) : CDialog(CSelectInstanceName::IDD, pParent), lpGuid(lpGuid), buffer(lpInstanceName), lpSize(lpSize) { //{{AFX_DATA_INIT(CSelectInstanceName) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } CSelectInstanceName::~CSelectInstanceName() { lpGuid = 0; buffer = 0; lpSize = 0; } void CSelectInstanceName::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSelectInstanceName) DDX_Control(pDX, IDC_INSTANCE_LIST, lstInstance); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSelectInstanceName, CDialog) //{{AFX_MSG_MAP(CSelectInstanceName) ON_LBN_DBLCLK(IDC_INSTANCE_LIST, OnDblclkInstanceList) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSelectInstanceName message handlers BOOL CSelectInstanceName::OnInitDialog() { CDialog::OnInitDialog(); EnumerateInstances(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } DWORD CSelectInstanceName::Select() { DoModal(); return dwError; } void CSelectInstanceName::EnumerateInstances() { HANDLE hDataBlock; BYTE *BufferPtr; DWORD dwBufferSize = 0x8000; UINT iLoop; CString tmp; UINT iCount = 0; // Get the entire Wnode // dwError = WmiOpenBlock(lpGuid, 0, &hDataBlock); if (dwError == ERROR_SUCCESS) { dwError = WmiQueryAllData(hDataBlock, &dwBufferSize, XyzBuffer); if (dwError == ERROR_SUCCESS) { WmiCloseBlock(hDataBlock); } else { tmp.Format(_T("WMIQueryAllData returned error: %d"), dwError); lstInstance.AddString(tmp); } } else { tmp.Format(_T("Unable to open data block (%u)"), dwError); lstInstance.AddString(tmp); } if (dwError != ERROR_SUCCESS) { return; } BufferPtr = XyzBuffer; while (BufferPtr != NULL) { // Print Each Instance // pWnode = (PWNODE_ALL_DATA) BufferPtr; nameOffsets = (LPDWORD) OffsetToPtr(pWnode, pWnode->OffsetInstanceNameOffsets); for (iLoop = 0; iLoop < pWnode->InstanceCount; iLoop++) { tmp.Format(_T("Instance %u: "), iCount); PrintCountedString( (LPTSTR) OffsetToPtr( pWnode, nameOffsets[iLoop]), tmp ); namePtr[iCount++] = (LPTSTR)OffsetToPtr( pWnode, nameOffsets[iLoop]); lstInstance.AddString(tmp); } if (pWnode->WnodeHeader.Linkage == 0) { BufferPtr = NULL; } else { BufferPtr += pWnode->WnodeHeader.Linkage; } } lstInstance.SetCurSel(0); } void CSelectInstanceName::OnOK() { USHORT usNameSize; LPTSTR lpStringLocal; if (dwError == ERROR_SUCCESS) { // Check the size of the input buffer // lpStringLocal = (LPTSTR) namePtr[lstInstance.GetCurSel()]; usNameSize = * ((USHORT *) lpStringLocal); lpStringLocal = (LPTSTR) ((PBYTE)lpStringLocal + sizeof(USHORT)); if (*lpSize < (usNameSize + sizeof(TCHAR))) { *lpSize = usNameSize + sizeof(TCHAR); dwError = ERROR_INSUFFICIENT_BUFFER; } // Copy the instance name over to the output parameter. // Also, a null character needs to be added to the end of // the string because the counted string may not contain a // NULL character. // if (MyIsTextUnicode(lpStringLocal)) { usNameSize /= 2; } _tcsncpy(buffer, lpStringLocal, usNameSize ); buffer += usNameSize; _tcscpy(buffer, __T("")); } CDialog::OnOK(); } void CSelectInstanceName::OnDblclkInstanceList() { OnOK(); }