Steward
分享是一種喜悅、更是一種幸福
程式語言 - MinGW - C/C++ - Console - CD-ROM AutoPlay
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#include <string.h>
#define POLL_INTERVAL 1000
static int is_cdrom_ready(char drive)
{
char root[4];
UINT type;
root[0] = drive;
root[1] = ':';
root[2] = '\\';
root[3] = '\0';
type = GetDriveTypeA(root);
if (type != DRIVE_CDROM)
return 0;
if (!GetVolumeInformationA(
root,
NULL,
0,
NULL,
NULL,
NULL,
NULL,
0))
{
return 0;
}
return 1;
}
static int get_cdrom_drive(char *drive)
{
DWORD mask;
int i;
mask = GetLogicalDrives();
for (i = 0; i < 26; i++) {
if (mask & (1UL << i)) {
char d = (char)('A' + i);
if (is_cdrom_ready(d)) {
*drive = d;
return 1;
}
}
}
return 0;
}
static int file_exists(const char *path)
{
DWORD attr = GetFileAttributesA(path);
return attr != INVALID_FILE_ATTRIBUTES &&
!(attr & FILE_ATTRIBUTE_DIRECTORY);
}
static void run_bat(char drive)
{
char bat[MAX_PATH];
char cmd[MAX_PATH * 2];
sprintf(bat, "%c:\\run.bat", drive);
if (!file_exists(bat)) {
printf("No run.bat found on %c:\n", drive);
return;
}
sprintf(
cmd,
"cmd.exe /c \"\"%s\"\"",
bat
);
printf("Executing: %s\n", cmd);
system(cmd);
}
int main(void)
{
char current_drive = 0;
char new_drive;
printf("CD Watcher\n");
printf("Waiting for CD/DVD...\n");
for (;;) {
new_drive = 0;
if (get_cdrom_drive(&new_drive)) {
if (current_drive == 0) {
current_drive = new_drive;
printf(
"CD detected in %c:\\\n",
current_drive
);
run_bat(current_drive);
}
else if (current_drive != new_drive) {
current_drive = new_drive;
printf(
"CD detected in %c:\\\n",
current_drive
);
run_bat(current_drive);
}
}
else {
current_drive = 0;
}
Sleep(POLL_INTERVAL);
}
return 0;
}