crc32 [sektorweise] über cd/dvd

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

crc32 [sektorweise] über cd/dvd

Beitrag 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 .
1:0>1
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 ;)
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

scholly hat geschrieben:Ich bekomme mit PB 4.02 in Zeile 24 (CLD) einen Syntaxerror :(
Inline ASM Unterstützung aktivieren.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

HeX0R hat geschrieben:Inline ASM Unterstützung aktivieren.
Habbich jezz jemacht - der nächste Syntax Error:
Zeile 33: XOR Eax,0EDB88320h
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Gute Arbeit ! :D
Funktioniert bei mir Fehlerfrei, auch unter Vista !

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten