【发布时间】:2017-02-08 11:53:38
【问题描述】:
我需要 Windows x64 程序集中的代码:
a) 以非阻塞方式从用户键盘(stdin)读取数据。
b) 检查是否有数据的方法,以便我知道我应该已经调用 readFile 还是跳过这一步
c) 修复我目前所做的实现
到目前为止,我尝试了 PeekNamedPipe 函数,但它似乎不起作用。这是我到目前为止的代码:
mov rcx, dword -10
sub rsp, 28h
call GetStdHandle
add rsp, 28h
mov [std_in_handle], rax
sub rsp, 30h
mov rcx, qword [std_in_handle]
mov rdx, qword 0
mov r8d, dword 0
mov r9, qword 0
mov qword [rsp+0x20], bytes_available
mov qword [rsp+0x28], 0
call PeekNamedPipe
add rsp, 30h
cmp dword [bytes_available], dword 0
je .skip_reading_input
sub rsp, 28h
mov rcx, qword [std_in_handle]
mov rdx, qword input_char
mov r8d, dword 1
mov r9, qword BytesRead
mov qword [rsp+0x20], 0
call ReadFile
add rsp, 28h
.skip_reading_input
问题是 bytes_available 中的值始终为 0,即使我在键盘上键入了一些内容,所以 readfile 总是被跳过。
【问题讨论】:
-
对于控制台子系统,您可以使用GetNumberOfConsoleInputEvents 或PeekConsoleInput。对于 Windows 子系统,通常的消息驱动范例就可以了。
-
如果它满足您的需求,您最好明确打开
CON的句柄,而不是使用标准输入。这样,您知道它是一个控制台设备并且可以使用控制台功能。如果你不得不使用stdin,你需要做的第一件事就是弄清楚它是什么类型的句柄,即它是一个控制台、一个管道还是一个文件,并做出相应的行为。或者使用线程。
标签: windows assembly keyboard 64-bit stdin