179 lines
4.5 KiB
C++
179 lines
4.5 KiB
C++
/*++
|
|
|
|
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();
|
|
}
|
|
|