Avatar billede fracklen Nybegynder
11. oktober 2002 - 21:09 Der er 6 kommentarer

Device Driver til CMOS

Jeg ønsker at aflæse alt hvad der står i min cmos...

har fundet følgende procedure

procedure WriteCmos;
begin
  Num := 0;
  for i := 0 to Max do begin
    asm
      xor ax, ax
      mov al, Num
      out 70h, al  // HER - FEJL!
      in  al, 71h
      mov Info, al
    end;
    Cmos[Num] := Info;
    Inc(Num);
  end;

  Assign(F, 'Cmos.Dta');
  Rewrite(F);
  Write(F, Cmos);
  Close(F);
end;

"Priveleged instruction!"
Det skal vist skrives som en devicedriver?
Og hvodden er det så lige man gør det?
Avatar billede codewarrior Nybegynder
14. oktober 2002 - 15:19 #1
En ting er sikkert, du får ikke en "procedure" til at køre under C/C++ med mindre den er deklareret void, og resten er vist heller ikke lige standard C. Måske skulle du overfører det til Delpi / Pascal.
Så skal jeg senere vende tilbage til hvordan du gør, for det kræver nogle flere krumspring.
Avatar billede codewarrior Nybegynder
15. oktober 2002 - 18:50 #2
Så er jeg klar igen, følgende kan bruges i DOS, dvs at du, hvis Delphi er dit værktøj lig skal konverterer det til 32bit.

Unit CMOS;

Interface

{-------------------------------------------------------------------}

Const  CMOSVersion = '1.10';

{-------------------------------------------------------------------}
{                    Konstanter i unit CMOS                        }
{-------------------------------------------------------------------}

Const  CMOSADDR = $70;      { CMOS p† port 70h  }
      CMOSDATA = $71;      { CMOS data port 71h }

Type  CMOSBUF = Array[0..127] of byte;

{-------------------------------------------------------------------}
{              Funktioner / Procedure i unit CMOS                  }
{-------------------------------------------------------------------}

Function CMOSPresent : Boolean;
Function CMOSSize : Word;
Procedure ReadFromCMOS(Var F : CMOSBUF; Number : Word);
Procedure WriteToCMOS(Var F : CMOSBUF; Number : Word);

Implementation

{-----------------------------------------------------------------------}

Function CMOSPresent : Boolean;Assembler;

Asm
  MOV  AH, 0C0h
  INT  15h
  PUSHF
  POP  AX                    { inspic‚r flagene                        }
  SHR  AX, 1                { ulige,  ingen CMOS                      }
  JNB  @CMOS
  JMP  @NoCMOS
@CMOS:
  XOR  AX, AX
  MOV  AL, BYTE PTR[ES:BX+5] { BIOS Feature information                }
  AND  AL, 20h              { and den 5. bit                          }
  CMP  AL, 00h              { bliver resultatet <> 0h er der CMOS      }
  JE  @NoCMOS              { alt andet kan betyde ingen CMOS          }
  JMP  @EXIT
@NoCMOS:
  XOR  AX, AX                { lever FALSE hvis ingen CMOS              }
@EXIT:
End;

{-----------------------------------------------------------------------}

Function TestByte : Byte; Assembler;

