Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
5.6 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: testclean.cpp
//
//--------------------------------------------------------------------------
// code to delete the contents of a container
//
//
#ifdef UNICODE
#define _UNICODE 1
#endif
//#include <sys/types.h>
//#include <sys/stat.h>
//
// CRunTime Includes
//
//#include <limits.h>
//#include <io.h>
#include <stdio.h>
#include <objbase.h>
#include <activeds.h>
#include <rpc.h>
#include <ole2.h>
#include "oledb.h"
#include "oledberr.h"
#include "msdadc.h"
#define RETURN_ON_FAILURE(hr) \
if (FAILED(hr)) { \
return hr; \
}
#define _MAX_LENGTH 500
#define MAX_ADS_ENUM 10
#define CLASSNAME L"objectClass"
HRESULT
GetNextEnum(
IEnumVARIANT * pEnum,
IADs **ppADs
)
{
HRESULT hr;
VARIANT VariantArray[MAX_ADS_ENUM];
IDispatch *pDispatch = NULL;
hr = ADsEnumerateNext(
pEnum,
1,
VariantArray,
NULL
);
if (hr == S_FALSE)
return hr;
RETURN_ON_FAILURE(hr);
pDispatch = VariantArray[0].pdispVal;
memset(VariantArray, 0, sizeof(VARIANT)*MAX_ADS_ENUM);
hr = pDispatch->QueryInterface(IID_IADs, (void **) ppADs) ;
pDispatch->Release();
return(S_OK);
}
HRESULT GetPropertyListAlloc(IADs *pADs, LPOLESTR pszPropName,
DWORD *pCount, LPOLESTR **ppList)
{
LONG dwSLBound = 0;
LONG dwSUBound = 0;
VARIANT v;
LONG i;
HRESULT hr = S_OK;
VARIANT var;
*pCount = 0;
VariantInit(&var);
hr = pADs->Get(pszPropName, &var);
if (hr == E_ADS_PROPERTY_NOT_FOUND)
{
return S_OK;
}
RETURN_ON_FAILURE(hr);
if(!((V_VT(&var) & VT_VARIANT)))
{
return(E_FAIL);
}
//
// The following is a work around for the package detail field
//
if (!V_ISARRAY(&var))
{
(*ppList) = (LPOLESTR *) CoTaskMemAlloc(sizeof(LPOLESTR));
*pCount = 1;
*(*ppList) = (LPOLESTR) CoTaskMemAlloc (sizeof(WCHAR) * (wcslen(var.bstrVal)+1));
wcscpy (*(*ppList), var.bstrVal);
VariantClear(&var);
return S_OK;
}
//
// Check that there is only one dimension in this array
//
if ((V_ARRAY(&var))->cDims != 1)
{
return E_FAIL;
}
//
// Check that there is atleast one element in this array
//
if ((V_ARRAY(&var))->rgsabound[0].cElements == 0)
{
return S_OK; // was E_FAIL;
}
//
// We know that this is a valid single dimension array
//
hr = SafeArrayGetLBound(V_ARRAY(&var),
1,
(long FAR *)&dwSLBound
);
RETURN_ON_FAILURE(hr);
hr = SafeArrayGetUBound(V_ARRAY(&var),
1,
(long FAR *)&dwSUBound
);
RETURN_ON_FAILURE(hr);
(*ppList) = (LPOLESTR *) CoTaskMemAlloc(sizeof(LPOLESTR)*(dwSUBound-dwSLBound+1));
for (i = dwSLBound; i <= dwSUBound; i++) {
VariantInit(&v);
hr = SafeArrayGetElement(V_ARRAY(&var),
(long FAR *)&i,
&v
);
if (FAILED(hr)) {
continue;
}
if (i <= dwSUBound)
{
(*ppList)[*pCount] = (LPOLESTR) CoTaskMemAlloc
(sizeof (WCHAR) * (wcslen(v.bstrVal) + 1));
wcscpy ((*ppList)[*pCount], v.bstrVal);
VariantClear(&v);
(*pCount)++;
}
}
VariantClear(&var);
return(S_OK);
}
void EnumerateAndDelete(WCHAR *szContainerName)
{
HRESULT hr=S_OK;
IADsContainer *pADsContainer=NULL, *pADssubContainer=NULL;
IEnumVARIANT *pEnum=NULL;
IADs *pADs=NULL;
WCHAR *szFullName=NULL, *szName=NULL;
WCHAR **ppswClassNameList=NULL;
ULONG sz=0;
hr = ADsGetObject(szContainerName, IID_IADsContainer, (void **)&pADsContainer);
if (SUCCEEDED(hr))
hr = ADsBuildEnumerator(pADsContainer, &pEnum);
if (SUCCEEDED(hr))
{
for (;;)
{
hr = GetNextEnum(pEnum, &pADs);
if (hr != S_OK)
break;
hr = pADs->get_ADsPath(&szFullName);
if (FAILED(hr))
continue;
wprintf(L"Deleting %s \n", szFullName);
hr = pADs->QueryInterface(IID_IADsContainer, (void **)&pADssubContainer);
if (SUCCEEDED(hr))
{
pADssubContainer->Release();
EnumerateAndDelete(szFullName);
}
hr = GetPropertyListAlloc(pADs, CLASSNAME, &sz, &ppswClassNameList);
if (FAILED(hr))
continue;
SysFreeString(szFullName);
hr = pADs->get_Name(&szName);
if (FAILED(hr))
continue;
pADsContainer->Delete(ppswClassNameList[sz-1], szName);
SysFreeString(szName);
}
}
if (pADsContainer)
pADsContainer->Release();
return;
}
void __cdecl main(int argc, char *argv[])
{
WCHAR szContainer [_MAX_LENGTH+1];
if (argc != 2)
{
printf("Usage: %s <Full ContainerName that has to be emptied>", argv[0]);
printf("\tThe container itself will remain\n");
return;
}
CoInitialize(NULL);
MultiByteToWideChar(CP_ACP, 0, argv[1], strlen(argv[1]) + 1,
szContainer, _MAX_LENGTH);
EnumerateAndDelete(szContainer);
CoUninitialize();
}