|
|
/*
* * Copyright (c) Microsoft Corporation. All rights reserved. * * pcommon.h * * Common routines for policy code. */
//*************************************************************
//
// RegDelnode()
//
// Deletes a registry key and all it's subkeys.
//
// hKeyRoot Root key
// lpSubKey SubKey to delete
//
//*************************************************************
DWORD RegDelnode( IN HKEY hKeyRoot, IN PWCHAR pwszSubKey ) #ifdef PCOMMON_IMPL
{ HKEY hSubKey = 0; PWCHAR pwszChildSubKey = 0; DWORD MaxCchSubKey; DWORD Status;
if ( ! pwszSubKey ) return ERROR_SUCCESS;
Status = RegDeleteKey( hKeyRoot, pwszSubKey );
if ( ERROR_SUCCESS == Status ) return ERROR_SUCCESS;
Status = RegOpenKeyEx( hKeyRoot, pwszSubKey, 0, KEY_READ, &hSubKey );
if ( Status != ERROR_SUCCESS ) return (Status == ERROR_FILE_NOT_FOUND) ? ERROR_SUCCESS : Status;
Status = RegQueryInfoKey( hSubKey, 0, 0, 0, 0, &MaxCchSubKey, 0, 0, 0, 0, 0, 0 );
if ( ERROR_SUCCESS == Status ) { MaxCchSubKey++; pwszChildSubKey = (PWCHAR) LocalAlloc( 0, MaxCchSubKey * sizeof(WCHAR) ); if ( ! pwszChildSubKey ) Status = ERROR_OUTOFMEMORY; }
for (;(ERROR_SUCCESS == Status);) { DWORD CchSubKey; FILETIME FileTime;
CchSubKey = MaxCchSubKey; Status = RegEnumKeyEx( hSubKey, 0, pwszChildSubKey, &CchSubKey, NULL, NULL, NULL, &FileTime );
if ( ERROR_NO_MORE_ITEMS == Status ) { Status = ERROR_SUCCESS; break; }
if ( ERROR_SUCCESS == Status ) Status = RegDelnode( hSubKey, pwszChildSubKey ); }
RegCloseKey( hSubKey ); LocalFree( pwszChildSubKey );
return RegDeleteKey( hKeyRoot, pwszSubKey ); } #else
; #endif
|