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
