日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

reactos操作系统实现(108)

發布時間:2023/12/31 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 reactos操作系统实现(108) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AtapiHwInitialize函數初始化不是ATAPT設備,設置它支持多塊傳送。接著判斷那些設備是CD-ROM設備,還清除忙狀態。具體實現代碼如下:

#001? BOOLEAN

#002? NTAPI

#003? AtapiHwInitialize(

#004????? IN PVOID HwDeviceExtension

#005????? )

#006?

#007? /*++

#008?

#009? Routine Description:

#010?

#011? Arguments:

#012?

#013????? HwDeviceExtension - HBA miniport driver's adapter data storage

#014?

#015? Return Value:

#016?

#017????? TRUE - if initialization successful.

#018????? FALSE - if initialization unsuccessful.

#019?

#020? --*/

#021?

#022? {

#023????? PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension;

#024????? PIDE_REGISTERS_1???? baseIoAddress;

#025????? ULONG i;

#026????? UCHAR statusByte, errorByte;

#027?

#028?

?

對于兩個通道4IDE控制器進行初始化。

#029????? for (i = 0; i < 4; i++) {

?

如果IDE的設備存在,就進行處理。

#030????????? if (deviceExtension->DeviceFlags[i] & DFLAGS_DEVICE_PRESENT) {

#031?

?

如果這個設備不是ATAPI設備,就進入下面初始化。

#032????????????? if (!(deviceExtension->DeviceFlags[i] & DFLAGS_ATAPI_DEVICE)) {

#033?

#034????????????????? //

#035????????????????? // Enable media status notification

#036????????????????? //

#037?

?

獲取基地址。

#038????????????????? baseIoAddress = deviceExtension->BaseIoAddress1[i >> 1];

#039?

?

設置媒體感知。

#040????????????????? IdeMediaStatus(TRUE,HwDeviceExtension,i);

#041?

?

如果支持多塊傳送,就設置多塊傳送參數。

#042????????????????? //

#043????????????????? // If supported, setup Multi-block transfers.

#044????????????????? //

#045????????????????? if (deviceExtension->MaximumBlockXfer[i]) {

#046?

#047????????????????????? //

#048????????????????????? // Select the device.

#049????????????????????? //

#050?

#051?????????????? ???????ScsiPortWritePortUchar(&baseIoAddress->DriveSelect,

#052???????????????????????????????????????????? (UCHAR)(((i & 0x1) << 4) | 0xA0));

#053?

#054????????????????????? //

#055????????????????????? // Setup sector count to reflect the # of blocks.

#056????????????????????? //

#057?

#058????????????????????? ScsiPortWritePortUchar(&baseIoAddress->BlockCount,

#059???????????????????????????????????????????? deviceExtension->MaximumBlockXfer[i]);

#060?

#061????????????????????? //

#062??????????????? ??????// Issue the command.

#063????????????????????? //

#064?

?

設置多塊傳送。

#065????????????????????? ScsiPortWritePortUchar(&baseIoAddress->Command,

#066???????????????????????????????????????????? IDE_COMMAND_SET_MULTIPLE);

#067?

#068????????????????????? //

#069????????????????????? // Wait for busy to drop.

#070????????????????????? //

#071?

#072????????????????????? WaitOnBaseBusy(baseIoAddress,statusByte);

#073?

#074????????????????????? //

#075????????????????????? // Check for errors. Reset the value to 0 (disable MultiBlock) if the

#076????????????????????? // command was aborted.

#077????????????????????? //

#078?

?

如果設置多塊傳送命令失敗,就設置為不支持多塊傳送。

#079????????????????????? if (statusByte & IDE_STATUS_ERROR) {

#080?

#081????????????????????????? //

#082 ?????????????????????????// Read the error register.

#083????????????????????????? //

#084?

#085????????????????????????? errorByte = ScsiPortReadPortUchar((PUCHAR)baseIoAddress + 1);

#086?

#087????????????????????????? DebugPrint((1,

#088?????????????? ???????????????????????"AtapiHwInitialize: Error setting multiple mode. Status %x, error byte %x/n",

