程式語言 - 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;
}