Hi,
First of all, I'm new on this forum and in MASM so sorry if I'm posting in the wrong sections.
Also, my mother-tongue isn't English so excuse me if I've made some errors.
I would like to create a small console executable that can find every file in the current repertory, open the .txt file, and then (for example) replace every letter 'a' with an 'e'.
I've looked a little into the forum and also in the masm32\example repertory but I couldn't found anything similar that didn't open a windows.
However, I've find mdir.asm (in examples\exampl02\dir\) which can be a good start to my program.
So my question is, do you have an example where you open a file, read it and then change it.
Because, I've seen the function GetOpenFileName and CreateFile but even after many tries I couldn't make it work.
Thanks for your help.
Best regards,
you may show us your code that fails?
; build as console program
include \masm32\include\masm32rt.inc
.code
main proc
LOCAL cbRead:DWORD
LOCAL cbWrite:DWORD
LOCAL dwFileSizeHigh:DWORD
LOCAL dwFileSizeLow:DWORD
LOCAL hFile:HANDLE
.if rv(CreateFile,"test.txt",GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
mov hFile,eax
mov dwFileSizeLow,rv(GetFileSize,hFile,ADDR dwFileSizeHigh)
.if !dwFileSizeHigh && dwFileSizeLow <= 5*1024*1024 ; some limit: 5Meg
.if rv(GlobalAlloc,GPTR,dwFileSizeLow)
mov ebx,eax
.if rv(ReadFile,hFile,ebx,dwFileSizeLow,ADDR cbRead,0)
.if cbRead
xor esi,esi
.while esi < cbRead
.if CHAR ptr [ebx+esi] == 'a'
mov CHAR ptr [ebx+esi],'e'
.endif
inc esi
.endw
invoke SetFilePointer,hFile,0,0,FILE_BEGIN
.if rv(WriteFile,hFile,ebx,cbRead,ADDR cbWrite,0)
mov eax,cbRead
.if !cbWrite
print "error: no bytes written",13,10
.elseif eax != cbWrite
print "error: not all bytes written",13,10
.else
print "sucess",13,10
.endif
.else
print "error: can write file",13,10
.endif
.else
print "error: empty file",13,10
.endif
.else
print "error: can read file",13,10
.endif
invoke GlobalFree,ebx
.else
print "error: allocation faild",13,10
.endif
.else
print "file size to large",13,10
.endif
invoke CloseHandle,hFile
.else
print "error: cant't open file",13,10
.endif
inkey
exit
main endp
end main
Hi,
I'm actually at work right now ^^ so I can't post my code, sorry.
However, the one that you've posted seems quite nice, thanks a lot.
There's many things that I don't understand in your code and my main problem is that I can't manage to find any online (or offline) documentation for MASM.
In the MASM32 folder I only found some tutorial and code example but no documentation.
If you know a place where I can find a list of avaible functions with like a description of the function's parameters it would be great.
Thanks again for your help.
Best regards,
seems like there are about a million of them - lol
(10,000 is closer - probably not that many)
for masm - the masm programmer's guide
http://www.box.net/shared/qkpzlg42hf (http://www.box.net/shared/qkpzlg42hf)
for the functions, i don't know if you can still get the MSDN library ISO or not
but, you can just use the MSDN library online
better in some ways, because it has user comments that can be valuable
for example...
new format
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx)
old format
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx)
it is documented for C programmers
not hard to figure out what the asm looks like, though
qWord used the "rv" macro, which is part of the masm32 library
it is documented in \masm32\help\hlhelp.chm under "Code Calling Macros"
basically, it is similar to INVOKE, but offers direct access to the value returned in EAX (return value)
Hyzau,
Use the link below, its the full Borland collection of Microsoft Winhelp files that have all of the older win32 functions. The main file you need in WIN32.HLP. Note that if you are using Vista or Win7 you will need to get the winhelp download from Microsoft.
http://www.masmforum.com/winhelp_files/
Quote from: dedndave on November 20, 2012, 10:13:27 PM
qWord used the "rv" macro, which is part of the masm32 library
it is documented in \masm32\help\hlhelp.chm under "Code Calling Macros"
basically, it is similar to INVOKE, but offers direct access to the value returned in EAX (return value)
Wow thanks !
I've commented qWord's code, I think i've understanded the main part. Correct me if you see any mistakes.
if rv(CreateFile,"test.txt",GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) ; Open the file test.txt and store it in EAX
mov hFile,eax ; Move value of EAX into hFile
mov dwFileSizeLow,rv(GetFileSize,hFile,ADDR dwFileSizeHigh) ; invoke getFileSize, store return value in EAX and move it into dwFileSizeLow. Meanwhile a "high-order doubleword of the file size" is stored into dwFileSizeHigh
.if !dwFileSizeHigh && dwFileSizeLow <= 5*1024*1024 ; some limit: 5Meg
.if rv(GlobalAlloc,GPTR,dwFileSizeLow) ; invoke GlobalAlloc which allocate a "buffer" of fixed size and initializes memory contents to zero. The buffer size is dwFileSizeLow
mov ebx,eax ; store the pointer of the buffer into ebx
.if rv(ReadFile,hFile,ebx,dwFileSizeLow,ADDR cbRead,0) ; invoke ReadFile, read the entire file at once and store the content into ebx
.if cbRead ; if Number Of Bytes Read > 0
xor esi,esi ; i assume that it's like esi = 0
.while esi < cbRead
.if CHAR ptr [ebx+esi] == 'a'
mov CHAR ptr [ebx+esi],'e' ; modify every a of ebx into e
.endif
inc esi
.endw
invoke SetFilePointer,hFile,0,0,FILE_BEGIN ; the file Handle was at the End of file because of Read file
.if rv(WriteFile,hFile,ebx,cbRead,ADDR cbWrite,0) ; write ebx (of size cbRead) into hFile
mov eax,cbRead
.if !cbWrite
print "error: no bytes written",13,10 ; Okay here why 13, 10 ?
.elseif eax != cbWrite
print "error: not all bytes written",13,10
.else
print "sucess",13,10
.endif
.else
print "error: can write file",13,10
.endif
.else
print "error: empty file",13,10
.endif
.else
print "error: can read file",13,10
.endif
invoke GlobalFree,ebx
.else
print "error: allocation faild",13,10
.endif
.else
print "file size to large",13,10
.endif
invoke CloseHandle,hFile
.else
print "error: cant't open file",13,10
.endif
inkey
exit
main endp
end main
There's still one thing, I can't figure out the difference between dwFileSizeHigh and dwFileSizeLow
Once again, thank you very much for your help (and sorry if it was already posted somewhere on the forum)
Best regards,
Quote from: dedndave on November 20, 2012, 10:13:27 PM
for the functions, i don't know if you can still get the MSDN library ISO or not
Windows SDK...
http://www.microsoft.com/en-us/download/details.aspx?id=18950
(To save space, use custom install and only install the documentation for windows desktop)