問題タブ [windows-kernel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1782 参照

windows-kernel - Linux プロセスの Windows サブシステムから Win32/NT ネイティブ API を呼び出しますか?

Windows Subsystem for Linux (WSL) 内の Linux バイナリから Windows API 関数を呼び出すにはどうすればよいですか? これを行う方法が文書化されていないことは確かですが、試してみると面白いかもしれません。

Win32 関数を呼び出すことに興味があります。それが不可能な場合は、少なくとも Windows NT ネイティブ API (Nt*、Zw*) を呼び出します。Linux プロセス (lxss) を実行するコンポーネントはこれらの API に依存しているため、ネイティブ API は少なくとも利用可能である必要があります。

Windows DLL をロードするために、LoadLibrary のようなカスタム関数を作成する必要がある場合があります。もう 1 つのアイデアは、プロセス メモリを検索して、カーネル関数の既知の部分 (つまり、ユーザー モードのエントリ ポイント) を探すことです。

誰かがこれを試して、解決策を共有したいですか?

0 投票する
2 に答える
586 参照

debugging - WinDBG のコマンドのカテゴリは?

WinDBG のコマンドに関する参考文献やチュートリアルをいくつか見ました。lmこれ、これ.echo、これ、!runningこれが好きな人もいますnt!_PDB

これらのカテゴリの違いは何ですか

  • xxx
  • .xxx
  • !xxx
  • xxx!yyy

?

彼らはとても混乱しているように見えます。

0 投票する
0 に答える
468 参照

javascript - Javascript で PrintScreen のキーダウン イベントがないのはなぜですか?

これは非常に単純明快な質問ですが、その答えを突き止めるのは非常に難しいようです。

javascriptでprintscreenのキーダウンイベントがないのはなぜですか?

Firefox のソース コードの一部を調べて、意図的に VK_SNAPSHOT を別の方法で処理して、意図的にキャッチできないようにしているかどうかを確認しようとしましたが、何も見つかりませんでした。

C# もこの問題を共有しているため ( KeyDown event not Working on PrintScreen Key )、これは Windows OS スタックのかなり下にあるようです。私はグーグルで検索しようとしましたが、サポートするドキュメントを見つけることができませんでした。

printscreen キーダウン イベントはカーネルによって直接処理され、Ctrl-alt-delete 割り込みのようにユーザー ランドにヒットすることはありませんか? これはキーボード ドライバーで発生し、別のキーボード ドライバーがそれをスタックから javascript に渡す可能性がありますか? 私はベースから離れていて、javascript は keydown イベントをキャッチできますが、この質問は本当にばかげているように見えますか?

(余談ですが、これに対する答えを見つけようとしているときに、SysRqボタンの歴史について少し教えてくれたこのきちんとした記事に出くわしました-http ://royal.pingdom.com/2012/06/26/sysadmin-needs -sysrq-magic/ )


「理由はわかりませんが…」の質問のリンク一覧

KeyDown イベントが PrintScreen キーc#で機能しない

https://gamedev.stackexchange.com/questions/20446/does-vk-snapshot-not-send-a-wm-keydown-only-wm-keyup Cっぽい言語?

キーボード テスター アプリで印刷画面のキーアップとキーダウンを検出する VB NET VB.NET

0 投票する
2 に答える
6981 参照

c# - スレッドのスケジューリングに悩まされることなく、リアルタイムで 1 ミリ秒の正確なイベントを達成する

問題

.Net 4.5を使用してWindows 7 ベースの C# WPFアプリケーションを作成しています。その主な機能の 1 つは、一連のユーザー定義のサイクル時間でカスタム ハードウェアとやり取りする特定の関数を呼び出すことです。たとえば、ユーザーは 2 つの関数を 10 または 20 ミリ秒ごとに呼び出し、別の関数を 500 ミリ秒ごとに呼び出すように選択できます。ユーザーが選択できる最小のサイクル時間は 1 ミリ秒です。

最初は、タイミングが正確で、必要に応じて 1 ミリ秒ごとに関数が呼び出されたように見えました。しかし、後で、約1 ~ 2%のタイミングが正確ではないことに気付きました。一部の関数はわずか 5 ミリ秒遅れて呼び出され、他の関数は最大 100 ミリ秒遅れて呼び出されました。サイクル タイムが 1 ミリ秒を超えていても、外部関数を呼び出すべき時間にスレッドがスリープするという問題に直面しました (スレッドがスリープ状態で関数を呼び出さなかったために、20 ミリ秒の関数が 50 ミリ秒遅れて呼び出される可能性があります)。

分析の結果、これらの遅延は散発的であり、目立ったパターンはなく、これらの遅延の背後にある主な原因は OS のスケジューリングとスレッド コンテキストの切り替えであると結論付けました。 .

Windows 7 は RTOS ではないため、この問題を回避できるかどうかを調べる必要があります。ただし、最大 0.7 ミリ秒のエラー許容範囲でタイミング制約を満たすことができる同様の機能を持つ他のツールを使用しているため、この問題が Windows で修正可能であることは確かです。

私たちのアプリケーションはマルチスレッド化されており、同時に最大約 30 のスレッドが実行されています。現在のピーク CPU 使用率は約 13% です。

試みられた解決策

さまざまなことを試しましたが、タイミングは主にストップウォッチ タイマーを使用して測定され、IsHighResolutionは true でした (他のタイマーが使用されましたが、大きな違いはわかりませんでした)。

  1. 別のスレッドを作成し、
    それに高い優先度を与えるThread.Sleep()

  2. C# タスク (スレッド プール) を使用する
    結果:ほとんど改善されない

  3. 1 ミリ秒の周期性を持つマルチメディア タイマーを使用する
    結果:効果がないか、さらに悪いことに、マルチメディア タイマーは OS を起動する際には正確ですが、OS は別のスレッドを実行することを選択する可能性があり、1 ミリ秒の保証はありませんが、それでも遅延が時折大きくなる可能性があります

  4. while ループとストップウォッチ タイマーだけを含む別のスタンドアロン C# プロジェクトを作成しまし

  5. ポイント 4 を繰り返しましたが、プロセスの優先度を Realtime/High に設定し
    まし

結論:

前回から、5 つの可能な行動方針があることがわかりましたが、正しい方向に向けるためには、そのような問題の経験を持つ知識のある人が必要です。

  1. ツールを最適化し、スレッドを何らかの方法で管理して、1 ミリ秒のリアルタイム要件を保証することができます。最適化の一部として、ツールのプロセス優先度を高またはリアルタイムに設定している可能性がありますが、ユーザーが他のいくつかのツールを同時に使用している可能性があるため、これは賢明な決定とは思えません。

  2. ツールを 2 つのプロセスに分割します。1 つは GUI とすべての非タイム クリティカルな操作を含み、もう 1 つは最小限のタイム クリティカルな操作を含み、高/リアルタイム優先度に設定し、IPC (WCF など) を使用してプロセス間の通信。これは2つの点で私たちに利益をもたらす可能性があります

    1. 操作がはるかに少ないため、他のプロセスが枯渇する可能性が低くなります。

    2. プロセスのスレッドが少ないため、スレッドがスリープする可能性が (はるかに低いか、まったくない)

注: 次の 2 つのポイントでは、カーネル スペースについて説明します。カーネル スペースとドライバーの作成に関する情報はほとんどないため、カーネル スペースの使用方法について間違った仮定をしている可能性があることに注意してください。

  1. 1 ミリ秒ごとに低レベルの割り込みを使用して、スレッドがプロセス内で指定されたタスクを強制的に実行するイベントを発生させるドライバーをカーネル空間に作成します。

  2. タイム クリティカルなコンポーネントをカーネル スペースに移動し、プログラムの本体とのインターフェイスは、API とコールバックを介して行うことができます。

  3. おそらくこれらはすべて有効ではなく、IntervalZero RTOS プラットフォームのような Windows RTOS 拡張機能を使用する必要があるのでしょうか?

質問自体

私が探している答えは 2 つあります。良い情報源に裏付けられていることを願っています。

  1. これは本当にスレッドとコンテキストの切り替えの問題ですか? それとも、ずっと何かを見逃していたのでしょうか?

  2. この問題を確実に解決できる 5 つのオプションはどれですか。これらのオプションのどれもそれを修正できない場合、何ができるでしょうか? 私たちがベンチマークした他のツールは、実際に Windows で必要なタイミング精度に達していることを覚えておいてください。CPU の負荷が高い場合、100,000 のうち 1 つまたは 2 つのタイミングが 2 ミリ秒未満ずれている可能性がありますが、これは非常に許容範囲です。

0 投票する
2 に答える
3890 参照

memory-management - Windows 7 でカーネル モードでメモリ領域の保護を設定する方法

基本的に、ユーザーモードでできることをカーネルモードで実行できる関数を探していVirtualProtectます。

次の簡略化されたコードで例示されているロジックを使用して、メモリを割り当てています。

MdlMappingNoExecuteおよびフラグは、MdlMappingNoWriteWin8+ でのみ有効です。
また、MmGetSystemAddressForMdlSafeI のみを使用すると、たとえばNoAccessメモリ領域の保護を割り当てることができません。

割り当てられたメモリのページ保護を変更できるようにするために使用できる追加または代替の API はありますか?
現在、この機能は製品コードでは使用されていないため、ハッキングも行われます。

0 投票する
0 に答える
667 参照

debugging - PC で USBview の「Is Port Debug Capable」が「いいえ」と表示されるのはなぜですか?

USB 3.0 トランスポート経由で Wi​​ndows カーネル デバッグをセットアップしようとしています。この MSDN の記事には、最初に USBview.exe を使用して PC をチェックする必要があると記載されており、「Is Port Debug Capable」で「はい」と答える必要があります。ただし、Acer R7 ラップトップ (Intel Ivy Bridge Core i5 3337U) の Windows 10 x64 システムでは、「Is Port Debug Capable」は各 USB 3.0 ポートに対してnoと表示されます。なぜそうなのですか?

usbview - Is Port Debug Capable.png

0 投票する
0 に答える
234 参照

winapi - Windows VAD ツリーと GDT LDT の関係 X86

私は Windows メモリが X86 でどのように機能するかを調べていました。VAD と GDT のインターネット関係に関するドキュメントは見つかりませんでした

Windows OS は、VAD (仮想アドレス記述子) を使用して、LDT または GDT 配列からアドレスを割り当てます。

私が読んだように、各VADエントリは単なる「ページテーブル」です

それで :

プロセスの場合、各ページ テーブルは LDT エントリです カーネルの場合、各ページ テーブルは GDT エントリです

NTOSKRNL.EXE OS の起動時に RtlInitializeGenericTable を呼び出して VAD を初期化します。この関数はバイナリ ツリーを作成し、各ノードには空きの LDT または GDT エントリが含まれます。このバイナリ ツリーのルートは、GDT 自体の内部に格納されます。

ユーザー モード malloc からメモリを割り当てると、バイナリ ツリーは LDT プールと VAD ツリー ルートから 1 つの LDT ノードを減算します。

2 番目の質問: Windows で実行できるプロセスの数は GDT エントリの制限です x86 は 16 ビットの GDT エントリを持つことができるため、各プロセスに 1 つの LDT エントリを持つことができる 65536 個の LDT エントリを追加できます。したがって、GDT には最大 60K のエントリを含めることができます。これは、Windows が最大 ~60k のプロセスを実行できることを意味します。これは本当ですか?