| 
 | 
 
 
发表于 2013-7-11 00:54:34
|
显示全部楼层
 
 
 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
; by 小甲鱼, http://www.fishc.com 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
; 功能:读取硬盘引导扇区并保存于boot.ini文件中 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
        .386 
        .model flat,stdcall 
        option casemap:none 
 
include windows.inc 
include comdlg32.inc 
include user32.inc 
include kernel32.inc 
includelib comdlg32.lib 
includelib user32.lib 
includelib kernel32.lib 
 
    .data 
szFileName  db  '\\.\\physicaldrive0', 0            ; 硬盘设备名 
 
    .data? 
szBuffer        db  512 dup (?) 
@hFile          dd  ? 
@dwBytesRead    dd  ? 
@szLogFile      db  MAX_PATH dup (?) 
 
    .const 
szNewFile       db  'boot.ini', 0 
szErrOpenFile   db  '无法打开硬盘文件!', 0 
szErrCreateFile db  '无法创建boot.ini文件!', 0 
szSuccess       db  '成功读取硬盘引导区并写入boot.ini文件!', 0     
szCaption       db  '鱼C工作室', 0     
     
    .code 
start: 
    invoke CreateFile,              ; 打开或创建文件 
        addr szFileName,            ; 文件的名字 
        GENERIC_READ,               ; 允许读访问 
        FILE_SHARE_READ,            ; 允许对文件进行共享访问 
        0,                          ; 指向一个SECURITY_ATTRIBUTES结构的指针 
        OPEN_EXISTING,              ; 文件必须存在 
        FILE_ATTRIBUTE_NORMAL,      ; 默认属性 
        0 
     
    .if eax == INVALID_HANDLE_VALUE ; 打开文件错误 
        invoke MessageBox, 
            NULL, 
            addr szErrOpenFile, 
            addr szCaption, 
            MB_OK 
             
        jmp exit 
    .endif 
     
    mov @hFile, eax                 ; 返回文件句柄,这时候硬盘被看成是一个文件的哦~ 
     
    invoke ReadFile,                ; 从文件中读取数据 
        @hFile,                     ; 文件句柄 
        addr szBuffer,              ; 用于保存读入数据的缓冲区 
        sizeof szBuffer,            ; 需要读入的字符数 
        addr @dwBytesRead,          ; 实际读入的字节数 
        0 
     
    invoke CloseHandle, @hFile      ; 小甲鱼温馨提醒:记得文件打开后要擦屁股->关闭文件,否则造成内存泄漏 
     
    invoke lstrcpy,                 ; 拷贝字符串 
        addr @szLogFile, 
        addr szNewFile 
     
    invoke CreateFile,              ; 创建boot.ini文件 
        addr @szLogFile,             
        GENERIC_WRITE,               
        FILE_SHARE_READ,             
        0,                           
        CREATE_ALWAYS,               
        FILE_ATTRIBUTE_NORMAL,       
        0 
     
    .if eax != INVALID_HANDLE_VALUE 
        mov @hFile, eax 
         
        invoke WriteFile,           ; 将数据写入boot.ini文件 
            @hFile, 
            addr szBuffer, 
            sizeof szBuffer, 
            addr @dwBytesRead, 
            0 
     
        invoke CloseHandle, @hFile  ; 擦屁股 
         
        invoke wsprintf,            ; 这个事实上常用的函数,如果有问题的鱼油可以在论坛搜索下,有篇文章中小甲鱼已经做好了详细的解释给大家。 
            addr szBuffer, 
            addr szSuccess 
          
        invoke MessageBox, 
            NULL, 
            addr szBuffer, 
            addr szCaption, 
            MB_OK 
             
    .else 
        invoke MessageBox, 
            NULL, 
            addr szErrCreateFile, 
            addr szCaption, 
            MB_OK 
    .endif     
         
exit: 
    invoke ExitProcess, NULL 
         
    end start |   
 
 
 
 |