ZwMapViewOfSection 関数 (wdm.h)

ZwMapViewOfSection ルーチンは、セクションのビューをサブジェクト プロセスの仮想アドレス空間にマップします。

構文

NTSYSAPI NTSTATUS ZwMapViewOfSection(
  [in]                HANDLE          SectionHandle,
  [in]                HANDLE          ProcessHandle,
  [in, out]           PVOID           *BaseAddress,
  [in]                ULONG_PTR       ZeroBits,
  [in]                SIZE_T          CommitSize,
  [in, out, optional] PLARGE_INTEGER  SectionOffset,
  [in, out]           PSIZE_T         ViewSize,
  [in]                SECTION_INHERIT InheritDisposition,
  [in]                ULONG           AllocationType,
  [in]                ULONG           Win32Protect
);

パラメーター

[in] SectionHandle

セクション オブジェクトへのハンドル。 このハンドルは、 ZwCreateSection または ZwOpenSection を正常に呼び出すことによって作成 されます

[in] ProcessHandle

ビューをマップする必要があるプロセスを表す オブジェクトを処理します。 現在のプロセスを指定するには、 ZwCurrentProcess マクロを使用します。 ハンドルは、 PROCESS_VM_OPERATION アクセスで開かれている必要があります。

[in, out] BaseAddress

ビューのベース アドレスを受け取る変数へのポインター。 このパラメーターの値が NULL でない場合、ビューは、次の 64 キロバイトのアドレス境界に切り捨てられた指定された仮想アドレスから開始して割り当てられます。

[in] ZeroBits

セクション ビューのベース アドレスに 0 を指定する必要がある上位アドレス ビットの数を指定します。 このパラメーターの値は 21 未満である必要があり、 BaseAddressNULL の場合にのみ使用されます。つまり、呼び出し元がビューを割り当てる場所をシステムが判断できる場合に使用されます。

[in] CommitSize

ビューの最初にコミットされた領域のサイズをバイト単位で指定します。 CommitSize は、ページ ファイルでサポートされるセクションに対してのみ意味があり、PAGE_SIZEの最も近い倍数に切り上げられます。 (ファイルをマップするセクションの場合、データとイメージの両方がセクション作成時にコミットされます)。

[in, out, optional] SectionOffset

セクションの先頭からビューまでのオフセットをバイト単位で受け取る変数へのポインター。 このポインターが NULL でない場合、オフセットは次の割り当て粒度サイズ境界に切り捨てられます。

[in, out] ViewSize

SIZE_T変数へのポインター。 この変数の初期値が 0 の場合、 ZwMapViewOfSectionSectionOffset から始まり、セクションの末尾まで続くセクションのビューをマップします。 それ以外の場合、初期値はビューのサイズをバイト単位で指定します。 ZwMapViewOfSection は常に、ビューをマッピングする前に、この値を最も近いPAGE_SIZEの倍数に切り上げます。

戻り値は、ビューの実際のサイズ (バイト単位) を受け取ります。

[in] InheritDisposition

ビューを子プロセスと共有する方法を指定します。 次の値を指定できます。

ViewShare

ビューは、将来作成されるすべての子プロセスにマップされます。

ViewUnmap

ビューは子プロセスにマップされません。

ドライバーでは、通常、このパラメーターに ViewUnmap を指定する必要があります。

[in] AllocationType

指定したページ領域に対して実行される割り当ての種類を記述するフラグのセットを指定します。 有効なフラグは、MEM_LARGE_PAGES、MEM_RESERVE、およびMEM_TOP_DOWNです。 MEM_COMMITは許可されませんが、MEM_RESERVEが指定されていない限り、暗黙的に指定されます。 MEM_XXX フラグの詳細については、 VirtualAlloc ルーチンの説明を参照してください。

[in] Win32Protect

最初にコミットされたページの領域の保護の種類を指定します。 デバイス ドライバーと中間ドライバーでは、この値をPAGE_READWRITEに設定する必要があります。

戻り値

ZwMapViewOfSection は NTSTATUS 値を返します。 可能な戻り値は次のとおりです。

リターン コード 説明
STATUS_SUCCESS ルーチンは、要求された操作を正常に実行しました。
STATUS_CONFLICTING_ADDRESSES 指定したアドレス範囲が既に予約されているアドレス範囲と競合しているか、指定されたキャッシュ属性の種類がアドレス範囲の既存のキャッシュ属性と競合しています。 たとえば、マップされるメモリが、既に完全にキャッシュされている大きなページ内にある場合、キャッシュされていないメモリまたは書き込みの組み合わせとしてこのメモリのマップを要求することは無効です。
STATUS_INVALID_PAGE_PROTECTION Protect パラメーターに指定された値が無効です。
STATUS_SECTION_PROTECTION AllocationType パラメーターに指定された値は、セクションの作成時に指定された保護の種類と互換性がありません。

注釈

セクションのいくつかの異なるビューを、1 つ以上のプロセスの仮想アドレス空間に同時にマップできます。

指定したセクションが存在しない場合、または要求されたアクセスが許可されていない場合、 ZwMapViewOfSection はエラーを返します。

ZwMapViewOfSection を使用して、\Device\PhysicalMemory のメモリ範囲をユーザー モードにマップしないでください。ただし、ドライバーが MmAllocatePagesForMdl を介してメモリ範囲を直接割り当てたり、他のシステム コンポーネントが同じメモリ範囲を異なるMEMORY_CACHING_TYPE値でマップしていないことが保証されている場合を除きます。

ユーザー アプリケーションは、Windows Server 2003 Service Pack 1 (SP1) 以降の \Device\PhysicalMemory に直接アクセスできず、ドライバーがアプリケーションにハンドルを渡した場合にのみアクセスできます。

セクション オブジェクトの詳細については、「セクション オブジェクト とビュー」を参照してください。

この関数の呼び出しがユーザー モードで行われる場合は、"ZwMapViewOfSection" ではなく "NtMapViewOfSection" という名前を使用する必要があります。

カーネル モード ドライバーからの呼び出しの場合、Windows ネイティブ システム サービス ルーチンの NtXxx および ZwXxx バージョンは、入力パラメーターを処理および解釈する方法で動作が異なる場合があります。 ルーチンの NtXxx バージョンと ZwXxx バージョンの間の関係の詳細については、「ネイティブ システム サービス ルーチンの Nt バージョンと Zw バージョンの使用」を参照してください。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

こちらもご覧ください

MEMORY_CACHING_TYPE

MmAllocatePagesForMdl

Nt および Zw バージョンのネイティブ システム サービス ルーチンの使用

VirtualAlloc

ZwCurrentProcess

ZwOpenSection

ZwUnmapViewOfSection