VIDEO_ACCESS_RANGE 結構 (video.h)

VIDEO_ACCESS_RANGE 結構會定義視訊適配卡的裝置 I/O 埠或記憶體範圍。 每個迷你埠驅動程式的 HwVidFindAdapter 函式都必須針對迷你埠驅動程式支援的每個視訊適配卡,設定VIDEO_ACCESS_RANGE類型的元素陣列, 稱為 存取範圍陣組

針對 VGA 相容的迷你埠驅動程式,VIDEO_ACCESS_RANGE也會在傳遞至 VideoPortSetTrappedEmulatorPorts 的數位中定義元素,讓全螢幕 MS-DOS 應用程式能夠或停用直接存取 I/O 連接埠。

語法

typedef struct _VIDEO_ACCESS_RANGE {
  PHYSICAL_ADDRESS RangeStart;
  ULONG            RangeLength;
  UCHAR            RangeInIoSpace;
  UCHAR            RangeVisible;
  UCHAR            RangeShareable;
  UCHAR            RangePassive;
} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;

成員

RangeStart

針對傳遞至 VideoPortVerifyAccessRangesVideoPortGetAccessRanges 的存取範圍陣列中的專案,指定記憶體或 I/O 埠範圍的總線相對基位址。

指定要傳遞至 VideoPortSetTrappedEmulatorPorts 之陣列之 I/O 埠範圍的總線相對基位址。

RangeLength

指定範圍的 I/O 連接埠數目或位元元元大小。

RangeInIoSpace

指定範圍是位於 I/O 空間或記憶體空間中。 TRUE (1 值) 表示該範圍位於 I/O 空間中;FALSE 值 (0) 表示範圍位於記憶體空間中。

RangeVisible

如果迷你埠驅動程式的 HwVidFindAdapter 函式正在設定存取範圍數位,則會忽略。

VGA 兼容的迷你埠驅動程式設定為 TRUE ,並傳遞至 VideoPortSetTrappedEmulatorPorts ,讓全螢幕 MS-DOS 應用程式能夠直接存取 I/O 連接埠範圍。 如果設定為 FALSE,應用程式發出的指示會繼續截獲並轉送到迷你埠驅動程式的 SvgaHwIoXxx 函式以進行驗證。

RangeShareable

如果這個專案所描述的存取範圍可以與其他驅動程式和/或裝置共用,或設定為 FALSE,如果無法共用範圍,則會設定為 TRUE

VideoPortSetTrappedEmulatorPorts 會忽略。

RangePassive

指出裝置是否實際使用埠。 下表顯示此成員的值。

意義
VIDEO_RANGE_PASSIVE_DECODE 裝置會譯碼埠,但驅動程式不會使用它。
VIDEO_RANGE_10_BIT_DECODE 裝置會將埠位址的十位譯碼。

備註

迷你埠驅動程序必須在 DriverEntryHwVidLegacyResources 函式中宣告舊版資源。

否則,迷你埠驅動程式的 HwVidFindAdapter 函式會設定適配卡 PCI 資源的存取範圍數位。 它可以使用 VideoPortGetAccessRanges 所傳回的資訊。 或者,它可以使用從登錄擷取的資訊,方法是呼叫 VideoPortGetDeviceData 搭配迷你埠驅動程式提供的 HwVidQueryDeviceCallback 函式或 VideoPortGetRegistryParameters 搭配迷你埠驅動程式提供的 HwVidQueryNamedValueCallback 函式。 如果呼叫這些 VideoPortXxx 未提供總線相對存取範圍值, HwVidFindAdapter 可以使用驅動程式提供的總線相對預設值來設定存取範圍元素。

宣告登錄中的存取範圍

迷你埠驅動程序應該呼叫 VideoPortVerifyAccessRanges ,其中包含從 VideoPortGetDeviceDataVideoPortGetAccessRanges 取得的任何存取範圍,或由迷你埠驅動程式提供做為預設值。 如果 VideoPortVerifyAccessRanges 針對這類存取範圍數位傳回NO_ERROR, 則 HwVidFindAdapterHwVidQueryDeviceCallback 函式接著可以使用 VideoPortGetDeviceBase 對應範圍,並使用傳回的對應邏輯位址來存取配接器。

