windows-nt/Source/XPSP1/NT/base/wmi/enumguid/selname.cpp
2020-09-26 16:20:57 +08:00

179 lines
4.4 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();
}