Source code of Windows XP (NT5)
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.
|
|
#include "precomp.h"
#pragma hdrstop
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
delnode.c
Abstract:
Delnode routine for Setup.
Author:
Ted Miller (tedm) August 1992
--*/
//
// Bug whereby \$win_nt$.~ls\os2 directory is not deleted
//
//#define BUG_1818
#ifdef BUG_1818
char auxbuf[256]; #endif
//
// Put these out here so we don't consume huge stack space as we recurse.
//
TCHAR Pattern[MAX_PATH]; WIN32_FIND_DATA FindData;
VOID DelnodeRoutine( VOID ) { LPTSTR PatternEnd; HANDLE FindHandle;
//
// Delete each file in the directory, then remove the directory itself.
// If any directories are encountered along the way recurse to delete
// them as they are encountered.
//
PatternEnd = Pattern+lstrlen(Pattern);
lstrcat(Pattern,TEXT("\\*")); FindHandle = FindFirstFile(Pattern,&FindData);
if(FindHandle != INVALID_HANDLE_VALUE) {
do {
//
// Form the full name of the file we just found.
//
lstrcpy(PatternEnd+1,FindData.cFileName);
//
// Remove read-only atttribute if it's there.
//
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { SetFileAttributes(Pattern,FILE_ATTRIBUTE_NORMAL); }
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
//
// The current match is a directory. Recurse into it unless
// it's . or ...
//
if(lstrcmp(FindData.cFileName,TEXT("." )) && lstrcmp(FindData.cFileName,TEXT(".."))) { DelnodeRoutine(); }
} else {
//
// The current match is not a directory -- so delete it.
//
DeleteFile(Pattern); }
*(PatternEnd+1) = 0;
} while(FindNextFile(FindHandle,&FindData));
FindClose(FindHandle); }
//
// Remove the directory we just emptied out.
//
*PatternEnd = 0; #ifdef BUG_1818
if(!RemoveDirectory(Pattern)) {
ULONG err = GetLastError();
MessageBox( NULL, "Leave the machine exactly as it is now and get tedm (x63482).", "Trying to catch bug 1818", MB_TASKMODAL | MB_OK | MB_ICONSTOP );
wsprintf(auxbuf,"Dir: %s\nErr: %lu",Pattern,err); MessageBox( NULL, auxbuf, "", MB_TASKMODAL | MB_OK );
DbgBreakPoint(); } #endif
RemoveDirectory(Pattern); }
VOID DoDelnode( IN PCHAR Directory ) { lstrcpy(Pattern,Directory);
DelnodeRoutine(); }
|