AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IOCTL_SCSI_MINIPORT: Wer weiß, wie?

Ein Thema von Mattze · begonnen am 1. Apr 2012 · letzter Beitrag vom 19. Apr 2012
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 1. Apr 2012, 14:00
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:
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;
Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 1. Apr 2012, 22:24
Hast Du es mal mit "packed" versucht?
Z.B. bei NV_FEATURE_PARAMETER sollte das schon Auswirkungen haben.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 2. Apr 2012, 02:30
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?
Die Strukturen an sich sind schon richtig, auch wenn in anderem Zusammenhang i.A. die Deklaration als "packed record" meistens unerlässlich ist (aber Achtung: es gibt auch Ausnahmen, bei denen man das nicht machen darf).

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:
Const
  IDENTIFY_BUFFER_SIZE = 512;
  DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE;
  BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize;
Somit muss es in Deiner Prozedur Test also entsprechend abgeändert werden:
Code:
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 ...
{....}
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).
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#4

AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 2. Apr 2012, 07:34
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
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 2. Apr 2012, 07:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 16. Apr 2012, 20:51
Vielleicht muss ich im Puffer ja noch das "req.Fct:=NRB_FUNCTION_NVCACHE_INFO;" entsprechend setzen...
Problem schon gelöst? Wenn nicht, gib uns doch mal eine genaue Aussage was du erreichen möchtest (siehe Kommentar von ASM). Wir können dir zwar auf abstrakter Ebene erklären wie etwas funktionieren sollte, ohne Beispielanwendung mag das aber für dich ebenso undurchsichtig bleiben, es sei denn du setzt dich mit der Dokumentation (MSDN) auseinander.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#7

AW: IOCTL_SCSI_MINIPORT: Wer weiß, wie?

  Alt 19. Apr 2012, 07:04
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

Geändert von Mattze (19. Apr 2012 um 07:05 Uhr) Grund: Hinweis auf Entwicklungsumgebung
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz