fix(v5): Laufwerks-Gesundheit zählt nur das eigene Gerät (\Device\CdRomN), nie eine Festplatte
WAS: win32.ts kennt QueryDosDeviceW (am 12.09.2026 an diesem PC gemessen: C: → \Device\HarddiskVolume7, X: → \Device\LanmanRedirector\…\192.168.178.62\rippy); LaufwerkApi.geraeteName liefert das Kernel-Gerät hinter dem Buchstaben. beurteilen() filtert damit auf DIESES Gerät; ohne Gerätename zählt nur noch der cdrom-Treiber (gehoertZuLaufwerk). Vorher nahm der XPath cdrom UND disk für alle Geräte — eine hustende Festplatte oder ein zweites Laufwerk erzeugte „VERDACHT: DIE HARDWARE" in der Kachel des Blu-ray- Laufwerks. WARUM: Durchsicht 12.09.2026, Fund F11 — mit Tests (Festplatten- Ereignisse, zweites Laufwerk, ruhig mit Gerätename). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
551f1d7b2c
commit
783b8e4897
@@ -24,6 +24,15 @@ export function win32Api(): LaufwerkApi {
|
||||
)
|
||||
const CloseHandle = kernel32.func('bool __stdcall CloseHandle(void *hObject)')
|
||||
const GetLastError = kernel32.func('uint32_t __stdcall GetLastError()')
|
||||
// 5.7.0 (Durchsicht F11): Welches Kernel-Gerät steckt hinter G:? —
|
||||
// QueryDosDeviceW liefert \Device\CdRom0 (learn.microsoft.com,
|
||||
// fileapi/nf-fileapi-querydosdevicew: Ziel ist eine Mehrfach-Zeichenkette,
|
||||
// der erste Eintrag zählt; am 12.09.2026 an C: dieses PCs gemessen).
|
||||
// Damit zählt die Laufwerks-Gesundheit nur noch die Ereignisse DIESES
|
||||
// Laufwerks, nicht die einer hustenden Festplatte.
|
||||
const QueryDosDeviceW = kernel32.func(
|
||||
'uint32_t __stdcall QueryDosDeviceW(str16 lpDeviceName, _Out_ char16_t *lpTargetPath, uint32_t ucchMax)',
|
||||
)
|
||||
const DeviceIoControl = kernel32.func(
|
||||
'bool __stdcall DeviceIoControl(void *hDevice, uint32_t dwIoControlCode, void *lpInBuffer, uint32_t nInBufferSize, _Out_ void *lpOutBuffer, uint32_t nOutBufferSize, _Out_ uint32_t *lpBytesReturned, void *lpOverlapped)',
|
||||
)
|
||||
@@ -65,6 +74,16 @@ export function win32Api(): LaufwerkApi {
|
||||
CloseHandle(handle)
|
||||
},
|
||||
|
||||
geraeteName(buchstabe: string): string {
|
||||
const ziel = Buffer.alloc(2 * 1024)
|
||||
const laenge = QueryDosDeviceW(`${buchstabe.replace(/:$/, '')}:`, ziel, 1024) as number
|
||||
if (laenge === 0) return ''
|
||||
// UTF-16LE, die erste Zeichenkette bis zum ersten NUL.
|
||||
const text = ziel.toString('utf16le', 0, laenge * 2)
|
||||
const ende = text.indexOf('\0')
|
||||
return (ende >= 0 ? text.slice(0, ende) : text).trim()
|
||||
},
|
||||
|
||||
steuern(handle: unknown, code: number, eingabe?: Buffer | null, ausgabeBytes = 0): Buffer {
|
||||
const aus = ausgabeBytes > 0 ? Buffer.alloc(ausgabeBytes) : null
|
||||
const zurueck = [0]
|
||||
|
||||
Reference in New Issue
Block a user