成功呼叫 VideoPortGetAccessRanges 也會宣告呼叫端登錄中傳回的總線相對存取範圍。 如果迷你埠驅動程式修改任何傳回的值,則必須使用完整的存取範圍呼叫 VideoPortVerifyAccessRanges ,包括任何未修改的專案。 特定視訊適配卡對 VideoPortGetAccessRangesVideoPortVerifyAccessRanges 的每個呼叫都會覆寫登錄中呼叫端所宣告的硬體資源。

迷你埠驅動程式不得嘗試使用 VideoPortVerifyAccessRangesVideoPortGetAccessRanges 不會傳回NO_ERROR的範圍。

對應要與配接器通訊的存取範圍

在迷你埠驅動程式在適配卡的登錄中宣告資源之後,就無法使用總線相對位址來存取或設定配接器,因為 HAL 可以將所有總線相對裝置位址重新對應至 系統空間

迷你埠驅動程式的 HwVidFindAdapter 函式必須呼叫 VideoPortGetDeviceBase ,以取得其存取範圍的對應邏輯位址。 只有接著,迷你埠驅動程式才能將傳回的對應邏輯範圍位址傳遞至 VideoPortRead/WritePortXxx ,以存取 I/O 空間中的裝置記憶體和/或 VideoPortRead/WriteRegisterXxx ,以存取記憶體空間中的裝置記憶體。

判斷存取範圍是否可共用

請遵循下列指導方針來判斷是否可以共用存取範圍:
  • 如果此驅動程式應「擁有」記憶體或 I/O 埠的範圍,而且任何其他驅動程式對此範圍的存取可能會造成問題,請將 RangeSharable 設定為 FALSE
  • 如果範圍可以與啟動的裝置驅動程序共用,請將 RangeSharable 設定為 TRUE
實作所有 VGA 功能的 SVGA 迷你埠驅動程式 (在登錄中宣告為 VgaCompatible 設定為一個) 應該將其存取範圍宣告為無法共用,因此不會載入系統 VGA 驅動程式。 另一方面,S3 或 XGA 等適配卡的迷你埠驅動程式會將 登錄中的 VgaCompatible 設定為零,應該將它們與系統 VGA 驅動程式共用的所有資源宣告為可共用。

不過,使用傳遞IOCTL且可以連線到任何 VGA 或 SVGA 記憶卡的卡片迷你埠驅動程式不應使用任何系統 VGA 埠或記憶體範圍。 如果這樣做,這類驅動程式不應該嘗試宣告登錄中的任何 VGA 存取範圍。 這類迷你埠驅動程序嘗試宣告 VGA 資源可能會造成資源衝突,因為機器中任何 SVGA 記憶卡的驅動程式都會將這些存取範圍宣告為無法共用。

將 I/O 埠範圍元素傳遞至 VideoPortSetTrappedEmulatorPorts

除非 x86 型機器中的 VGA 相容迷你埠驅動程序明確地將 RangeVisible 成員 (s) 重設為 TRUE ,並呼叫 VideoPortSetTrappedEmulatorPorts 來啟用一或多個 I/O 埠範圍,否則所有描述 I/O 埠範圍的VIDEO_ACCESS_RANGE類型數位元素都會被假設為不可見。 VideoPortSetTrappedEmulatorPorts 會忽略輸入數位的 RangeSharable 成員。

在傳遞至 VideoPortSetTrappedEmulatorPorts 的VIDEO_ACCESS_RANGE類型元素數位中, 每個元素 RangeVisible 成員的值會決定指定的 I/O 連接埠 () 是否可以直接由 VDM (在 x86 型電腦上執行的 MS-DOS 應用程式直接存取) ,或這類應用程式發行的 I/O 數據流是否會被截獲並轉送到迷你連接埠驅動程式提供的 SvgaHwIoPortXxx 函式,以便先進行驗證。

規格需求

需求
標頭 video.h (包含 Video.h)

另請參閱

Video Miniport Driver 的 DriverEntry

EMULATOR_ACCESS_ENTRY

HwVidFindAdapter

HwVidQueryDeviceCallback

HwVidQueryNamedValueCallback

VIDEO_HW_INITIALIZATION_DATA

VideoPortGetAccessRanges

VideoPortGetDeviceBase

VideoPortGetDeviceData

VideoPortGetRegistryParameters

VideoPortInitialize

VideoPortSetTrappedEmulatorPorts

VideoPortVerifyAccessRanges