在win10以下,当调用ReadFile函数的时候,第四个参数有这么一个注释:
LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。
但是在win10中,微软默默修补了这个问题,所以这个参数为0也不会造成dos问题了。
我们首先做错误的api调用,结果如下:
原因:在win7 kernelbase.dll中,ReadFile函数没有对第四个参数进行严格判断,而直接对句柄hfile进行了判断,如下图:
接着在调用NtReadFile失败后,赋值一个实际读取的长度ebx,因为ebx传入了0,所以没有地址,所以直接造成了报错。(win10以下版本)