#089????????????????????????????????????? statusByte,

#090????????????????????????????????????? errorByte));

#091????????????????????????? //

#092???????? ?????????????????// Adjust the devExt. value, if necessary.

#093????????????????????????? //

#094?

#095????????????????????????? deviceExtension->MaximumBlockXfer[i] = 0;

#096?

#097????????????????????? } else {

#098????????????????????????? DebugPrint((2,

#099????????????????????????????????????? "AtapiHwInitialize: Using Multiblock on Device %d. Blocks / int - %d/n",

#100????????????????????????????????????? i,

#101????????????????????????????????????? deviceExtension->MaximumBlockXfer[i]));

#102?????? ???????????????}

#103????????????????? }

#104????????????? } else if (!(deviceExtension->DeviceFlags[i] & DFLAGS_CHANGER_INITED)){

?

如果這個設備還沒有初始化,就進行初始化設置。

#105?

#106????????????????? ULONG j;

#107????????????????? BOOLEAN isSanyo = FALSE;

#108??????????? ??????UCHAR vendorId[26];

#109?

#110????????????????? //

#111????????????????? // Attempt to identify any special-case devices - psuedo-atapi changers, atapi changers, etc.

#112????????????????? //

#113?

?

判斷這個IDE設備是否為CR-ROM設備。

#114????????????????? for (j = 0; j < 13; j += 2) {

#115?

#116????????????????????? //

#117????????????????????? // Build a buffer based on the identify data.

#118????????????????????? //

#119?

#120????????????????????? vendorId[j] = ((PUCHAR)deviceExtension->IdentifyData[i].ModelNumber)[j + 1];

#121????????????????????? vendorId[j+1] = ((PUCHAR)deviceExtension->IdentifyData[i].ModelNumber)[j];

#122????????????????? }

#123?

?

比較IDE設備標識是否為CD-ROM

#124????????????????? if (!AtapiStringCmp ((PCHAR)vendorId, "CD-ROM? CDR", 11)) {

#125 ?

#126????????????????????? //

#127????????????????????? // Inquiry string for older model had a '-', newer is '_'

#128????????????????????? //

#129?

#130????????????????????? if (vendorId[12] == 'C') {

#131?

#132????????????????????????? //

#133??????? ??????????????????// Torisan changer. Set the bit. This will be used in several places

#134????????????????????????? // acting like 1) a multi-lun device and 2) building the 'special' TUR's.

#135????????????????????????? //

#136?

?

設置設備已經初始化。

#137???????? ?????????????????deviceExtension->DeviceFlags[i] |= (DFLAGS_CHANGER_INITED | DFLAGS_SANYO_ATAPI_CHANGER);

#138????????????????????????? deviceExtension->DiscsPresent[i] = 3;

#139????????????????????????? isSanyo = TRUE;

#140????????????????????? }

#141??? ??????????????}

#142????????????? }

#143?

#144????????????? //

#145????????????? // We need to get our device ready for action before

#146????????????? // returning from this function

#147????????????? //

#148????????????? // According to the atapi spec 2.5 or 2.6, an atapi device

#149????????????? // clears its status BSY bit when it is ready for atapi commands.

#150????????????? // However, some devices (Panasonic SQ-TC500N) are still

#151????????????? // not ready even when the status BSY is clear.? They don't react

#152????????????? // to atapi commands.

#153????????????? //

#154????????????? // Since there is really no other indication that tells us

#155????????????? // the drive is really ready for action.? We are going to check BSY

#156????????????? // is clear and then just wait for an arbitrary amount of time!

#157????????????? //

?

下面開始清除忙狀態。

#158????????????? if (deviceExtension->DeviceFlags[i] & DFLAGS_ATAPI_DEVICE) {

#159????????????????? //PIDE_REGISTERS_1???? baseIoAddress1 = deviceExtension->BaseIoAddress1[i >> 1];

#160????????????????? PIDE_REGISTERS_2???? baseIoAddress2 = deviceExtension->BaseIoAddress2[i >> 1];

#161????????????????? ULONG waitCount;

#162?

#163????????????????? // have to get out of the loop sometime!

