WindowsXP-SP1/admin/activec/lib/api.cpp
2020-09-30 16:53:49 +02:00

157 lines
3.8 KiB
C++

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: API.c
//
// Contents:
//
// APIs: MMCPropertyChangeNotify
//
// History: 10/15/1996 RaviR Created
//____________________________________________________________________________
//
#include <wtypes.h>
#include "objbase.h"
#ifndef DECLSPEC_UUID
#if _MSC_VER >= 1100
#define DECLSPEC_UUID(x) __declspec(uuid(x))
#else
#define DECLSPEC_UUID(x)
#endif
#endif
#include "commctrl.h" // for LV_ITEMW needed by ndmgrpriv.h
#include "mmc.h"
#include "ndmgr.h"
#include "ndmgrpriv.h"
#include "mmcptrs.h"
#include "ndmgrp.h"
#include "amcmsgid.h"
HRESULT MMCPropertyChangeNotify(LONG_PTR lNotifyHandle, LPARAM lParam)
{
// Note - the property sheet is in a different thread than the console.
// So init COM.
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
LPPROPERTYSHEETNOTIFY ppsn;
hr = CoCreateInstance (CLSID_NodeManager, NULL, CLSCTX_INPROC,
IID_IPropertySheetNotify,
reinterpret_cast<void **>(&ppsn));
if (SUCCEEDED(hr))
{
LPPROPERTYNOTIFYINFO ppni = reinterpret_cast<LPPROPERTYNOTIFYINFO>(lNotifyHandle);
ppsn->Notify (ppni, lParam);
ppsn->Release();
}
// Uninit COM
CoUninitialize();
}
return (hr);
}
HRESULT MMCPropertyHelp (LPOLESTR pszHelpTopic)
{
// find the MMC main window for this process
HWND hwndFrame = NULL;
const DWORD dwCurrentPid = GetCurrentProcessId();
while (1)
{
// find an MMC frame window
hwndFrame = FindWindowEx (NULL, hwndFrame, MAINFRAME_CLASS_NAME, NULL);
if (hwndFrame == NULL)
break;
// found a frame, is it on this process?
DWORD dwWindowPid;
GetWindowThreadProcessId (hwndFrame, &dwWindowPid);
if (dwCurrentPid == dwWindowPid)
break;
}
if (hwndFrame == NULL)
return (E_UNEXPECTED);
return ((HRESULT) SendMessage (hwndFrame, MMC_MSG_SHOW_SNAPIN_HELP_TOPIC,
NULL, reinterpret_cast<LPARAM>(pszHelpTopic)));
}
HRESULT MMCFreeNotifyHandle(LONG_PTR lNotifyHandle)
{
if (lNotifyHandle == NULL)
return E_INVALIDARG;
LPPROPERTYNOTIFYINFO ppni =
reinterpret_cast<LPPROPERTYNOTIFYINFO>(lNotifyHandle);
BOOL bResult;
if ((bResult = IsBadReadPtr(ppni, sizeof(PROPERTYNOTIFYINFO))) == FALSE)
::GlobalFree(ppni);
return ((bResult == FALSE) ? S_OK : E_FAIL);
}
HRESULT MMCIsMTNodeValid(void* pMTNode, BOOL bReset)
{
HRESULT hr = S_FALSE;
HWND hWnd = NULL;
DWORD dwPid = 0;
DWORD dwTid = 0;
if (pMTNode == NULL)
return hr;
while (1)
{
hWnd = ::FindWindowEx(NULL, hWnd, DATAWINDOW_CLASS_NAME, NULL);
// No windows found
if (hWnd == NULL)
break;
// Check if the window belongs to the current process
dwTid = ::GetWindowThreadProcessId(hWnd, &dwPid);
if (dwPid != ::GetCurrentProcessId())
continue;
// Get the extra bytes and compare the data objects
if (GetClassLong(hWnd, GCL_CBWNDEXTRA) != WINDOW_DATA_SIZE)
break;
DataWindowData* pData = GetDataWindowData (hWnd);
if (pData == NULL)
break;
if (pData->lpMasterNode == reinterpret_cast<LONG_PTR>(pMTNode))
{
// clear the data out if the user requests it
if (bReset)
pData->lpMasterNode = NULL;
hr = S_OK;
break;
}
}
return hr;
}