Seite 2 von 3

Verfasst: 22.08.2005 17:16
von MARTIN
Sunny hat geschrieben:memset füllt den angegebenen Speicherbereich mit dem angegebenen Byte in der angegebenen Länge aus.
@Laurin
Anscheinend hast du meine Erkläreung falsch verstanden, aber nach dem posting von Sunny dürfte alles klar sein.
mit int wert füllt
Denk daran - nur das erste Byte.

Verfasst: 22.08.2005 18:52
von Laurin
Danke für eure Hilfe, aber ich bin auf noch mehr Probleme gestoßen.

C++-Code:

Code: Alles auswählen

typedef struct _GETVERSIONOUTPARAMS {
	BYTE	bVersion;
	BYTE	bRevision;
	BYTE	bReserved;
	BYTE	bIDEDeviceMap;
	DWORD	fCapabilities;
	DWORD	dwReserved[4];
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;

Code: Alles auswählen

GETVERSIONOUTPARAMS VersionParams;

if ((hSMARTIOCTL = OpenSMART()) != INVALID_HANDLE_VALUE)
    {
	memset((void*)&VersionParams, 0, sizeof(VersionParams));

	if ( DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION,
			NULL, 
			0,
			&VersionParams,
			sizeof(VersionParams),
			&cbBytesReturned, NULL) )
PB-Code:

Code: Alles auswählen

Structure GETVERSIONOUTPARAMS
  bVersion.b
  bRevision.b
  bReserved.b
  bIDEDeviceMap.b
  fCapabilities.l
  dwReserved.l[4]
EndStructure

VersionParams.GETVERSIONOUTPARAMS

hSMARTIOCTL.l = OpenSMART()
Debug hSMARTIOCTL
Debug GetLastError_() ; alles Ok

If hSMARTIOCTL
  If DeviceIOControl_(hSMARTIOCTL, #DFP_GET_VERSION, #NUL, 0, VersionParams, SizeOf(GETVERSIONOUTPARAMS), cbBytesReturned, 0)
     debug GetLastError_() ; Fehler 122
Ich bekomme immer den Error-Code 122 (zuwenig Daten übergeben bzw. Puffer zu klein).

Jemand eine Idee, woran es liegt?

Verfasst: 22.08.2005 19:44
von Ynnus
Vielleicht solltest du die Funktion richtig benutzen. Also die Funktion benötigt beispielsweise ein paar Pointer als Parameter, bei dir seh ich da keine.

Code: Alles auswählen

BOOL DeviceIoControl(

    HANDLE hDevice,	// handle to device of interest
    DWORD dwIoControlCode,	// control code of operation to perform
    LPVOID lpInBuffer,	// pointer to buffer to supply input data
    DWORD nInBufferSize,	// size of input buffer
    LPVOID lpOutBuffer,	// pointer to buffer to receive output data
    DWORD nOutBufferSize,	// size of output buffer
    LPDWORD lpBytesReturned,	// pointer to variable to receive output byte count
    LPOVERLAPPED lpOverlapped 	// pointer to overlapped structure for asynchronous operation
   );	
 
So sieht's aus, also solltest du erstmal alle Parameter die einen Pointer benötigen auch so angeben. Der vorletzte Parameter zeigt dabei auf eine Variable des Typs Double Word (in PB wohl als Long handzuhaben). Du setzt da direkt eine Variable ein, keine Angabe zum Speicherbereich sondern direkt die Variable. Er will dann in den Speicherbereich, auf den die Variable pointet etwas schreiben, geht aber nicht, da die Variable frisch erstellt ist und keinen Speicherbereich beinhaltet. Daher vielleicht der Fehler, dass zu wenige Daten übergeben wurden.
Ist natürlich nur eine Vermutung und ungetestet, aber wär' ein Versuch wert.
Ist schon manchmal ganz gut wenn man Variablen nicht on-the-fly deklarieren kann sondern es sorgfältig vor Benutzung machen muss, da spart man sich manchmal Fehler ein.
Also entweder die Variable vorher deklarieren und per @ dann auf sie pointen oder einen richtigen Pointer erstellen der auf eine Variable zeigt oder aif einen allocierten Bereich von 4 Byte Größe.

Verfasst: 22.08.2005 20:01
von Laurin
-Gelöscht -


Edit: Hat geklappt, danke für die Hilfe.

Verfasst: 23.08.2005 19:15
von Laurin
So, wieder etwas <)

Code: Alles auswählen

bIDCmd = (VersionParams.bIDEDeviceMap >> i & 0x10) ? \
         IDE_ATAPI_ID : IDE_ID_FUNCTION;
Alles bis auf das "\" ist klar. Dient das zur Erkennung für den Compiler, dass die Sache in der nächsten Zeile weitergeht?

Mein (vorläufiger) PB-Code dazu:

Code: Alles auswählen

If VersionParams\bIDEDeviceMap >> i & $10
  bIDCmd = #IDE_ATAPI_ID
Else
  bIDCmd = #IDE_ID_FUNCTION
EndIf

Verfasst: 23.08.2005 22:06
von Deeem2031
Laurin hat geschrieben:So, wieder etwas <)

Code: Alles auswählen

bIDCmd = (VersionParams.bIDEDeviceMap >> i & 0x10) ? \
         IDE_ATAPI_ID : IDE_ID_FUNCTION;
Alles bis auf das "" ist klar. Dient das zur Erkennung für den Compiler, dass die Sache in der nächsten Zeile weitergeht?
Genauso ist es und dein Code müsste korrekt sein.

Verfasst: 23.08.2005 23:26
von Laurin
Danke schön.

Seit wann proggst du denn in C++, Deeem? Auf der LAN damals hast du es glaubig noch nichht getan.

Verfasst: 23.08.2005 23:30
von Deeem2031
Ich progg auch heut noch kein C++, allerdings versuch ich mich grad mit DirectInput (siehe "Code, Tipps und Tricks") und Direct3D auseinander zu setzen und dann muss man nunmal einige C++-Codes lesen, sonst kommt man da nicht weit ;)

Verfasst: 24.08.2005 00:10
von Laurin
Deeem2031 hat geschrieben:I muss man nunmal einige C++-Codes lesen, sonst kommt man da nicht weit ;)
Das kenne ich. Ich versuche mich gerade an dem S.M.A.R.T.-Feature der Festplatten. Ist auch nicht gerade einfach. Davon mal abgesehen, dass es nicht sonderlich viel Dokumentation gibt, wie man die Festplatten ansprechen kann. Ja, ja.. wir Progger eben <)

Verfasst: 24.08.2005 14:02
von Deeem2031
Laurin hat geschrieben:
Deeem2031 hat geschrieben:I muss man nunmal einige C++-Codes lesen, sonst kommt man da nicht weit ;)
Ein Zitat ist eine Kopie des Orginaltextes, in der man keine Änderungen vornehmen darf, so hab ichs jedenfalls mal in Deutsch gelernt ;)