NoUsbWarning
Zbavte se otravné otázky "Do you want to scan and fix ..."
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.
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í.
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
Copyright (c) Ladislav Zezula 2011