NoUsbWarning

Zbavte se otravné otázky "Do you want to scan and fix ..."

Teorie

Dotaz na sken výměnného disku

S přechodem na Windows Vista se mnoho uživatelů při vkládání výměnného disku USB setkalo s nepříjemným dotazem "Do you want to scan and fix Removable Disk (E:)?". Při vložení výměnného disku volá průzkumník funkci FSCTL_IS_VOLUME_DIRTY, která ověřuje, zda bylo médium korektně vytaženo z portu USB. Bohužel i když uživatel korektně ukončí práci s diskem USB, přesto se dotaz stále zobrazuje.

Řešení

Během hledání řešení jsem nenašel žádný korektní způsob, jak se zbavit neustále se opakujícího dotazu. Jeho zobrazování je závislé na ovladači výměnného disku, a ten je součástí Windows. Proto jsem sáhl k řešení méně čistému, což je zahákování funkce NtFsControlFile, importované modulem Kernel32.dll (Kernelbase.dll ve Windows 7):

static NTSTATUS NTAPI MyNtFsControlFile(      
    IN  HANDLE FileHandle,
    IN  HANDLE Event,
    IN  PIO_APC_ROUTINE ApcRoutine,
    IN  PVOID ApcContext,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN  ULONG FsControlCode,
    IN  PVOID InputBuffer,
    IN  ULONG InputBufferLength,
    IN  PVOID OutputBuffer,
    IN  ULONG OutputBufferLength)
{
    NTSTATUS Status;
    LPDWORD pdwPatchValue;

    Status = NtFsControlFile(FileHandle,
                             Event,
                             ApcRoutine,
                             ApcContext,
                             IoStatusBlock,
                             FsControlCode,
                             InputBuffer,
                             InputBufferLength,
                             OutputBuffer,
                             OutputBufferLength);

    // If the IOCTL was FSCTL_IS_VOLUME_DIRTY, we pretend it's NOT dirty
    if(Status == STATUS_SUCCESS && FsControlCode == FSCTL_IS_VOLUME_DIRTY)
    {
        if(OutputBufferLength <= 4)
        {
            pdwPatchValue = (LPDWORD)OutputBuffer;
            pdwPatchValue[0] = 0;
        }
    }

    return Status;
}

Funkce jednoduše při každém volání ověří, zda jde o dotaz na dirty flag, a pokud ano, tak předstírá, že médium bylo vyměněno korektně. Výsledek je že se dotaz na sken výměnného disku nikdy nezobrazí.

Instalace

Stáhněte si ZIP soubor z odkazu uvedeného níže, rozbalte jej a vyberte 32-bitovou nebo 64-bitovou DLL, podle toho jaký máte operační systém. Nakopírujte ji nejlépe do adresáře Windows\System32 a na příkazový řádek napište následující příkaz:

RegSvr32.exe C:\Windows\System32\NoUsbWarning.dll

Knihovna se zaregistruje, a po každém přihlášení se zavede do průzkumníka. Výše zmíněnou otázku už neuvidíte, dokud knihovnu neodinstalujete nebo nerestartujere Průzkumníka. Odinstalace se provede pomocí příkazu

RegSvr32.exe /u C:\Windows\System32\NoUsbWarning.dll

Ke stažení