Announcement

Collapse
No announcement yet.

Problem mit DWORD...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit DWORD...

    Hallo,

    Ich habe folgenden C++ code:

    typedef struct tagIOCTLParams
    {
    DWORD dioc_IOCtlCode;
    PVOID dioc_InBuf;
    } IOCTLPARAMS, *PIOCTLPARAMS;

    ...
    PIOCTLPARAMS p;
    char buf[128];

    _snprintf (buf, 128,
    "IOCTL is: %i",
    p->dioc_IOCtlCode);

    Aber %i scheint falsch zu sein, da ich immer einen Wert von beispielsweise "-1475374670" statt "-2080374773" bekomme.

    Was mache ich falsch?

    Tschüss Tim

  • #2
    Hallo,<br>
    <br>
    das Problem ist, dass ein DWORD ein unsigned Wert ist, es sind keine Vorzeichen vorhanden. Wenn man in sprintf %i als Platzhalter verwendet will das Programm aber einen signed Wert einfügen, daher kommte das Problem. Statt %i muss man %u ( für unsigned ) verwenden, dann funktionniert es. <br>
    <br>
    mfg<br>
    Simon Rot

    Comment


    • #3
      Hallo Simon,

      danke für den Hinweis.

      Nun steht aber ein weiters Problem vor der Tür und zwar sieht die vollständige Definition von PIOCTLPARAMS eigentlich so aus:
      <pre>
      typedef struct tagIOCTLParams
      {
      PCLIENT_STRUCT dioc_pcrs;
      VMHANDLE dioc_hvm;
      DWORD dioc_VxdDDB;
      DWORD dioc_IOCtlCode;
      <b>PVOID dioc_InBuf;</b>
      DWORD dioc_cbInBuf;
      PVOID dioc_OutBuf;
      DWORD dioc_cbOutBuf;
      PDWORD dioc_bytesret;
      OVERLAPPED* dioc_ovrlp;
      DWORD dioc_hDevice;
      DWORD dioc_ppdb;
      } IOCTLPARAMS, *PIOCTLPARAMS;
      </pre>

      Jetzt möchte ich aber noch den "dioc_InBuf" der von der Anwendung kommt auslesen, dabei bekomme ich aber immer Werte wie "o0_*...".

      <pre>
      _snprintf (buf, 128,
      "dwIoCtrlCode: %u\t lpInBuf: %s\t lpOutBuf %s\t lpdBytesRet: %d\n",
      p->dioc_IOCtlCode,
      p->dioc_InBuf,
      p->dioc_OutBuf,
      p->dioc_bytesret);
      </pre>

      Ich denke das liegt daran, dass noch ein Struct wie dieser beispielsweise:
      <pre>
      #pragma pack(1)
      typedef struct {
      ULONG seq;
      LARGE_INTEGER perftime;
      LARGE_INTEGER datetime;
      char text[0];
      } ENTRY, *PENTRY;
      #pragma pack()
      </pre>

      Ist es möglich den Aufbau dieses Struct herauszufinden und somit InBuf korrekt auszuwerten?

      Tschüss Ti

      Comment


      • #4
        Hallo Tim,<br>
        <br>
        ich kenne diese klassen, mit denen du hier arbeitest nicht. Rein theoretisch kann sich aber hinter einen PVOID so gut wie alles verbergen. In diesem Fall handelt es bei dioc_InBuf <b>vermutlich</b> um einen reinen Puffer, der nur mit den eingehenden zeichen gefüllt wird. Hast du schon mal versucht dioc_InBuf einfach zu derefenzeiren?? Dann müsste dein code so aussehen: <br>
        <pre>
        _snprintf (buf, 128,
        "dwIoCtrlCode: %u\t lpInBuf: %s\t lpOutBuf %s\t lpdBytesRet: %d\n",
        p->dioc_IOCtlCode,
        *(p->dioc_InBuf),
        *(p->dioc_OutBuf),
        *(p->dioc_bytesret));
        </pre>
        <br>
        Schau mal ob es so funktioniert.<br>
        <br>
        mfg<br>
        Simon Rot

        Comment


        • #5
          Hallo Simon,

          danke für den Tipp, aber leider bekomme ich "error C2100: Zeigeroperation ungültig" zurück.

          Um es mal etwas konkreter zu machen (vielleicht hilft dies etwas):
          Ich möchte einen VxD programmieren, der die Daten, die von der Anwendung kommt einliest (in Vaiable "buf") und auswertet.

          Aber die Anwendung scheint eine spezielle <b>struct</b>ure für den InBuf festzulegen...

          Tschüss Ti

          Comment


          • #6
            Hallo Tim, <br>
            <br>
            bei dioc_InBuff und dioc_OutBuff handelt es sich um Speicherbereiche, die mit so gut wie allem "gefüllt" sein können! Es ist von dem Treiber abhängig, welche Daten er in diesen Speicher schreibt bzw. darin erwartet! Für den Fall, dass darin ein String Wert enthalten ist sollte es mit dem folgenden Code klappen:<br>
            <br>
            <pre>
            _snprintf (buf, 128,
            "dwIoCtrlCode: %u\t lpInBuf: %s\t lpOutBuf %s\t lpdBytesRet: %d\n",
            p->dioc_IOCtlCode,
            (char*)p->dioc_InBuf,
            (char*)p->dioc_OutBuf,
            p->dioc_bytesret);
            </pre>
            <br>
            Du musst einfach die Puffer in den entsprechenden Typ Casten - eventuell auch die pointer dereferenzieren!<br>
            <br>
            Hast du eigentlich schon mal in der DDK Hilfe nach gesehen?<br>
            <br>
            mfg <br>
            Simon Roth<br>
            <br>
            ps: such mal in google nach PIOCTLPARAMS da findest du einiges

            Comment


            • #7
              Es ist aber nicht anzunehmen, daß ein String in diesem Speicherbereich steht - sonst hätte man nicht PVOID genommen.

              Ich würde die Daten mal in eine Datei schreiben und dann in aller Ruhe mit einem HEX-Editor studieren.

              Gruß - Günthe
              Günther

              Comment

              Working...
              X