in src/main/cpp/cleaner/windows/src/main.c [428:485]
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hi, PSTR pszCmdLine, int nCmdShow) {
UNREFERENCED_PARAMETER(hInstance);
UNREFERENCED_PARAMETER(hi);
UNREFERENCED_PARAMETER(pszCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
int argumentsNumber = 0;
DWORD i=0;
DWORD threadCounter = 0;
DWORD dwThread;
WCHAR ** commandLine = CommandLineToArgvW(GetCommandLineW(), &argumentsNumber);
HANDLE * runningThreads = (HANDLE *) LocalAlloc(LPTR, sizeof(HANDLE) * MAXIMUM_THREADS);
for(i=0;i<MAXIMUM_THREADS;i++) {
runningThreads[i] = INVALID_HANDLE_VALUE;
}
changeCurrentDirectory();
if(argumentsNumber==2) {
WCHAR * filename = commandLine[1];
HANDLE fileList = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0);
if(fileList!=0) {
WCHAR ** files = NULL;
DWORD number = 0;
DWORD allThreadsUsed=0;
readStringList(fileList, &files, &number);
CloseHandle(fileList);
if(files!=NULL) {
Sleep(INITIAL_DELAY);
for(i=0;i<number;i++) {
WCHAR * file = files[i];
if(file!=NULL) {
if(lstrlenW(file)>0) {
getFreeIndexForNextThread(runningThreads, MAXIMUM_THREADS, &threadCounter);
runningThreads [threadCounter] = CreateThread( NULL, 0, &deleteFileThread, (LPVOID) file, 0, &dwThread );
threadCounter++;
if(threadCounter==MAXIMUM_THREADS) allThreadsUsed = 1;
}
}
}
WaitForMultipleObjects(allThreadsUsed ? MAXIMUM_THREADS : threadCounter,
runningThreads, TRUE, INFINITE);
for(i=0;i<number;i++) {
if(files[i]!=NULL) LocalFree(files[i]);
}
LocalFree(files);
}
}
}
LocalFree(commandLine);
LocalFree(runningThreads);
//removeItself();
removeItselfUsingCmd();
return 0;
}