#164????????????????? // 10000 * 100us = 1000,000us = 1000ms = 1s

#165????????????????? waitCount = 10000;

#166????????????????? GetStatus(baseIoAddress2, statusByte);

#167????????????????? while ((statusByte & IDE_STATUS_BUSY) && waitCount) {

#168????????????????????? //

#169? ????????????????????// Wait for Busy to drop.

#170????????????????????? //

#171????????????????????? ScsiPortStallExecution(100);

#172????????????????????? GetStatus(baseIoAddress2, statusByte);

#173????????????????????? waitCount--;

#174????????????????? }

#175?

#176????????????????? // 5000 * 100us = 500,000us = 500ms = 0.5s

#177????????????????? waitCount = 5000;

#178????????????????? do {

#179????????????????????? ScsiPortStallExecution(100);

#180????????????????? } while (waitCount--);

#181?????????? ???}

#182????????? }

#183????? }

#184?

#185????? return TRUE;

#186?

#187? } // end AtapiHwInitialize()

轉載于:https://www.cnblogs.com/ajuanabc/archive/2009/10/18/2463678.html

總結

以上是生活随笔為你收集整理的reactos操作系统实现(108)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丰满人妻老熟妇伦人精品 | 青草视频网 | 欧美精品在线一区 | 涩涩网站在线 | 在线免费小电影 | 欧美视频免费看欧美视频 | 色综合影视 | 四虎精品久久 | 日本a∨视频 | 六月婷婷av| 日韩大尺度在线观看 | 国产人妻精品一区二区三区不卡 | 黄色小视频免费观看 | 日本韩国欧美一区 | 黄片一区二区 | 国产精品视频123 | 丰满人妻熟妇乱偷人无码 | 日韩久久一级片 | 亚洲精品久久久蜜桃网尤妮丝 | 男男受被啪到高潮自述 | 玖玖爱精品| 很黄很色的视频 | 天天操天天摸天天干 | 美女被草出白浆 | www.奇米| 爱爱高潮视频 | 久久久九九九热 | 老子影院午夜伦不卡大全 | 亚洲精品无吗 | 神马久久久久久 | 国产在线一区视频 | 一区二区av在线 | 久久综合99| 青草草在线 | 水蜜桃91| 日韩国产激情 | 免费看一级 | 色综合久久88| av视觉盛宴| 91影院在线观看 | 国产成人一区 | 亚洲一区二区蜜桃 | 午夜免费观看视频 | 国产精品第157页 | 中文字幕91 | 免费av在| 日本高清视频在线播放 | 欧美精品日韩少妇 | 人成在线免费视频 | 男男免费视频 | 美国特色黄a大片 | 免费在线黄网 | 精品福利片| 亚洲高清色| 黄色在线免费观看网站 | 国产一级一级国产 | 777在线视频| 日本视频不卡 | 日韩少妇内射免费播放18禁裸乳 | 色妞综合网 | 亚洲国产日韩一区 | 国产3级在线 | 精品无码av一区二区三区四区 | 青青草手机在线观看 | 亚洲精品69 | 国产成人精品综合久久久久99 | 欧美人与性动交α欧美精品 | 美女扒开屁股让男人桶 | 美女久久久久久久久 | 少妇人妻一区二区 | 久久久国产一区 | 日韩一卡二卡在线 | av中文字幕免费在线观看 | 啪啪免费网站 | 欧美黄色一级大片 | 91视频国产一区 | 亚洲欧美电影 | 精品日韩一区二区三区四区 | 四虎成人在线 | 97在线看| 欧美日韩不卡一区二区三区 | 国产精品视频在线观看免费 | 亚洲丁香花色 | 无码乱人伦一区二区亚洲 | 日韩欧美中文字幕在线播放 | 伊人天天 | 久久亚洲网 | 日韩美女激情 | 黄黄的网站 | 日韩欧美麻豆 | 久草免费在线视频 | 欧美xo影院 | 五月天六月色 | 国产xxx在线 | 伊人网在线免费观看 | 成人av动漫 | 欧美性高潮 | 黑人3p波多野结衣在线观看 | 美女视频一区二区 |