Seite 1 von 1

crc32 [sektorweise] über cd/dvd

Verfasst: 06.10.2006 17:58
von bingo
hier mal ein muster , um das prinzip zu verdeutlichen . bitte noch laufwerksbuchstaben [cd/dvd] bei createfile anpassen ...

es wird hier sektorweise von cd/dvd gelesen .

Code: Alles auswählen

Structure DISK_GEOMETRY
   Cylinders.q
   MediaType.l
   TracksPerCylinder.l
   SectorsPerTrack.l
   BytesPerSector.l 
EndStructure

Structure DISK_GEOMETRY_EX
pp1.DISK_GEOMETRY
DiskSize.q
byte.b[1];
EndStructure

pp.DISK_GEOMETRY_EX

#IOCTL_DISK_BASE                = 7  
#METHOD_BUFFERED                = 0
#FILE_ANY_ACCESS                = 0

;crc - routine by Horst Schaeffer - horst.schaeffe[at]gmx.net

  *CRCtable = AllocateMemory(1024)
  CLD 
  MOV Edi,*CRCtable
  SUB Edx,Edx    
  !.rpt_DX:
  MOV Eax,Edx
  MOV Ebx,8
  !.rpt_BX:
  SHR Eax,1
  !JNC .cont
  XOR Eax,0EDB88320h
  !.cont:
  DEC Ebx
  !JNZ .rpt_BX
  !stosd
  INC Edx
  CMP Edx,256
  !JB .rpt_DX

  
;  Compute CRC32 for data area given by *mem_ pointer and size_,
;  and crc_ of last chunk (first time: 0) 
;  returns (new) CRC

Procedure CRC32compute(*mem_,size_,crc_)
  Shared *CRCtable
  MOV Edi,*CRCtable
  MOV Esi,*mem_
  MOV Edx,size_
  MOV Eax,crc_
  NOT Eax
  !.rpt_EDX:
  XOR Ebx,Ebx
  MOV BL,AL 
  XOR BL,[Esi]
  SHL Ebx,2 
  SHR Eax,8 
  XOR Eax,[Edi+Ebx] 
  INC Esi
  DEC Edx
  !JNZ .rpt_EDX 
  NOT Eax 
ProcedureReturn ;EAX
EndProcedure
;----------------------------------------------------------------

Procedure.l CTL_CODE(DeviceType, Function, Method, Access)
  ProcedureReturn ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
EndProcedure

#FILE_READ_ACCESS = 1
#FILE_DEVICE_CD_ROM = 2
#IOCTL_CDROM_BASE = #FILE_DEVICE_CD_ROM

IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX = CTL_CODE(#IOCTL_CDROM_BASE, $14, #METHOD_BUFFERED, #FILE_READ_ACCESS)


hDevice = CreateFile_("\\.\\E:", #GENERIC_READ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)

If hDevice

DeviceIoControl_(hDevice, IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX,0,0,@pp,SizeOf(pp),@bytesret, 0)

summe_sektoren.l = (pp\DiskSize / pp\pp1\BytesPerSector) - 1

crc.l
proz.f
pmembuf.l = AllocateMemory(pp\pp1\BytesPerSector)

For i=0 To summe_sektoren
proz = (i/summe_sektoren) * 100
Debug StrF(proz,2) + "%"
If ReadFile_(hDevice,pmembuf,pp\pp1\BytesPerSector,@ret,0) = 0
Debug "read error ..."
Break
EndIf
crc = CRC32compute(pmembuf,pp\pp1\BytesPerSector,crc)
Next

FreeMemory(*CRCtable)
FreeMemory(pmembuf)

Debug Hex(crc)

EndIf
8)

wer die crc32-summe prüfen will , kann das z.bsp. mit winhex ... tun .

Verfasst: 05.11.2007 22:05
von scholly
Ich bekomme mit PB 4.02 in Zeile 24 (CLD) einen Syntaxerror :(

scholly, der eigentlich nur die 4 ersten bits einer DVD lesen will ;)

Verfasst: 06.11.2007 09:55
von HeX0R
scholly hat geschrieben:Ich bekomme mit PB 4.02 in Zeile 24 (CLD) einen Syntaxerror :(
Inline ASM Unterstützung aktivieren.

Verfasst: 06.11.2007 11:39
von scholly
HeX0R hat geschrieben:Inline ASM Unterstützung aktivieren.
Habbich jezz jemacht - der nächste Syntax Error:
Zeile 33: XOR Eax,0EDB88320h

Verfasst: 06.11.2007 13:20
von legion
Gute Arbeit ! :D
Funktioniert bei mir Fehlerfrei, auch unter Vista !

Lg. Legion

Verfasst: 09.11.2007 23:00
von scholly
moin, moin...

Da es jetzt unter 4.10 irgendwas macht, ich aber nicht dahinterkomme, was ich ändern müßte:

Mag ein Wissender den Code so ändern, daß nur das erste Byte der CD/DVD (da sollte der Book-Type zu finden sein) Binär im Debugger angezeigt wird ?

bitte, bitte, bitte... scholly