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 未満である必要があり、 BaseAddress が NULL の場合にのみ使用されます。つまり、呼び出し元がビューを割り当てる場所をシステムが判断できる場合に使用されます。
[in] CommitSize
ビューの最初にコミットされた領域のサイズをバイト単位で指定します。 CommitSize は、ページ ファイルでサポートされるセクションに対してのみ意味があり、PAGE_SIZEの最も近い倍数に切り上げられます。 (ファイルをマップするセクションの場合、データとイメージの両方がセクション作成時にコミットされます)。
[in, out, optional] SectionOffset
セクションの先頭からビューまでのオフセットをバイト単位で受け取る変数へのポインター。 このポインターが NULL でない場合、オフセットは次の割り当て粒度サイズ境界に切り捨てられます。
[in, out] ViewSize
SIZE_T変数へのポインター。 この変数の初期値が 0 の場合、 ZwMapViewOfSection は SectionOffset から始まり、セクションの末尾まで続くセクションのビューをマップします。 それ以外の場合、初期値はビューのサイズをバイト単位で指定します。 ZwMapViewOfSection は常に、ビューをマッピングする前に、この値を最も近いPAGE_SIZEの倍数に切り上げます。
戻り値は、ビューの実際のサイズ (バイト単位) を受け取ります。
[in] InheritDisposition
ビューを子プロセスと共有する方法を指定します。 次の値を指定できます。
ViewShare
ビューは、将来作成されるすべての子プロセスにマップされます。
ViewUnmap
ビューは子プロセスにマップされません。
ドライバーでは、通常、このパラメーターに ViewUnmap を指定する必要があります。
[in] AllocationType
指定したページ領域に対して実行される割り当ての種類を記述するフラグのセットを指定します。 有効なフラグは、MEM_RESERVE、MEM_TOP_DOWN、MEM_LARGE_PAGES、MEM_DIFFERENT_IMAGE_BASE_OK、およびMEM_REPLACE_PLACEHOLDERです。 MEM_COMMITは許可されませんが、MEM_RESERVEが指定されていない限り、暗黙的に指定されます。 MEM_XXX フラグの詳細については、 VirtualAlloc ルーチンと MapViewOfFile3 ルーチンの説明を参照してください。
[in] Win32Protect
マップされたビューに適用する ページ保護 を指定します。
SEC_IMAGE属性を使用して作成されたセクション オブジェクトの場合、Win32Protect パラメーターは無効であり、PAGE_READONLYなどの任意の有効な値に設定できます。
SEC_IMAGE_NO_EXECUTE属性を使用して作成されたセクション オブジェクトの場合、Win32Protect 値を PAGE_READONLY に設定する必要があります。
イメージ以外のセクションの場合、Win32Protect パラメーターの値は、ZwCreateSection が呼び出されたときに指定されたセクションのページ保護と互換性がある必要があります。
ZwMapViewOfSection は、 セクション オブジェクトの作成時に指定されたキャッシュの種類と一致するように、マップされたページのキャッシュの種類を設定します。 たとえば、SEC_NOCACHE フラグを指定して ZwCreateSection が呼び出された場合、Win32Protect パラメーターに PAGE_NOCACHE フラグが含まれているかどうかにかかわらず、 ZwMapViewOfSection はキャッシュされていないページをマップします。
戻り値
ZwMapViewOfSection は NTSTATUS 値を返します。 可能な戻り値は次のとおりです。
リターン コード | 説明 |
---|---|
STATUS_SUCCESS | ルーチンは、要求された操作を正常に実行しました。 |
STATUS_CONFLICTING_ADDRESSES | 指定したアドレス範囲が、既に予約されている範囲と競合しています。 |
STATUS_INVALID_PAGE_PROTECTION | Win32Protect パラメーターに指定された値が無効です。 |
STATUS_SECTION_PROTECTION | Win32Protect パラメーターに指定された値は、セクションの作成時に指定されたページ保護と互換性がありません。 |
注釈
セクションのいくつかの異なるビューを、1 つ以上のプロセスの仮想アドレス空間に同時にマップできます。
ZwMapViewOfSection を使用して、\Device\PhysicalMemory のメモリ範囲をユーザー モードにマップしないでください。ただし、ドライバーが MmAllocatePagesForMdlEx を介してメモリ範囲を直接割り当てたり、他のシステム コンポーネントが同じメモリ範囲を異なる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) |