[ASM] ReadFile - String

12/14/2013 19:07 ​Tension#1
Hallo,
ich habe ein Problem mit dem Auslesen eines Strings von einer Datei ( MASM ).
Meine Vorgehensweise:
  1. 1 Byte Lesen für die Länge des Strings
  2. Allozieren von Speicher für den String
  3. Auslesen des Strings mit ReadFile

es sieht bei mir so aus:
Code:
	LOCAL dwRead:DWORD, dwAddr:DWORD, dwSize:DWORD, dwK:DWORD
	mov dwRead, 0
	mov dwAddr, 0
	mov dwSize, 0
	pushad
	invoke FILE_Read, 1   // 1 Byte lesen für die Länge des Strings
	mov dwK, eax    
	mov esi, dword ptr ds:[eax]
	mov dwSize, esi  // Länge verstauen
	invoke FILE_Alloc, esi //Allozieren von Speicher
	mov dwAddr, eax // Adresse verstauen
	invoke ReadFile, FILE_Handle, dwAddr, dwSize, addr dwRead, 0 // lesen des Textes
	invoke FILE_Free, dwK
	popad
	mov eax, dwAddr
	ret
mein Problem ist nun das die maximale Länge 0xFF beträgt. Nun gibt es aber auch Strings die sind 0x102 Bytes lang und ab da funktioniert mein Programm nicht mehr richtig. Hätte jemand eine Idee wie ich bestimmen kann ob er nun ein Byte als länge oder ein Word als länge lesen soll?

#Gelöst.
Lösung:
Anscheinend ist die länge der Strings nie 0xFF lang, das heißt ich kann einfach überprüfen ob die Länge 0xFF ist und wenn ja soll er ein WORD lesen anstatt ein Byte als Länge
Code:
LOCAL dwRead:DWORD, dwAddr:DWORD, dwSize:DWORD, dwK:DWORD
	mov dwRead, 0
	mov dwAddr, 0
	mov dwSize, 0
	pushad
	invoke FILE_Read, dwReadSize
	mov dwK, eax
	mov esi, dword ptr ds:[eax]
	cmp esi, 255
	jne @NotBigger
	invoke FILE_Free, dwK
	invoke FILE_Read, 2
	mov esi, dword ptr ds:[eax]
	@NotBigger:
	mov dwSize, esi
	invoke FILE_Alloc, esi
	mov dwAddr, eax
	invoke ReadFile, FILE_Handle, dwAddr, dwSize, addr dwRead, 0
	invoke FILE_Free, dwK
	popad
	mov eax, dwAddr
	ret
12/14/2013 19:40 マルコ#2
lies 2 Byte, schau ob der erste Byte 0xFF ist. Falls ja musst du den 2. gelesenen Byte auch noch einbeziehen. Sonst musst du den Pointer im File eine stelle zurück setzen.
12/14/2013 19:43 ​Tension#3
Hab es schon gelöst.
Nach deiner Aussagen wäre es ja so das 256 z.B 0xFF 0x01 wäre aber es wäre ja 0x00 0x01.
Es ist so das wenn in der Datei die länge ein WORD sein soll steht die normale länge mit dem Wert 0xFF da wodurch man einen Check machen kann und wenn es 0xFF ist soll er einfach ein WORD lesen.
Beispiel:
0xFF 0x02 0x01
1 Byte Lesen => 0xFF
Wenn der Wert 0xFF beträgt dann soll ein WORD gelesen werden.
2 Bytes Lesen => 0x02 0x01 -> 0x102 -> 258
12/14/2013 19:57 マルコ#4
stimmt, da hast du Recht. Gut, dass du es selber gelöst hast^^