Asm
  MOV    AH,AL              { Save test value in AH                    }
  CLI                                        { Interrupts off          }
  MOV    AL,CL              { Get address in AL                        }
  OUT    CMOSADDR,AL        { Output CMOS address                      }
  MOV    AL,AH              { Get test value in AL                    }
  OUT    CMOSDATA,AL        { Output the test value                    }
  MOV    AL,CL              { Get address in AL                        }
  OUT    CMOSADDR,AL        { Output CMOS address                      }
  IN      AL,CMOSDATA        { Read the test value back                }
  STI                        { Interrupts on                            }
  CMP    AL,AH              { Compare the values                      }
  JE      @OK                { Branch if they're equal                  }
  STC
  JMP    @EXIT              { Set carry and return                    }
@OK:
  CLC                        { Clear carry and return                  }
@EXIT:
End;

{-----------------------------------------------------------------------}

Function CMOSSize : Word;Assembler;

Asm
  MOV  CX,64                { Initialize counter                      }
@GETSIZE:
  CLI                        { Interrupts off                          }
  MOV  AL,CL                { Get address in AL                        }
  OUT  CMOSADDR,AL          { OUTput CMOS address                      }
  IN  AL,CMOSDATA          { Read one byte of CMOS data              }
  MOV  BL,AL                { Save the byte IN BL                      }
  STI                        { Interrupts on                            }
  MOV  AL,0A5h              { Test this byte with alternating 1s and 0s}
  CALL TESTBYTE
  JC  @DONE
  MOV  AL,5Ah                { Test this byte with alternating 1s and 0s}
  CALL TESTBYTE
  JC  @DONE
  MOV  AL,00h                { Test this byte with all 0s              }
  CALL TESTBYTE
  JC  @DONE
  MOV  AL,0FFh              { Test this byte with all 1s              }
  CALL TESTBYTE
  JC  @DONE
  CLI                        { Interrupts off                          }
  MOV  AL,CL                { Get address in AL                        }
  OUT  CMOSADDR,AL          { Output CMOS address                      }
  MOV  AL,BL                { Get original value in AL                }
  OUT  CMOSDATA,AL          { Restore the byte                        }
  STI                        { Interrupts on                            }
  INC  CX                    { Increment counter                        }
  CMP  CX,256                { Loop back for more if CX is less than 256}
  JNE  @GETSIZE
  MOV  AL,80h                { Make sure NMI is enabled                }
  OUT  CMOSADDR,AL          { if this happens to be a PS/2            }
  IN  AL,CMOSDATA
@DONE:
  MOV  AX, CX
End;

{-----------------------------------------------------------------------}

Procedure ReadFromCMOS(Var F : CMOSBUF; Number : Word);Assembler;

Asm
  XOR  AL, AL
  XOR  CX, CX
  LES  DI, F
  CLD
@MAIN:
  CLI
  OUT  CMOSADDR, AL
  IN  AL, CMOSDATA
  STOSB
  STI
  INC  CX
  CMP  CX, NUMBER
  MOV  AL, CL
  JNE  @MAIN
End;

{-----------------------------------------------------------------------}

Procedure WriteToCMOS(Var F : CMOSBUF; Number : Word);Assembler;

Asm
  XOR  AL, AL
  XOR  CX, CX
  LES  SI, F
  CLD
@MAIN:
  CLI
  OUT  CMOSADDR, AL
  LODSB
  OUT  CMOSDATA, AL
  STI
  INC  CX
  CMP  CX, NUMBER
  MOV  AL, CL
  JNE  @MAIN
  MOV  AL, 80h
  OUT  CMOSADDR, AL
  IN  AL, CMOSDATA
End;

{-----------------------------------------------------------------------}

End.

En idé til at vise hvordan du skal gøre, kan du finde ved at downloade filen her http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=265&lngWId=7.
Den viser indholdet af din CMOS.

CodeWarrior
Avatar billede fracklen Nybegynder
16. oktober 2002 - 23:35 #3
Ja - sorry...
Havde fundet koden til delphi (som jeg også er vant til at skrive i...)
Fandt bare ud af at hvis man skal have adgang til "out $70" eller "out $71"
skal man have rettighederne til det fra en device-driver...
Et lille problem jeg er løbet ind i med XP...
Din kode virker fint på 98, men... Da jeg arbejder med XP løser det ikke mit problem.
Avatar billede fracklen Nybegynder
16. oktober 2002 - 23:53 #4
ok... den gad i hvert fald godt at kompile det, men min 98-maskine virker ikke i øjeblikket, så det kan jeg ikke udtale mig om...
Avatar billede fracklen Nybegynder
16. oktober 2002 - 23:58 #5
og hvad angår dit link løber jeg stadig ind i "Privileged Instruction!"

Tror stadig det skal skrives i en device driver...
Avatar billede needs Nybegynder
21. april 2004 - 08:58 #6
Hey... løb lige ind i det samme forleden og "Chries" fandt ud af at man skal bruge PortTalk som kan downloades på http://www.beyondlogic.org/porttalk/porttalk22.zip.... dette er en device driver til c++ og kan også bruges til alle andre programmer men skal så køres med en kormando før og efter exe filen i dospromt....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester