Back to home page

DOS ain't dead

Forum index page

Log in | Register

Back to the forum
Board view  Mix view

FAT32 search on GPT partition (Announce)

posted by CandyMan, 03.07.2024, 20:55

> > This code may be added to EDR-DOS sources.
>
> As I said: just 187 assembly lines (including empty lines).
>
> probably more like 50 lines in C.
>
> What is missing is the part where partition start and ending offsets are
> beyond 2^32 (almost trivial) AND WHERE TO STORE these offsets, adding them
> to
> LBA48 offsets before passing them to the BIOS.

I made some small corrections. Thanks.

GPT_Signature           equ 00h
GPT_Revision            equ 08h
GPT_HeaderSize          equ 0Ch
GPT_HeaderCRC           equ 10h
GPT_Reserved            equ 14h
GPT_CurrentLBA          equ 18h
GPT_BackupLBA           equ 20h
GPT_FirstUsableLBA      equ 28h
GPT_LastUsableLBA       equ 30h
GPT_DiskGUID            equ 38h
GPT_PartitionsLBA       equ 48h
GPT_PartitionNumber     equ 50h
GPT_PartitionEntrySize  equ 54h

GPTEntry_PartitionGUID  equ 00h
GPTEntry_uniqGUID       equ 10h
GPTEntry_StartLBA       equ 20h
GPTEntry_EndLBA         equ 28h
GPTEntry_Attributes     equ 30h
GPTEntry_Name           equ 38h

        db      'GPT',0         ;gpt code flag

gpt_init:
        nop                     ;to modify by hex editor to "ret" - 0xC3
        mov     dl,80h          ;start from 1st hard disk
       ;push    di
ya_gpt:
        xor     di,di           ;\ start from zero partition
        xor     bx,bx           ;/

again_gpt:
        cmp     nunits,MAXPART          ; do we already have the maximum?
         jae    lt_gpt                  ; skip if space for more units

        lea     si,diskaddrpack         ; pointer to disk address packet
        mov     word ptr [si+ 8],1      ;\ make dword = 1
        and     word ptr [si+10],0      ;/
        push    bx
        call    login_read_dx_lba       ; read sector
        pop     bx
        jc      no_gpt
        mov     si,CG:local_buffer      ; check if sector start
        lodsw                           ; with "EFI PART" string
        cmp     ax,"FE"
        jnz     no_gpt
        lodsw
        cmp     ax," I"
        jnz     no_gpt
        lodsw
        cmp     ax,"AP"
        jnz     no_gpt
        lodsw
        cmp     ax,"TR"
        jnz     no_gpt

        ; start from, qword = 2?
        cmp     word ptr [si+GPT_PartitionsLBA-4*2+0],2
        jnz     no_gpt
        xor     ax,ax
        cmp     [si+GPT_PartitionsLBA-4*2+2],ax
        jnz     no_gpt
        cmp     [si+GPT_PartitionsLBA-4*2+4],ax
        jnz     no_gpt
        cmp     [si+GPT_PartitionsLBA-4*2+6],ax
        jnz     no_gpt

        ; partition size, qword = 80h?
        cmp     word ptr [si+GPT_PartitionEntrySize-4*2+0],0080h
        jnz     no_gpt
        cmp     word ptr [si+GPT_PartitionEntrySize-4*2+2],ax
        jnz     no_gpt

        ; save number of partitons
        push    word ptr [si+GPT_PartitionNumber-4*2+2]
        push    word ptr [si+GPT_PartitionNumber-4*2+0]

        ; save LBA sector number (dword)
        push    word ptr [si+GPT_PartitionsLBA-4*2+2]
        push    word ptr [si+GPT_PartitionsLBA-4*2+0]

        lea     si,diskaddrpack

        ; copy LBA sector number to packet and load this sector
        pop     word ptr [si+ 8]
        pop     word ptr [si+10]
        ; make partition number division by 4
        mov     ax,di
        mov     cx,bx
        shr     cx,1
        rcr     ax,1
        shr     cx,1
        rcr     ax,1
        ; add division result to the sector number
        add     word ptr [si+ 8],ax
        adc     word ptr [si+10],cx

        push    bx
        call    login_read_dx_lba       ; read sector
        pop     bx
        jc      er_gpt

        ; make pointer to 128 bytes structure in sector (512/128=4)
        mov     ax,di
        and     ax,3
        mov     cl,80h
        mul     cl
        add     ax,CG:local_buffer
        mov     si,ax

        ; StartLBA >= 2^32
        mov     ax,[si+GPTEntry_StartLBA+4+0]
        or      ax,[si+GPTEntry_StartLBA+4+2]
        jnz     nx_gpt

        ; load LBA disk starting sector number
        mov     ax,[si+GPTEntry_StartLBA+0*8+0]
        mov     cx,[si+GPTEntry_StartLBA+0*8+2]
        ; save partition start
        mov     word ptr [partstart+0],ax
        mov     word ptr [partstart+2],cx
        ; zero ?
        or      ax,cx
        jz      nx_gpt

        ; if partition finish (dword +4)<>0 then skip (EndLBA >= 2^32)
        mov     ax,[si+GPTEntry_EndLBA+4+2]
        or      ax,[si+GPTEntry_EndLBA+4+0]
        jnz     nx_gpt

        ; save partition finish
        mov     ax,[si+GPTEntry_EndLBA+2]
        mov     word ptr [partend+2],ax
        mov     ax,[si+GPTEntry_EndLBA+0]
        mov     word ptr [partend+0],ax

        mov     ax,word ptr [partstart+0]
        mov     cx,word ptr [partstart+2]

        ; compute partition size
        mov     si,word ptr [partend+0]
        sub     si,ax
        mov     word ptr [part_size+0],si
        mov     si,word ptr [partend+2]
        sbb     si,cx
        jc      nx_gpt                  ; overflow? yes, skip
        mov     word ptr [part_size+2],si
        add     word ptr [part_size+0],1
        adc     word ptr [part_size+2],0

        lea     si,diskaddrpack         ; pointer to disk address packet
        mov     word ptr [si+ 8],ax
        mov     word ptr [si+10],cx
        push    bx
        call    login_read_dx_lba       ; read 1st partition sector
        pop     bx
        jc      nx_gpt

        mov     si,CG:local_buffer
        mov     ax,[si+52h]             ;\
        cmp     ax,"AF"                 ; \
        jnz     nx_gpt                  ;  > = "FAT"? to skip NTFS
        mov     al,[si+54h]             ; /
        cmp     al,"T"                  ;/
        jnz     nx_gpt

        mov     [parttype],FAT32X_ID

        pushx   <di,bx,dx>
        call    login_p0        ; add and register new disk
        popx    <dx,bx,di>
nx_gpt:
        add     di,1            ;\ next partition
        adc     bx,0            ;/

        pop     ax              ;\ left partitions
        pop     cx              ;/

        cmp     cx,bx
        jnz     again_gpt
        cmp     ax,di
        jnz     again_gpt

        jmp     no_gpt
er_gpt:
        add     sp,2*2
no_gpt:
        inc     dl              ; next hard disk to check
        jnz     ya_gpt          ; if ZF=0 jump
lt_gpt:
       ;pop     di
        ret

 

Complete thread:

Back to the forum
Board view  Mix view
22049 Postings in 2034 Threads, 396 registered users, 78 users online (0 registered, 78 guests)
DOS ain't dead | Admin contact
RSS Feed
powered by my little forum