473 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			473 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
.386P
 | 
						||
.MODEL FLAT
 | 
						||
 | 
						||
 | 
						||
 | 
						||
_TEXT Segment dword public 'code'
 | 
						||
      Assume cs:_TEXT, ds:_DATA
 | 
						||
 | 
						||
 | 
						||
; -- Fonctions DPMI --
 | 
						||
public Physical_address_mapping
 | 
						||
public Free_physical_address_mapping
 | 
						||
public Lock_linear_region
 | 
						||
public Unlock_linear_region
 | 
						||
public Allocate_ldt_descriptor
 | 
						||
public Free_ldt_descriptor
 | 
						||
public Set_segment_base_address
 | 
						||
public Set_segment_limit
 | 
						||
public Set_descriptor_access_rights
 | 
						||
public Get_segment_base_address
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Physical_address_mapping proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Physical_address:dword,Physical_size:dword,Linear_address_pointer:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
  ; On met dans BX:CX l'adresse physique … mapper
 | 
						||
  mov  eax,Physical_address
 | 
						||
  mov  cx,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  bx,ax
 | 
						||
 | 
						||
  ; On met dans SI:DI la taille de l'adresse physique … mapper
 | 
						||
  mov  eax,Physical_size
 | 
						||
  mov  di,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  ; On appelle le service DPMI de mappage d'adresse physique
 | 
						||
  mov  ax,0800h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Physical_address_mapping_Erreur
 | 
						||
 | 
						||
    ; On sauve l'adresse lin‚aire … l'adresse donn‚e
 | 
						||
    mov  eax,Linear_address_pointer
 | 
						||
    mov  [eax+00h],cx
 | 
						||
    mov  [eax+02h],bx
 | 
						||
    ; Et on renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Physical_address_mapping_Erreur:
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Physical_address_mapping endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Free_physical_address_mapping proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Linear_address:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
  ; On met dans BX:CX l'adresse lin‚aire … d‚mapper
 | 
						||
  mov  eax,Linear_address
 | 
						||
  mov  cx,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  bx,ax
 | 
						||
 | 
						||
  ; On appel le service DPMI de lib‚ration d'un mappage d'adresse physique
 | 
						||
  mov  ax,0801h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Free_physical_address_mapping_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Free_physical_address_mapping_Erreur:
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Free_physical_address_mapping endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Lock_linear_region proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Linear_address:dword,Linear_size:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
  ; On met dans BX:CX l'adresse lin‚aire … locker
 | 
						||
  mov  eax,Linear_address
 | 
						||
  mov  cx,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  bx,ax
 | 
						||
 | 
						||
  ; On met dans SI:DI la taille de l'adresse lin‚aire … locker
 | 
						||
  mov  eax,Linear_size
 | 
						||
  mov  di,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  ; On appel le service DPMI de lockage d'adresse lin‚aire
 | 
						||
  mov  ax,0600h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Lock_linear_region_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Lock_linear_region_Erreur:
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Lock_linear_region endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Unlock_linear_region proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Linear_address:dword,Linear_size:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
  ; On met dans BX:CX l'adresse lin‚aire … d‚locker
 | 
						||
  mov  eax,Linear_address
 | 
						||
  mov  cx,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  bx,ax
 | 
						||
 | 
						||
  ; On met dans SI:DI la taille de l'adresse lin‚aire … d‚locker
 | 
						||
  mov  eax,Linear_size
 | 
						||
  mov  di,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  si,ax
 | 
						||
 | 
						||
  ; On appel le service DPMI de d‚lockage d'adresse lin‚aire
 | 
						||
  mov  ax,0601h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Unlock_linear_region_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Unlock_linear_region_Erreur:
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Unlock_linear_region endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Allocate_ldt_descriptor proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Nombre_de_descripteurs:word,Base_selector_pointer:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
  ; On met dans CX le nombre de descripteurs ldt … allouer
 | 
						||
  mov  cx,Nombre_de_descripteurs
 | 
						||
 | 
						||
  ; On appel le service DPMI d'allocation de descripteurs ldt
 | 
						||
  mov  ax,0000h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Allocate_ldt_descriptor_Erreur
 | 
						||
 | 
						||
    ; On sauve la valeur du s‚lecteur de base
 | 
						||
    mov  ebx,Base_selector_pointer
 | 
						||
    mov  [ebx],ax
 | 
						||
    ; Et on renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Allocate_ldt_descriptor_Erreur:
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Allocate_ldt_descriptor endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Free_ldt_descriptor proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Selector:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
  push esi
 | 
						||
  push edi
 | 
						||
 | 
						||
  ; On met dans BX le descripteur ldt … lib‚rer
 | 
						||
  mov  bx,Selector
 | 
						||
 | 
						||
  ; On appel le service DPMI de lib‚ration de descripteur ldt
 | 
						||
  mov  ax,0001h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Free_ldt_descriptor_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Free_ldt_descriptor_Erreur:
 | 
						||
 | 
						||
  pop  edi
 | 
						||
  pop  esi
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Free_ldt_descriptor endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Set_segment_base_address proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Selector:word,Linear_base_address:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
  ; On met dans CX:DX l'adresse de base lin‚aire … assigner au segment
 | 
						||
  mov  eax,Linear_base_address
 | 
						||
  mov  dx,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  cx,ax
 | 
						||
 | 
						||
  ; On met dans BX le s‚lecteur auquel il faut assigner l'adresse de base
 | 
						||
  mov  bx,Selector
 | 
						||
 | 
						||
  ; On appel le service DPMI d'assignation d'adresse de base … un segment
 | 
						||
  mov  ax,0007h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Set_segment_base_address_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Set_segment_base_address_Erreur:
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Set_segment_base_address endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Set_segment_limit proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Selector:word,Segment_limit:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
  ; On met dans CX:DX la limite (taille) … assigner au segment
 | 
						||
  mov  eax,Segment_limit
 | 
						||
  mov  dx,ax
 | 
						||
  shr  eax,16
 | 
						||
  mov  cx,ax
 | 
						||
 | 
						||
  ; On met dans BX le s‚lecteur auquel il faut assigner une limite
 | 
						||
  mov  bx,Selector
 | 
						||
 | 
						||
  ; On appel le service DPMI d'assignation de limite … un segment
 | 
						||
  mov  ax,0008h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Set_segment_limit_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Set_segment_limit_Erreur:
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Set_segment_limit endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Set_descriptor_access_rights proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Selector:word,Rights:word
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
  ; On met dans CX les droits … assigner au segment
 | 
						||
  mov  cx,Rights
 | 
						||
 | 
						||
  ; On met dans BX le s‚lecteur auquel il faut assigner des droits
 | 
						||
  mov  bx,Selector
 | 
						||
 | 
						||
  ; On appel le service DPMI d'assignation de droits … un segment
 | 
						||
  mov  ax,0009h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Set_descriptor_access_rights_Erreur
 | 
						||
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Set_descriptor_access_rights_Erreur:
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Set_descriptor_access_rights endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
Get_segment_base_address proc near
 | 
						||
 | 
						||
  push ebp
 | 
						||
  mov  ebp,esp
 | 
						||
 | 
						||
  arg  Selector:word,Linear_base_address_pointer:dword
 | 
						||
 | 
						||
  push ebx
 | 
						||
 | 
						||
  ; On met dans BX le s‚lecteur dont il faut lire l'adresse de base
 | 
						||
  mov  bx,Selector
 | 
						||
 | 
						||
  ; On appel le service DPMI de lecture d'adresse de base d'un segment
 | 
						||
  mov  ax,0006h
 | 
						||
  int  31h
 | 
						||
 | 
						||
  jc   Get_segment_base_address_Erreur
 | 
						||
 | 
						||
    ; On sauve l'adresse de base lin‚aire du segment
 | 
						||
    mov  eax,Linear_base_address_pointer
 | 
						||
    mov  [eax+00h],dx
 | 
						||
    mov  [eax+02h],cx
 | 
						||
    ; On renvoie un code d'erreur nul
 | 
						||
    xor  ax,ax
 | 
						||
 | 
						||
  Get_segment_base_address_Erreur:
 | 
						||
 | 
						||
  pop  ebx
 | 
						||
 | 
						||
  mov  esp,ebp
 | 
						||
  pop  ebp
 | 
						||
 | 
						||
  ret
 | 
						||
 | 
						||
Get_segment_base_address endp
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
_TEXT ENDS
 | 
						||
END
 |