现在的位置: 首页 > 综合 > 正文

VS2010 fwrite过程

2017年10月20日 ⁄ 综合 ⁄ 共 3357字 ⁄ 字号 评论关闭

fwrite过程

调用fwrite过程:

8BF4                mov         esi,esp 

8B 45F8             mov         eax,dword ptr [fp] 

50                   push        eax 

6A04                push        4 

6A01                push        1 

68 40 5522 61       push        offset string "ddddd"(61225540h) 

FF 15 9082 22 61    call        dword ptr [__imp__fwrite(61228290h)] 

83 C410             add         esp,10h 

3BF4                cmp         esi,esp 

E8 A6 FBFF FF       call        @ILT+310(__RTC_CheckEsp)(6122113Bh) 

89 45E0             mov         dword ptr [wcont],eax 

跟入_imp_fwrite的c++源码

{

size_t>检查size和cout是否为0

if(size ==0>

   >检查文件句柄是否为空

_VALIDATE_RETURN( (stream != NULL) ,EINVAL, 0);

获得文件句柄

_lock_str(stream);                    

__try {

真正的写操作

   >

     }

__finally {

释放文件句柄

    _unlock_str(stream);            /* unlock stream */

    }

返回实际写入的个数

return>

调用的汇编指令为:

5AF15E35 33C0                xor         eax,eax 

5AF15E37 83 7D 1400          cmp         dword ptr [ebp+14h]文件句柄),0 

5AF15E3B 0F 95C0             setne       al 

5AF15E3E 89 45E0             mov         dword ptr [_Expr_val],eax 

5AF15E41 83 7D E000          cmp         dword ptr [_Expr_val],0 

5AF15E45 751E                jne         fwrite+75h (5AF15E65h) 

若文件句柄为空,则执行下面,发送调试报告。不为空则跳转。

5AF15E47 68 9C 58EB 5A       push        offset string L"(stream !=NULL)" (5AEB589Ch) 

5AF15E4C 6A00                push        0 

5AF15E4E 6A4D                push        4Dh 

5AF15E50 68 F0 6DEB 5A       push        offset stringL"f:\\dd\\vctools\\crt_bl"... (5AEB6DF0h) 

5AF15E55 6A02                push        2 

5AF15E57 E8 94 E70A 00       call        _CrtDbgReportW (5AFC45F0h) 

5AF15E5C 83 C414             add         esp,14h 

5AF15E5F 83 F801             cmp         eax,1 

5AF15E62 7501                jne         fwrite+75h (5AF15E65h) 

5AF15E64 CC                   int         3 

5AF15E65 83 7D E000          cmp         dword ptr [_Expr_val],0 

5AF15E69 752A                jne         fwrite+0A5h (5AF15E95h) 

下面也是错误处理。文件句柄不为空继续跳。

5AF15E6B E8 20 C5FE FF       call        _errno (5AF02390h) 

5AF15E70 C7 00 1600 00 00    mov         dword ptr [eax],16h 

5AF15E76 6A00                push        0 

5AF15E78 6A4D                push        4Dh 

5AF15E7A 68 F0 6DEB 5A       push        offset stringL"f:\\dd\\vctools\\crt_bl"... (5AEB6DF0h) 

5AF15E7F 68 DC 6DEB 5A       push        offset string L"fwrite" (5AEB6DDCh) 

5AF15E84 68 9C 58EB 5A       push        offset string L"(stream !=NULL)" (5AEB589Ch) 

5AF15E89 E8 32 F80A 00       call        _invalid_parameter (5AFC56C0h) 

5AF15E8E 83 C414             add         esp,14h 

5AF15E91 33C0                xor        eax,eax 

5AF15E93 EB4C                jmp         $LN12+3 (5AF15EE1h) 

上面的_lock_str(stream)过程

5AF15E95 8B 5514             mov         edx,dword ptr [ebp+14h] 

5AF15E98 52                   push        edx 

5AF15E99 E8 32 B7FF FF       call        _lock_file (5AF115D0h) 

5AF15E9E 83 C404             add         esp,4

就是一文件句柄指针调用_lock_file。下面看以下_lock_file过程。

_lock_file过程

功能如名字,锁住一个文件。

void __cdecl_lock_file (

        FILE *pf

        )

{

        /*

         这里检查文件句柄是否在_iobstdio控制结构数组)范围内。觉得锁的行为是哪种。

         */

        if ((pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )

        {

            /*

             * FILE lies in _iob[] so the locklies in _locktable[].

             */

            _lock( _STREAM_LOCKS + (int)(pf - _iob) );

            /* We set_IOLOCKED to indicate we locked the stream */

            pf->_flag |= _IOLOCKED;

        }

        else

            /*

             * Not part of _iob[]. Therefore,*pf is a _FILEX and the

             * lock field of the struct is aninitialized critical

             * section.

             */

            EnterCriticalSection(&(((_FILEX *)pf)->lock) );

}

抱歉!评论已关闭.