windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/delnode.c
2020-09-26 16:20:57 +08:00

148 lines
2.7 KiB
C

#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();
}