![]() |
IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Hallo,
ich kriege es einfach nicht hin. Er schreibt immer: "Falscher Parameter", also habe ich wahrscheinlich zu wenig Ahnung von C, um die Strukturen richtig zu übersetzen. Kann jemand helfen? Was mache ich falsch?
Delphi-Quellcode:
Gruß
const
IOCTL_SCSI_MINIPORT_NVCACHE = $1b0600; IOCTL_SCSI_MINIPORT = $4d008; NRB_FUNCTION_NVCACHE_INFO = $EC; type PSRB_IO_Control = ^SRB_IO_Control; SRB_IO_Control = record HeaderLength: ULong; Signature: array[0..7] of byte; TimeOut: ulong; ControlCode: Ulong; ReturnCode: Ulong; Length: ULONG; end; PSRB_BUFFER = ^SRB_BUFFER; SRB_BUFFER = record sic: SRB_IO_CONTROL; ucDataBuffer: array[0..511] of byte; end; PNVCACHE_REQUEST_BLOCK = ^NVCACHE_REQUEST_BLOCK; NVCACHE_REQUEST_BLOCK = record nrbsize: ULong; Fct: Word; NRBFlags: ULONG; NRBStatus: ULONG; Cuont: ULONG; LBA: UINt64; DataBufSize: ULong; NVCacheStatus: ULong; NVCacheSubStatus: ULong; end; PNV_FEATURE_PARAMETER = ^NV_FEATURE_PARAMETER; NV_FEATURE_PARAMETER = record NVPowerModeEnabled: word; NVParameterReserv: word; NVCmdEnabled: Word; NVParameterReserv2: Word; NVPowerModeVer: Word; NVCmdVer: Word; NVSize: ULong; NVReadSpeed: Word; NVWrtSpeed: Word; DeviceSpinUpTime: Word; end; procedure Test; var hDevice: Cardinal; dwBytesReturned: DWord; i: Integer; req: NVCACHE_REQUEST_BLOCK; rpm: NV_FEATURE_PARAMETER; begin hDevice:=CreateFile(PChar('\\.\PHYSICALDRIVE0'),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,OPEN_EXISTING,0,0); if hDevice=INVALID_HANDLE_VALUE then begin showmessage('Createfile klappt nicht.'); ; exit; end; ZeroMemory(@req, SizeOf(NVCACHE_REQUEST_BLOCK)); req.Fct:=NRB_FUNCTION_NVCACHE_INFO; req.NRBSize:=sizeof(NVCACHE_REQUEST_BLOCK); if not windows.DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT, @req, sizeof(NVCACHE_REQUEST_BLOCK), @rpm, sizeof(NV_FEATURE_PARAMETER), dwBytesReturned, nil) then begin i:=GetLastError; showmessage(format('%s (%d)',[SysErrorMessage(i),i])); end; end; Mattze |
AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Hast Du es mal mit "packed" versucht?
Z.B. bei NV_FEATURE_PARAMETER sollte das schon Auswirkungen haben. Gruß K-H |
AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Zitat:
Das Problem liegt offenbar woanders begründet: Wieso verwendest Du bei Aufruf von DeviceIoControl() mit dem Controlcode-Parameter IOCTL_SCSI_MINIPORT als Parameter für die benötigten In- und Out-Puffer die NVCACHE_REQUEST_BLOCK- bzw. NV_FEATURE_PARAMETER-Strukturen ? Die sind doch als Puffer wegen unzureichender Größe hier für den Aufruf mit diesem Controlcode völlig ungeeignet! NVCACHE_REQUEST_BLOCK: 38 Bytes groß NV_FEATURE_PARAMETER: 22 Bytes groß Du benötigst aber zwingend einen Puffer der Größe 572 Bytes, die sich nämlich wie nachfolgend berechnet:
Code:
Somit muss es in Deiner Prozedur Test also entsprechend abgeändert werden:
Const
IDENTIFY_BUFFER_SIZE = 512; DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE; BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize;
Code:
Damit dürfest Du anschließend über den Zugriff auf die anderen Strukturen erfolgreich weiterarbeiten können, je nachdem, was Du eigentlich genau erfahren willst (was Du uns leider nicht verraten hast).
procedure Test;
var hDevice: Cardinal; dwBytesReturned: DWord; i: Integer; Buffer: array[0..BufferSize - 1] of Byte; begin {....} if not DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT, @Buffer,BufferSize, @Buffer, BufferSize, dwBytesReturned, nil) then ... {....} |
AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Hallo,
vielen Dank für Eure Antworten. Werde ich gleich mal durchprobieren... Das wichtigste: Ich versuche immer noch die Umdrehungsgeschwindigkeit der HD rauszukriegen (, um eine SSD erkennen zu können). (Mit IOCTL_ATA_PASS_THROUGH, wie empfohlen, packe ich es nicht.) Mit IOCTL_SCSI_MINIPORT soll es gehen. Deshalb heißt die Ausgabe übrigens auch rpm. Aber das hätte ich schreiben sollen. Entschuldigung! Das obige Beispiel hatte ich in C irgendwo im Netz gefunden. Dort hat es allerdings auch nicht geklappt - nur mit ganz anderen Fehlermeldungen. Ich finde es aber im Moment nicht wieder, deswegen kein Link. Da war eine Antwort: All IOCTL_SCSI_MINIPORT requests must begin with an SRB_IO_CONTROL structure. That is then followed by the specific data for the request you are making -- the NVCACHE_REQUEST_BLOCK in this case. So: struct { SRB_IO_CONTROL sic; NVCACHE_REQUEST_BLOCK nrb; } request; The output then contains all of that, plus the NV_FEATURE_PARAMETER: struct { SRB_IO_CONTROL sic; NVCACHE_REQUEST_BLOCK nrb; NV_FEATURE_PARAMETER nfp; } request; Ich habe das mal probiert. Wahrscheinlich habe ich das auch falsch gemacht. Jedenfalls hat es auch nichts gebracht. Möglich wäre tatsächlich die Mindestgröße des Buffers! Gruß Mattze |
AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Hallo,
leider bleibt es erst mal beim falschen Parameter. Ich probiere aber weiter. Vielleicht muss ich im Puffer ja noch das "req.Fct:=NRB_FUNCTION_NVCACHE_INFO;" entsprechend setzen... (Anzunehmen, damit er weiß, was er machen soll...) Gruß Mattze |
AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Zitat:
|
AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?
Hallo,
entschuldigt. Musste das Problem erst mal etwas zur Seite legen, weil was dazwischen kam. Das ist jetzt aber erledigt. Ziel: Ich möchte immer noch die Umdrehungsgeschwindigkeit der HD rauskriegen. Anfangs, um die SSD zu identifizieren und inzwischen aus reiner Neugier, weil ich es eben nicht hinkriege. Laut Internet scheint das mit IOCTL_SCSI_MINIPORT die einzige sinnvolle Methode zu sein. Geht's auch anders? (Aber, wie gesagt, aus Neugier möchte ich jetzt auch IOCTL_SCSI_MINIPORT rauskriegen!) Ein Codeschnipsel wäre schön! Ich habe eine Reihe IOCTLs, die ich problemlos zum Laufen bekommen habe. Ganz unbeleckt bin ich also nicht. (Ach ja: D7prof unter Win7-64.) Gruß Mattze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz