Buvo blogai įkištas USB kištukas ir Windows pradėjo mėtyti keistas klaidas. Čia per FAR klaida parodyta, tačiau patikėkit, tokia pat klaida buvo ir pas windows failų kopijavimą (windows explorer, error 800700221).

Klaida skamba keistokai “The wrong diskette is in the drive. Insert %2 (Volume Serial Number: %3) into drive %1.“.
Kas pirmiausia keista- kada skaitytojai paskutinį kartą naudojo disketes, tuo labiau kokias nors instaliacijas kai buvo naudojamos keliose disketėse įrašyti failai? Čia į “sexy” galite nekreipti dėmesį- aš mėgstu naudoti “neteisingus” pavadinimus. Mano darbo kompiuteryje galima rasti ir “xxx” ir “porno” folderius. Matyt kažkoks paaugliškas protestas.
Antras keistumas- tie “%2”, “%3”, “%1”. Tai FormatMessage() komandos parametrai, panašiai kaip printf.
Vadinasi kažkur giliai giliai, kokio nors kernel32.dll gelmėse tupi Windows NT3.x klaidų pranešimai (win32) kurie kiek nesuderinami su šiuolaikiniais reikalais, tokiais kaip USB šokinėjimas tarp 3-2-1 standarto esant blogam kontaktui. 🙂
Visus kitus klaidų pranešimus moderni sistema “perima” ir perrašo į kažką panašaus į “The printer is out of paper.” ar “The system cannot read from the specified device.”, o štai šio specifinio niekas ir nepastebėjo. Todėl modernūs windowsai neradę klaidos pranešimo, krapšto savo “atbulinį suderinimą” ir iškasa tokį antikvarą.
O problema pasitaisė pasmaukius už USB laido.
- 0x80070022=0x80070000+0x22, ERROR_WRONG_DISK=0x22?, HRESULT The operation completed successfully= 0x80070000. Ir sumoje klaida “The wrong diskette is in the drive. Insert %2 (Volume Serial Number: %3) into drive %1.”. Paprasčiausiai OS nenusiuntė klaidos sukelėjų pavadinimus, arba dar giliau, disketės skaitytuvas negali būti su kokia nors “E” raidė ir gal “volume serial number” pasidarė žymiai didesnis nei buvo kokias 1993 metais. Far manager naudoja kitą API, bet klaida lieka ta pati. Trumpai sakant, kažkas užmiršo 0x22 klaidą. ↩︎
pamišusiems:
#include <windows.h> #include <stdio.h> int main(void) { DWORD err = ERROR_WRONG_DISK; //dec 34 = 0x22, tas pats kur su %1, %2, %3 LPVOID msgBuf = NULL; DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; DWORD len = FormatMessageA( flags, NULL, err, 0, // kalba: 0 = automatinė (LPSTR)&msgBuf, // čia Windows įdės tekstą 0, NULL // argumentų nėra, todėl %1, %2 liks neišpildyti ); if (len == 0) { printf("FormatMessage failed: %lu\n", GetLastError()); return 1; } printf("Klaidos tekstas:\n%s\n", (char*)msgBuf); LocalFree(msgBuf); return 0; }
Čia AI parašė. O rezultatas:
Klaidos tekstas: The wrong diskette is in the drive. Insert %2 (Volume Serial Number: %3) into drive %1. C:\Users\User\Documents\Visual Studio 2022\FormatMessage\x64\Debug\FormatMessage.exe (process 11468) exited with code 0 (0x0).
