2017-07-19 116 views
-2

我知道關於從用戶模式與內核模式進行通信,我也知道事件/反向調用,但是我需要發送一個字符串值到用戶模式進程從一個內核模式設備驅動程序,然後在KM中等待響應(例如TRUE或FALSE BOOLEAN)。內核模式到用戶模式通信

取出字符串「c:\ file.txt」。現在我需要KM設備驅動程序將該字符串發送到用戶模式,然後讓UM程序重新發回TRUE或FALSE響應以供驅動程序處理。

我已經經歷了很多網站主題/帖子,文檔樣本,並且找不到我在找什麼。

我在想,也許我可以安裝在用戶模式程序,直到響應返回其只是繼續等待數據下來,然後在KM我莫名其妙地暫停一個線程...不知道

任何幫助表示讚賞。

+0

歡迎來到Stack Overflow。您的帖子目前的形式不清楚,不適合Stack Overflow。請訪問[幫助中心](http://stackoverflow.com/help)並閱讀[如何提出一個好問題]部分(http://stackoverflow.com/help/how-to-ask)。 –

+0

規範方法是一個IOCTL。用戶模式調用是DeviceIoControl函數。您可以在單獨的線程中調用它或使用異步I/O。內核模式驅動程序到達時可能處理這種請求的方式之一是將其重新配置到單獨的隊列中,該隊列被配置爲使用手動調度方法;這樣,當您需要將消息發送到用戶模式時,您只需使用WdfIoQueueRetrieveNextRequest將掛起的請求拉出隊列,然後按正常方式完成。 –

+0

......來自驅動程序的消息應該可能包含某種ID號,以便當用戶模式程序發送IOCTL來表示「真」或「假」時,它可以包含ID號,以便驅動程序知道哪個IOCTL正在迴應的消息。 –

回答

0

您可能需要三個IOCTL。

  1. IOCTL_READ_FROM_KERNEL。最初在連接後發送,並等待第一個內核消息
  2. IOCTL_RESPOND_AND_READ_FROM_KERNEL。發送響應,並等待下一條消息。
  3. IOCTL_RESPOND。發送回覆。

用戶模式代碼調用IOCTL。 IOCTL_RESPOND立即返回,並且線程可能退出。

其他2個IOCTL將等待內核有東西發送。這將包括某些可用於識別消息的ID形式。 當內核有消息時,它可以尋找等待的UM線程發送給或者排隊等待消息以供以後傳送。

當UM連接時,它將取消傳遞隊列或添加到服務器隊列中。

0

您有許多選項。

  1. 端口
  2. 命名管道
  3. 待定的IOCTL
  4. 代碼注入
  5. 共用活動 - >現在讀取來自用戶模式一個配置文件

第一次提到的技術是正式支持File-System Mini-Filter設備驅動程序,#3和#5相對比較簡單。然而,#2和#4更復雜,更不可靠/合適的9次,超出10個。

但是,您可以使用一些未公開的魔法實現命名管道,可以從KeServiceDescriptorTable中提取NtCreateNamedPipeFile的地址。 NtCreateNamedPipeFile將依賴於IoCreateFile - IoCreateFile是一個導出的內核模式例程,您可以自由訪問。在內核模式下,對於命名管道服務器來說,其他一切都很簡單,如果你只是在客戶端實現之後,它就更簡單了,因爲你只需要使用簡單的Native API例程,比如ZwCreateFile,ZwWriteFile,ZwReadFile,等等

我建議你看一下端口進行通信,微軟在GitHub上有它自己的一些樣本。

相關問題