日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

reactos操作系统实现(109)

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

AtapiInterrupt函數(shù)是實現(xiàn)ATAPI的中斷功能,主要根據(jù)SRB來判斷是讀取數(shù)據(jù)還是寫入數(shù)據(jù),然后對IDE設(shè)備讀取或?qū)懭霐?shù)據(jù),還需要處理很多出錯的情況。具體實現(xiàn)代碼如下:

#001? BOOLEAN

#002? NTAPI

#003? AtapiInterrupt(

#004????? IN PVOID HwDeviceExtension

#005????? )

#006?

#007? /*++

#008?

#009? Routine Description:

#010?

#011????? This is the interrupt service routine for ATAPI IDE miniport driver.

#012?

#013? Arguments:

#014?

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

#016?

#017? Return Value:

#018?

#019????? TRUE if expecting an interrupt.

#020?

#021? --*/

#022?

#023? {

?

獲取IDE的擴展對象結(jié)構(gòu)。

#024????? PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension;

?

獲取當(dāng)前SRB數(shù)據(jù)。

#025????? PSCSI_REQUEST_BLOCK srb????????????? = deviceExtension->CurrentSrb;

#026????? PATAPI_REGISTERS_1 baseIoAddress1;

#027????? PATAPI_REGISTERS_2 baseIoAddress2;

?

每次讀取256個雙字節(jié),也就是512個字節(jié)。

#028????? ULONG wordCount = 0, wordsThisInterrupt = 256;

#029????? ULONG status;

#030????? ULONG i;

#031????? UCHAR statusByte,interruptReason;

#032????? BOOLEAN atapiDev = FALSE;

#033?

?

獲取IDE的基地址。

#034????? if (srb) {

?

如果有SRB,說明直接從SRB里讀取基地址就行了。

#035????????? baseIoAddress1 =??? (PATAPI_REGISTERS_1)deviceExtension->BaseIoAddress1[srb->TargetId >> 1];

#036????????? baseIoAddress2 =??? (PATAPI_REGISTERS_2)deviceExtension->BaseIoAddress2[srb->TargetId >> 1];

#037????? } else {

?

否則就需要PPC的情況,或者使用一個默認(rèn)的基地址。

#038????????? DebugPrint((2,

#039????????????????????? "AtapiInterrupt: CurrentSrb is NULL/n"));

#040????????? //

#041????????? // We can only support one ATAPI IDE master on Carolina, so find

#042????????? // the base address that is non NULL and clear its interrupt before

#043????????? // returning.

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

#045?

#046? #ifdef _PPC_

#047?

#048????????? if ((PATAPI_REGISTERS_1)deviceExtension->BaseIoAddress1[0] != NULL) {

#049???????????? baseIoAddress1 = (PATAPI_REGISTERS_1)deviceExtension->BaseIoAddress1[0];

#050????????? } else {

#051???????????? baseIoAddress1 = (PATAPI_REGISTERS_1)deviceExtension->BaseIoAddress1[1];

#052????????? }

#053?

#054????????? GetBaseStatus(baseIoAddress1, statusByte);

#055? #else

#056?

?

使用一個默認(rèn)的基地址

#057????????? if (deviceExtension->InterruptMode == LevelSensitive) {

#058????????????? if (deviceExtension->BaseIoAddress1[0] != NULL) {

#059???????????????? baseIoAddress1 = (PATAPI_REGISTERS_1)deviceExtension->BaseIoAddress1[0];

#060???????????????? GetBaseStatus(baseIoAddress1, statusByte);

#061????????????? }

#062????????????? if (deviceExtension->BaseIoAddress1[1] != NULL) {

#063???????????????? baseIoAddress1 = (PATAPI_REGISTERS_1)deviceExtension->BaseIoAddress1[1];

#064???? ????????????GetBaseStatus(baseIoAddress1, statusByte);

#065????????????? }

#066????????? }

#067? #endif

?

如果沒有基地址,這個驅(qū)動程序不能訪問IDE控制器。

#068????????? return FALSE;

#069????? }

#070?

?

如果驅(qū)動程序不能接收中斷,就直接返回去。

#071????? if (!(deviceExtension->ExpectingInterrupt)) {

#072?

#073????????? DebugPrint((3,

#074????????????????????? "AtapiInterrupt: Unexpected interrupt./n"));

#075????????? return FALSE;

#076????? }

#077?

#078????? //

#079????? // Clear interrupt by reading status.

#080????? //

#081?

?

讀取當(dāng)前狀態(tài)。

#082????? GetBaseStatus(baseIoAddress1, statusByte);

#083?

#084????? DebugPrint((3,

#085????????????????? "AtapiInterrupt: Entered with status (%x)/n",

#086????????????????? statusByte));

#087?

#088?

?

如果IDE的狀態(tài)為忙狀態(tài)。

#089????? if (statusByte & IDE_STATUS_BUSY) {

?

如果設(shè)備需要采用輪詢的方式,就直接返回。

#090????????? if (deviceExtension->DriverMustPoll) {

#091?

#092????????????? //

#093????????????? // Crashdump is polling and we got caught with busy asserted.

#094????????????? // Just go away, and we will be polled again shortly.

#095 ?????????????//

#096?

#097????????????? DebugPrint((3,

#098????????????????????????? "AtapiInterrupt: Hit BUSY while polling during crashdump./n"));

#099?

#100????????????? return TRUE;

#101????????? }

#102?

#103????????? //

#104????????? // Ensure BUSY is non-asserted.

#105????????? //

#106?

?

如果查詢10次,還是忙狀態(tài),說明IDE還是在忙,沒有辦法響應(yīng),調(diào)用函數(shù)ScsiPortNotification來設(shè)置回調(diào)函數(shù)。

#107????????? for (i = 0; i < 10; i++) {

#108?

#109????????????? GetBaseStatus(baseIoAddress1, statusByte);

#110????????????? if (!(statusByte & IDE_STATUS_BUSY)) {

#111????????????????? break;

#112????????????? }

#113????????????? ScsiPortStallExecution(5000);

#114????????? }

#115?

#116????????? if (i == 10) {

#117?

#118????????????? DebugPrint((2,

#119????????????????????????? "AtapiInterrupt: BUSY on entry. Status %x, Base IO %x/n",

#120????????????????????????? statusByte,

#121????????????????????????? baseIoAddress1));

#122?

#123????????????? ScsiPortNotification(RequestTimerCall,

#124?????????????????????????????????? HwDeviceExtension,

#125? ?????????????????????????????????AtapiCallBack,

#126?????????????????????????????????? 500);

#127????????????? return TRUE;

#128????????? }

#129????? }

#130?

#131?

#132????? //

#133????? // Check for error conditions.

#134????? //

#135?

?

如果當(dāng)前IDE設(shè)備的狀態(tài)為出錯,就設(shè)置這個SRB請求完成,并且是出錯返回。

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

#137?

#138????????? if (srb->Cdb[0] != SCSIOP_REQUEST_SENSE) {

#139?

#140????????????? //

#141????????????? // Fail this request.

#142????????????? //

#143?

#144????????????? status = SRB_STATUS_ERROR;

#145????????????? goto CompleteRequest;

#146????????? }

#147????? }

#148?

#149????? //

#150????? // check reason for this interrupt.

#151????? //

#152?

?

如果沒有出錯,也沒有忙狀態(tài),判斷這個中斷的原因是什么。

#153????? if (deviceExtension->DeviceFlags[srb->TargetId] & DFLAGS_ATAPI_DEVICE) {

?

如果ATAPI設(shè)備中斷,就讀取中斷的原因,并設(shè)置傳送的字節(jié)數(shù)為512個字節(jié)。

#154?

#155????????? interruptReason = (ScsiPortReadPortUchar(&baseIoAddress1->InterruptReason) & 0x3);

#156????????? atapiDev = TRUE;

#157????????? wordsThisInterrupt = 256;

#158?

#159 ?????} else {

#160?

?

如果是DRQ的方式傳送,就進(jìn)入下面處理。

#161????????? if (statusByte & IDE_STATUS_DRQ) {

#162?

?

多塊傳送數(shù)據(jù)。

#163????????????? if (deviceExtension->MaximumBlockXfer[srb->TargetId]) {

#164????????????????? wordsThisInterrupt = 256 * deviceExtension->MaximumBlockXfer[srb->TargetId];

#165?

#166????????????? }

#167?

?

讀取數(shù)據(jù)進(jìn)來。

#168????????????? if (srb->SrbFlags & SRB_FLAGS_DATA_IN) {

#169?

#170????????????????? interruptReason =? 0x2;

#171?

?

傳送數(shù)據(jù)出去。

#172????????????? } else if (srb->SrbFlags & SRB_FLAGS_DATA_OUT) {

#173????????????????? interruptReason = 0x0;

#174?

#175????????????? } else {

?

錯誤請求中斷。

#176????????????????? status = SRB_STATUS_ERROR;

#177????????????????? goto CompleteRequest;

#178????????????? }

#179?

#180????????? } else if (statusByte & IDE_STATUS_BUSY) {

#181?

#182????????????? return FALSE;

#183?

#184????????? } else {

#185?

?

如果需要補充寫字節(jié),就進(jìn)入下面處理。

#186????????????? if (deviceExtension->WordsLeft) {

#187?

#188????????????????? ULONG k;

#189?

#190????????????????? //

#191????????????????? // Funky behaviour seen with PCI IDE (not all, just one).

#192????????????????? // The ISR hits with DRQ low, but comes up later.

#193????????????????? //

#194?

#195????????????????? for (k = 0; k < 5000; k++) {

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

#197????????????????????? if (!(statusByte & IDE_STATUS_DRQ)) {

#198????????????????????????? ScsiPortStallExecution(100);

#199????????????????????? } else {

#200????????????????????????? break;

#201????????????????????? }

#202??????? ??????????}

#203?

#204????????????????? if (k == 5000) {

#205?

#206????????????????????? //

#207????????????????????? // reset the controller.

#208????????????????????? //

#209?

#210????????????????????? DebugPrint((1,

#211????????????????????????????? ????"AtapiInterrupt: Resetting due to DRQ not up. Status %x, Base IO %x/n",

#212????????????????????????????????? statusByte,

#213????????????????????????????????? baseIoAddress1));

#214?

#215????????????????????? AtapiResetController(HwDeviceExtension,srb->PathId);

#216????????????????????? return TRUE;

#217????????????????? } else {

#218?

#219????????????????????? interruptReason = (srb->SrbFlags & SRB_FLAGS_DATA_IN) ? 0x2 : 0x0;

#220????????????????? }

#221?

#222????????????? } else {

#223?

?

下面獲取媒介的狀態(tài)。

#224????????????????? //

#225????????????????? // Command complete - verify, write, or the SMART enable/disable.

#226????????????????? //

#227????????????????? // Also get_media_status

#228?

#229????????????????? interruptReason = 0x3;

#230??????????? ??}

#231????????? }

#232????? }

#233?

?

根據(jù)中斷原因進(jìn)行處理。

#234????? if (interruptReason == 0x1 && (statusByte & IDE_STATUS_DRQ)) {

#235?

?

中斷原因是寫數(shù)據(jù)到IDE設(shè)備。

#236????????? //

#237????????? // Write the packet.

#238????????? //

#239?

#240????????? DebugPrint((2,

#241????????????????????? "AtapiInterrupt: Writing Atapi packet./n"));

#242?

#243????????? //

#244????????? // Send CDB to device.

#245????????? //

#246?

?

CDB數(shù)據(jù)發(fā)送給設(shè)備。這里的WriteBuffer,其實是調(diào)用函數(shù)ScsiPortWritePortBufferUshort,它的作用就是把緩沖區(qū)里的數(shù)據(jù)發(fā)送到HBA總線上。

#247??????? ??WriteBuffer(baseIoAddress1,

#248????????????????????? (PUSHORT)srb->Cdb,

#249????????????????????? 6);

#250?

#251????????? return TRUE;

#252?

#253????? } else if (interruptReason == 0x0 && (statusByte & IDE_STATUS_DRQ)) {

#254?

#255????????? //

#256? ????????// Write the data.

#257????????? //

#258?

?

確認(rèn)是否ATAPI設(shè)備。

#259????????? if (deviceExtension->DeviceFlags[srb->TargetId] & DFLAGS_ATAPI_DEVICE) {

#260?

#261????????????? //

#262????????????? // Pick up bytes to transfer and convert to words.

#263?? ???????????//

#264?

?

ATAPI設(shè)備里讀取要傳送的字節(jié)數(shù),把字節(jié)轉(zhuǎn)換為字的個數(shù)。

#265????????????? wordCount =

#266????????????????? ScsiPortReadPortUchar(&baseIoAddress1->ByteCountLow);

#267?

#268????????????? wordCount |=

#269????????????????? ScsiPortReadPortUchar(&baseIoAddress1->ByteCountHigh) << 8;

#270?

#271????????????? //

#272????????????? // Covert bytes to words.

#273????????????? //

#274?

#275????????????? wordCount >>= 1;

#276?

#277????????????? if (wordCount != deviceExtension->WordsLeft) {

#278????????????????? DebugPrint((3,

#279???????????????????????????? "AtapiInterrupt: %d words requested; %d words xferred/n",

#280???????????????????????????? deviceExtension->WordsLeft,

#281???????????????????????????? wordCount));

#282????????????? }

#283?

?

如果要傳送的字個數(shù)大于剩余的個數(shù),那么就只傳送剩余的個數(shù)。

#284????????????? //

#285????????????? // Verify this makes sense.

#286????????????? //

#287?

#288????????????? if (wordCount > deviceExtension->WordsLeft) {

#289????????????????? wordCount = deviceExtension->WordsLeft;

#290????????????? }

#291?

#292????????? } else {

#293?

#294????????????? //

#295????????????? // IDE path. Check if words left is at least 256.

#296????????????? //

#297?

?

判斷是否剩余字個數(shù)小于256個字,如果是小于,就只傳送剩余個數(shù),否則就傳送256個字。

#298????????????? if (deviceExtension->WordsLeft < wordsThisInterrupt) {

#299?

#300???????????????? //

#301???????????????? // Transfer only words requested.

#302???????????????? //

#303?

#304???????????????? wordCount = deviceExtension->WordsLeft;

#305?

#306????????????? } else {

#307?

#308???????????????? //

#309???????????????? // Transfer next block.

#310???????????????? //

#311?

#312???????????????? wordCount = wordsThisInterrupt;

#313????????????? }

#314????????? }

#315?

#316????????? //

#317????????? // Ensure that this is a write command.

#318????????? //

#319?

?

檢查它是寫的命令。

#320????????? if (srb->SrbFlags & SRB_FLAGS_DATA_OUT) {

#321?

#322???????????? DebugPrint((3,

#323??????????????????????? "AtapiInterrupt: Write interrupt/n"));

#324?

?

等到IDE設(shè)備不忙。

#325???????????? WaitOnBusy(baseIoAddress2,statusByte);

#326?

?

判斷是否寫到第三個基地址。

#327???????????? if (atapiDev || !deviceExtension->DWordIO) {

#328?

#329???????????????? WriteBuffer(baseIoAddress1,

#330???????????????????????????? deviceExtension->DataBuffer,

#331???????????????????????????? wordCount);

#332?? ??????????} else {

#333?

#334???????????????? PIDE_REGISTERS_3 address3 = (PIDE_REGISTERS_3)baseIoAddress1;

#335?

#336???????????????? WriteBuffer2(address3,

#337???????????????????????????? (PULONG)(deviceExtension->DataBuffer),

#338??????????????????? ?????????wordCount / 2);

#339???????????? }

#340????????? } else {

#341?

?

如果不是寫的命令,就提示出錯返回。

#342????????????? DebugPrint((1,

#343????????????????????????? "AtapiInterrupt: Int reason %x, but srb is for a write %x./n",

#344????????????????????????? interruptReason,

#345????????????????????????? srb));

#346?

#347????????????? //

#348????????????? // Fail this request.

#349????????????? //

#350?

#351????????????? status = SRB_STATUS_ERROR;

#352????????????? goto CompleteRequest;

#353????????? }

#354?

#355 ?

#356????????? //

#357????????? // Advance data buffer pointer and bytes left.

#358????????? //

#359?

?

調(diào)整已經(jīng)傳送的緩沖區(qū)字個數(shù),以便下一次傳送。

#360????????? deviceExtension->DataBuffer += wordCount;

#361????????? deviceExtension->WordsLeft -= wordCount;

#362?

#363????? ????return TRUE;

#364?

#365????? } else if (interruptReason == 0x2 && (statusByte & IDE_STATUS_DRQ)) {

#366?

#367?

?

這是讀取數(shù)據(jù)命令。

#368????????? if (deviceExtension->DeviceFlags[srb->TargetId] & DFLAGS_ATAPI_DEVICE) {

#369?

#370????????????? //

#371??????? ??????// Pick up bytes to transfer and convert to words.

#372????????????? //

#373?

?

讀取IDE設(shè)備要傳送的字節(jié)數(shù),并轉(zhuǎn)換為字的個數(shù)。

#374????????????? wordCount =

#375????????????????? ScsiPortReadPortUchar(&baseIoAddress1->ByteCountLow);

#376?

#377????????????? wordCount |=

#378????????????????? ScsiPortReadPortUchar(&baseIoAddress1->ByteCountHigh) << 8;

#379?

#380????????????? //

#381????????????? // Covert bytes to words.

#382????????????? //

#383?

#384????????????? wordCount >>= 1;

#385?

?

請求的個數(shù)不等于IDE設(shè)備要傳送的字節(jié)數(shù),就提示。

#386? ????????????if (wordCount != deviceExtension->WordsLeft) {

#387????????????????? DebugPrint((3,

#388???????????????????????????? "AtapiInterrupt: %d words requested; %d words xferred/n",

#389???????????????????????????? deviceExtension->WordsLeft,

#390??? ?????????????????????????wordCount));

#391????????????? }

#392?

#393????????????? //

#394????????????? // Verify this makes sense.

#395????????????? //

#396?

?

如果取得最小的值來傳送。

#397????????????? if (wordCount > deviceExtension->WordsLeft) {

#398????????????? ????wordCount = deviceExtension->WordsLeft;

#399????????????? }

#400?

#401????????? } else {

#402?

#403????????????? //

#404????????????? // Check if words left is at least 256.

#405????????????? //

#406?

?

如果只是傳送剩余的字節(jié),就設(shè)置傳送剩余字節(jié),否則就是傳送512個字節(jié)。

#407?????? ???????if (deviceExtension->WordsLeft < wordsThisInterrupt) {

#408?

#409???????????????? //

#410???????????????? // Transfer only words requested.

#411???????????????? //

#412?

#413???????????????? wordCount = deviceExtension->WordsLeft;

#414?

#415???? ?????????} else {

#416?

#417???????????????? //

#418???????????????? // Transfer next block.

#419???????????????? //

#420?

#421???????????????? wordCount = wordsThisInterrupt;

#422????????????? }

#423????????? }

#424?

#425????????? //

#426????????? // Ensure that this is a read command.

#427????????? //

#428?

?

檢查這個命令是讀取的命令。

#429????????? if (srb->SrbFlags & SRB_FLAGS_DATA_IN) {

#430?

#431???????????? DebugPrint((3,

#432??????????????????????? "AtapiInterrupt: Read interrupt/n"));

#433?

?

等待IDE設(shè)備空閑。

#434???????????? WaitOnBusy(baseIoAddress2,statusByte);

#435?

?

讀取數(shù)據(jù)到緩沖區(qū)。

#436???????????? if (atapiDev || !deviceExtension->DWordIO) {

#437???????????????? ReadBuffer(baseIoAddress1,

#438?????????????????????????? deviceExtension->DataBuffer,

#439?????????? ????????????????wordCount);

#440?

#441???????????? } else {

?

使用4字節(jié)的方式讀取。

#442???????????????? PIDE_REGISTERS_3 address3 = (PIDE_REGISTERS_3)baseIoAddress1;

#443?

#444???????????????? ReadBuffer2(address3,

#445??????????????????????????? (PULONG)(deviceExtension->DataBuffer),

#446??????????????????????????? wordCount / 2);

#447???????????? }

#448????????? } else {

#449?

?

處理這個IDE設(shè)備請示失敗。

#450????????????? DebugPrint((1,

#451????????????????????????? "AtapiInterrupt: Int reason %x, but srb is for a read %x./n",

#452????????????????????????? interruptReason,

#453????????????????????????? srb));

#454?

#455????????????? //

#456????????????? // Fail this request.

#457????????????? //

#458?

#459????????????? status = SRB_STATUS_ERROR;

#460????????????? goto CompleteRequest;

#461????????? }

#462?

#463????????? //

#464????????? // Translate ATAPI data back to SCSI data if needed

#465????????? //

#466?

#467????????? if (srb->Cdb[0] == ATAPI_MODE_SENSE &&

#468????????????? deviceExtension->DeviceFlags[srb->TargetId] & DFLAGS_ATAPI_DEVICE) {

#469?

#470????????????? //

#471????????????? //convert and adjust the wordCount

#472????????????? //

#473?

#474????????????? wordCount -= Atapi2Scsi(srb, (char *)deviceExtension->DataBuffer,

#475??????????????????????????????? ???????wordCount << 1);

#476????????? }

#477????????? //

#478????????? // Advance data buffer pointer and bytes left.

#479????????? //

#480?

?

調(diào)整已經(jīng)傳送的字節(jié)。

#481????????? deviceExtension->DataBuffer += wordCount;

#482????????? deviceExtension->WordsLeft -= wordCount;

#483?

#484????????? //

#485????????? // Check for read command complete.

#486????????? //

#487?

?

檢查是否讀取完成。

#488????????? if (deviceExtension->WordsLeft == 0) {

#489?

#490????????????? if (deviceExtension->DeviceFlags[srb->TargetId] & DFLAGS_ATAPI_DEVICE) {

#491?

#492????????????????? //

#493????????????????? // Work around to make many atapi devices return correct sector size

#494????????????????? // of 2048. Also certain devices will have sector count == 0x00, check

#495????????????????? // for that also.

#496????????????????? //

#497?

#498????????????????? if ((srb->Cdb[0] == 0x25) &&

#499????????????????????? ((deviceExtension->IdentifyData[srb->TargetId].GeneralConfiguration >> 8) & 0x1f) == 0x05) {

#500?

#501????????????????????? deviceExtension->DataBuffer -= wordCount;

#502????????????????????? if (deviceExtension->DataBuffer[0] == 0x00) {

#503?

#504????????????????????????? *((ULONG *) &(deviceExtension->DataBuffer[0])) = 0xFFFFFF7F;

#505?

#506????????????????????? }

#507?

#508????? ????????????????*((ULONG *) &(deviceExtension->DataBuffer[2])) = 0x00080000;

#509????????????????????? deviceExtension->DataBuffer += wordCount;

#510????????????????? }

#511????????????? } else {

#512?

#513????????????????? //

#514????????????????? // Completion for IDE drives.

#515????????????????? //

#516?

?

到這里已經(jīng)讀取數(shù)據(jù)完成。

#517?

#518????????????????? if (deviceExtension->WordsLeft) {

#519?

#520????????????????????? status = SRB_STATUS_DATA_OVERRUN;

#521?

#522????????????????? } else {

#523?

#524?????? ???????????????status = SRB_STATUS_SUCCESS;

#525?

#526????????????????? }

#527?

#528????????????????? goto CompleteRequest;

#529?

#530????????????? }

#531????????? }

#532?

#533????????? return TRUE;

#534?

#535????? } else if (interruptReason == 0x3? && !(statusByte & IDE_STATUS_DRQ)) {

#536?

#537????????? //

#538????????? // Command complete.

#539????????? //

#540?

?

否則是寫數(shù)據(jù)完成。

#541????????? if (deviceExtension->WordsLeft) {

#542?

#543????????????? status = SRB_STATUS_DATA_OVERRUN;

#544?

#545??????? ??} else {

#546?

#547????????????? status = SRB_STATUS_SUCCESS;

#548?

#549????????? }

#550?

#551? CompleteRequest:

#552?

#553????????? //

#554????????? // Check and see if we are processing our secret (mechanism status/request sense) srb

#555????????? //

#556????????? if (deviceExtension->OriginalSrb) {

#557?

#558????????????? ULONG srbStatus;

#559?

#560????????????? if (srb->Cdb[0] == SCSIOP_MECHANISM_STATUS) {

#561?

#562????????????????? if (status == SRB_STATUS_SUCCESS) {

#563???????????????????? ?// Bingo!!

#564????????????????????? AtapiHwInitializeChanger (HwDeviceExtension,

#565??????????????????????????????????????????????? srb->TargetId,

#566??????????????????????????????????????????????? (PMECHANICAL_STATUS_INFORMATION_HEADER) srb->DataBuffer);

#567?

#568????????????????????? // Get ready to issue the original srb

#569????????????????????? srb = deviceExtension->CurrentSrb = deviceExtension->OriginalSrb;

#570????????????????????? deviceExtension->OriginalSrb = NULL;

#571?

#572????????????? ????} else {

#573????????????????????? // failed!? Get the sense key and maybe try again

#574????????????????????? srb = deviceExtension->CurrentSrb = BuildRequestSenseSrb (

#575??????????????????????????????????????????????????????????? HwDeviceExtension,

#576??????????????????????????????????????????????????????????? deviceExtension->OriginalSrb->PathId,

#577??????????????????????????????????????????????????????????? deviceExtension->OriginalSrb->TargetId);

#578????????????????? }

#579?

?

重新發(fā)送當(dāng)前SRB數(shù)據(jù)包。

#580????????????????? srbStatus = AtapiSendCommand(HwDeviceExtension, deviceExtension->CurrentSrb);

#581????????????????? if (srbStatus == SRB_STATUS_PENDING) {

#582????????????????????? return TRUE;

#583????????????????? }

#584?

#585????????????? } else { // srb->Cdb[0] == SCSIOP_REQUEST_SENSE)

#586?

?

?

#587????????????????? PSENSE_DATA senseData = (PSENSE_DATA) srb->DataBuffer;

#588?

#589????????????????? if (status == SRB_STATUS_DATA_OVERRUN) {

#590????????????????????? // Check to see if we at least get mininum number of bytes

#591????????????????????? if ((srb->DataTransferLength - deviceExtension->WordsLeft) >

#592????????????????????????? (FIELD_OFFSET (SENSE_DATA, AdditionalSenseLength) + sizeof(senseData->AdditionalSenseLength))) {

#593???????????? ?????????????status = SRB_STATUS_SUCCESS;

#594????????????????????? }

#595????????????????? }

#596?

#597????????????????? if (status == SRB_STATUS_SUCCESS) {

#598????????????????????? if ((senseData->SenseKey != SCSI_SENSE_ILLEGAL_REQUEST) &&

#599??????? ??????????????????deviceExtension->MechStatusRetryCount) {

#600?

#601????????????????????????? // The sense key doesn't say the last request is illegal, so try again

#602????????????????????????? deviceExtension->MechStatusRetryCount--;

#603????????????? ????????????srb = deviceExtension->CurrentSrb = BuildMechanismStatusSrb (

#604??????????????????????????????????????????????????????????????? HwDeviceExtension,

#605??????????????????????????????????????????????????????????????? deviceExtension->OriginalSrb->PathId,

#606??????????????????????????????????????????????????????????????? deviceExtension->OriginalSrb->TargetId);

#607????????????????????? } else {

#608?

#609????????????????????????? // last request was illegal.? No point trying again

#610?

#611 ?????????????????????????AtapiHwInitializeChanger (HwDeviceExtension,

#612??????????????????????????????????????????????????? srb->TargetId,

#613??????????????????????????????????????????????????? (PMECHANICAL_STATUS_INFORMATION_HEADER) NULL);

#614?

#615 ?????????????????????????// Get ready to issue the original srb

#616????????????????????????? srb = deviceExtension->CurrentSrb = deviceExtension->OriginalSrb;

#617????????????????????????? deviceExtension->OriginalSrb = NULL;

#618????????????????????? }

#619?

#620????????????????????? srbStatus = AtapiSendCommand(HwDeviceExtension, deviceExtension->CurrentSrb);

#621????????????????????? if (srbStatus == SRB_STATUS_PENDING) {

#622????????????????????????? return TRUE;

#623????????????????????? }

#624????? ????????????}

#625????????????? }

#626?

#627????????????? // If we get here, it means AtapiSendCommand() has failed

#628????????????? // Can't recover.? Pretend the original srb has failed and complete it.

#629?

?

運行到這里,已經(jīng)說明AtapiSendCommand函數(shù)發(fā)送失敗。

#630?? ???????????if (deviceExtension->OriginalSrb) {

#631????????????????? AtapiHwInitializeChanger (HwDeviceExtension,

#632??????????????????????????????????????????? srb->TargetId,

#633??????????????????????????????????????????? (PMECHANICAL_STATUS_INFORMATION_HEADER) NULL);

#634????????????????? srb = deviceExtension->CurrentSrb = deviceExtension->OriginalSrb;

#635????????????????? deviceExtension->OriginalSrb = NULL;

#636????????????? }

#637?

#638????????????? // fake an error and read no data

#639????????? ????status = SRB_STATUS_ERROR;

#640????????????? srb->ScsiStatus = 0;

#641????????????? deviceExtension->DataBuffer = srb->DataBuffer;

#642????????????? deviceExtension->WordsLeft = srb->DataTransferLength;

#643????????????? deviceExtension->RDP = FALSE;

#644?

#645????????? } else if (status == SRB_STATUS_ERROR) {

#646?

#647????????????? //

#648????????????? // Map error to specific SRB status and handle request sense.

#649????????????? //

#650?

?

SRB數(shù)據(jù)包的狀態(tài)出錯。

#651????????????? status = MapError(deviceExtension,

#652??????????????????????????????? srb);

#653?

#654????????????? deviceExtension->RDP = FALSE;

#655?

#656????????? } else {

#657?

#658????????????? //

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

#660????????????? //

#661?

?

忙等IDE設(shè)備,并且復(fù)位IDE設(shè)備。

#662????????????? for (i = 0; i < 30; i++) {

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

#664????????????????? if (!(statusByte & IDE_STATUS_BUSY)) {

#665????????????????????? break;

#666????????????????? }

#667????????????????? ScsiPortStallExecution(500);

#668????????????? }

#669?

#670????????????? if (i == 30) {

#671?

#672????????????????? //

#673????????????????? // reset the controller.

#674????????????????? //

#675?

#676????????????????? DebugPrint((1,

#677?????????????????????????? ???"AtapiInterrupt: Resetting due to BSY still up - %x. Base Io %x/n",

#678????????????????????????????? statusByte,

#679????????????????????????????? baseIoAddress1));

#680????????????????? AtapiResetController(HwDeviceExtension,srb->PathId);

#681??????? ??????????return TRUE;

#682????????????? }

#683?

#684????????????? //

#685????????????? // Check to see if DRQ is still up.

#686????????????? //

#687?

?

如果IDE設(shè)備還是DRQ狀態(tài),就等一會,直到不是這個狀態(tài)。

#688????????????? if (statusByte & IDE_STATUS_DRQ) {

#689?

#690??????? ??????????for (i = 0; i < 500; i++) {

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

#692????????????????????? if (!(statusByte & IDE_STATUS_DRQ)) {

#693????????????????????????? break;

#694????????????????????? }

#695???????????????????? ?ScsiPortStallExecution(100);

#696?

#697????????????????? }

#698?

#699????????????????? if (i == 500) {

#700?

#701????????????????????? //

#702????????????????????? // reset the controller.

#703????????????????????? //

#704?

#705????????????????????? DebugPrint((1,

#706????????????????????????????????? "AtapiInterrupt: Resetting due to DRQ still up - %x/n",

#707????????????????????????????????? statusByte));

#708????????????????????? AtapiResetController(HwDeviceExtension,srb->PathId);

#709???????????? ?????????return TRUE;

#710????????????????? }

#711?

#712????????????? }

#713????????? }

#714?

#715?

#716????????? //

#717????????? // Clear interrupt expecting flag.

#718????????? //

#719?

?

清除中斷標(biāo)志。

#720????????? deviceExtension->ExpectingInterrupt = FALSE;

#721?

#722????????? //

#723????????? // Sanity check that there is a current request.

#724????????? //

#725?

?

檢查當(dāng)前請求包。

#726????????? if (srb != NULL) {

#727?

#728????????????? //

#729????????????? // Set status in SRB.

#730????????????? //

#731?

#732????????????? srb->SrbStatus = (UCHAR)status;

#733?

#734????????????? //

#735????????????? // Check for underflow.

#736????????????? //

#737?

#738????????????? if (deviceExtension->WordsLeft) {

#739?

#740????????????????? //

#741????????????????? // Subtract out residual words and update if filemark hit,

#742????????????????? // setmark hit , end of data, end of media...

#743????????????????? //

#744?

#745????????????????? if (!(deviceExtension->DeviceFlags[srb->TargetId] & DFLAGS_TAPE_DEVICE)) {

#746????????????????? if (status == SRB_STATUS_DATA_OVERRUN) {

#747????????????????????? srb->DataTransferLength -= deviceExtension->WordsLeft;

#748????????????????? } else {

#749????????????????????? srb->DataTransferLength = 0;

#750????????????????? }

#751 ?????????????????} else {

#752????????????????????? srb->DataTransferLength -= deviceExtension->WordsLeft;

#753????????????????? }

#754????????????? }

#755?

#756????????????? if (srb->Function != SRB_FUNCTION_IO_CONTROL) {

#757?

#758????????????????? //

#759????????????????? // Indicate command complete.

#760????????????????? //

#761?

#762????????????????? if (!(deviceExtension->RDP)) {

#763????????????????????? ScsiPortNotification(RequestComplete,

#764?????????????????????????????????????????? deviceExtension,

#765?????????????????????????????????????????? srb);

#766?

#767????????????????? }

#768????????????? } else {

#769?

#770????????????????? PSENDCMDOUTPARAMS cmdOutParameters = (PSENDCMDOUTPARAMS)(((PUCHAR)srb->DataBuffer) + sizeof(SRB_IO_CONTROL));

#771????????????????? UCHAR???????????? error = 0;

#772?

#773????????????????? if (status != SRB_STATUS_SUCCESS) {

#774????????????????????? error = ScsiPortReadPortUchar((PUCHAR)baseIoAddress1 + 1);

#775????????????????? }

#776?

#777???????????????? ?//

#778????????????????? // Build the SMART status block depending upon the completion status.

#779????????????????? //

#780?

#781????????????????? cmdOutParameters->cBufferSize = wordCount;

#782????????????????? cmdOutParameters->DriverStatus.bDriverError = (error) ? SMART_IDE_ERROR : 0;

#783????????????????? cmdOutParameters->DriverStatus.bIDEError = error;

#784?

#785????????????????? //

#786????????????????? // If the sub-command is return smart status, jam the value from cylinder low and high, into the

#787????????????????? // data buffer.

#788????????????????? //

#789?

#790????????????????? if (deviceExtension->SmartCommand == RETURN_SMART_STATUS) {

#791????????????????????? cmdOutParameters->bBuffer[0] = RETURN_SMART_STATUS;

#792?????????????????? ???cmdOutParameters->bBuffer[1] = ScsiPortReadPortUchar(&baseIoAddress1->InterruptReason);

#793????????????????????? cmdOutParameters->bBuffer[2] = ScsiPortReadPortUchar(&baseIoAddress1->Unused1);

#794????????????????????? cmdOutParameters->bBuffer[3] = ScsiPortReadPortUchar(&baseIoAddress1->ByteCountLow);

#795????????????????????? cmdOutParameters->bBuffer[4] = ScsiPortReadPortUchar(&baseIoAddress1->ByteCountHigh);

#796????????????????????? cmdOutParameters->bBuffer[5] = ScsiPortReadPortUchar(&baseIoAddress1->DriveSelect);

#797????????????????????? cmdOutParameters->bBuffer[6] = SMART_CMD;

#798????????????????????? cmdOutParameters->cBufferSize = 8;

#799????????????????? }

#800?

#801????????????????? //

#802????????????????? // Indicate command complete.

#803????????????????? //

#804?

#805????????????????? ScsiPortNotification(RequestComplete,

#806?????????????????????????????????????? deviceExtension,

#807?????????????????????????????????????? srb);

#808?

#809????????????? }

#810?

#811????????? } else {

#812?

#813????????????? DebugPrint((1,

#814???????????????????????? "AtapiInterrupt: No SRB!/n"));

#815????????? }

#816?

#817????????? //

#818????????? // Indicate ready for next request.

#819????????? //

#820?

?

設(shè)置IDE設(shè)備可能處理下一個請求包。

#821????????? if (!(deviceExtension->RDP)) {

#822?

#823????????????? //

#824????????????? // Clear current SRB.

#825????????????? //

#826?

#827????????????? deviceExtension->CurrentSrb = NULL;

#828?

#829????????????? ScsiPortNotification(NextRequest,

#830?????????????????? ????????????????deviceExtension,

#831?????????????????????????????????? NULL);

#832????????? } else {

#833?

#834????????????? ScsiPortNotification(RequestTimerCall,

#835?????????????????????????????????? HwDeviceExtension,

#836??????????????????????????? ???????AtapiCallBack,

#837?????????????????????????????????? 2000);

#838????????? }

#839?

#840????????? return TRUE;

#841?

#842????? } else {

#843?

#844????????? //

#845????????? // Unexpected int.

#846????????? //

#847?

#848????????? DebugPrint((3,

#849????????????????????? "AtapiInterrupt: Unexpected interrupt. InterruptReason %x. Status %x./n",

#850????????????????????? interruptReason,

#851????????????????????? statusByte));

#852????????? return FALSE;

#853????? }

#854?

#855????? return TRUE;

#856 ?

#857? } // end AtapiInterrupt()

轉(zhuǎn)載于:https://www.cnblogs.com/ajuanabc/archive/2009/10/19/2463676.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

av成人动漫 | 黄色小说视频网站 | 日韩日韩日韩日韩 | 日韩免费看的电影 | 亚洲精品久久视频 | 天天射天天搞 | 色开心 | 91av99| 69人人| 久久久免费少妇 | 99久久久成人国产精品 | 亚洲欧美综合精品久久成人 | 一区av在线播放 | av福利在线导航 | 91av视频播放| 日韩av五月天| 欧美日韩在线免费观看 | 综合久久五月天 | 久久97视频 | 日本久久免费视频 | 久久午夜国产 | 国产伦精品一区二区三区在线 | 黄色网址在线播放 | 午夜在线免费观看视频 | 精品毛片一区二区免费看 | 人人澡人人模 | 网站在线观看日韩 | 国产综合香蕉五月婷在线 | 免费手机黄色网址 | 免费黄色一区 | 亚洲五月综合 | 久久成人黄色 | 久久99精品久久久久久三级 | 亚洲97在线| 狠狠综合 | 色www.| 中文字幕电影高清在线观看 | 九九热在线观看 | 欧美在线观看视频一区二区 | 亚洲作爱视频 | 女人18毛片90分钟 | 亚洲综合视频网 | 中文字幕视频免费观看 | 免费在线a | 激情图片久久 | 国产在线美女 | 天天草天天色 | 91亚洲欧美| 四虎海外影库www4hu | 特级西西www44高清大胆图片 | 激情综合亚洲精品 | 久久久久国产精品一区 | 国产一级电影免费观看 | 久久爱影视i | 波多野结衣一区三区 | 中文字幕在线观看第一区 | 最新色站 | 99精品黄色| 天天干国产 | 国产免费视频一区二区裸体 | 人人爱爱人人 | 国产无遮挡又黄又爽在线观看 | 日韩三级成人 | 麻豆传媒在线视频 | 色老板在线视频 | 一区二区三区久久 | 91精品久久久久久粉嫩 | 成人免费看片98欧美 | 欧美精品成人在线 | 丝袜美腿在线 | 婷婷综合导航 | 99久久精品电影 | 人人爱人人做人人爽 | 在线亚洲午夜片av大片 | 国产免费午夜 | 国产69精品久久久久9999apgf | 黄色成人在线网站 | 久久99日韩 | 久久精品电影网 | 成年人看片 | 91av九色| 精品欧美小视频在线观看 | 9在线观看免费高清完整版 玖玖爱免费视频 | 日韩一级黄色片 | 亚洲va在线va天堂 | 99九九热只有国产精品 | 91成人免费电影 | 91中文字幕在线观看 | 91成人免费视频 | 国产精品一区二区av日韩在线 | 欧美日韩色婷婷 | 国产美女永久免费 | 二区三区在线视频 | 中文字幕有码在线 | 欧美极品久久 | 久久国产精品久久久久 | 国产在线观看网站 | 高清在线观看av | 亚洲国产精品999 | 天天射射天天 | 国内精自线一二区永久 | www一起操| 国产高清在线观看 | 国产免费一区二区三区网站免费 | 中文字幕在线免费97 | 在线观看v片| 久久国产精品免费看 | 亚洲一区不卡视频 | 国产一区欧美一区 | 狠狠ri| 亚洲激情 | 婷婷在线综合 | 欧美成年黄网站色视频 | 一区二区精品在线视频 | 99视频精品视频高清免费 | 午夜视频亚洲 | 天天操夜夜摸 | 国产精品永久免费视频 | 九九精品在线观看 | 日韩欧美综合在线视频 | 久爱综合| av高清一区 | 婷婷五情天综123 | 久久激情视频 | 在线va网站| 在线黄av | 中文字幕在线一区观看 | 高清国产午夜精品久久久久久 | 手机看片福利 | 成人av中文字幕在线观看 | 欧美激情视频在线观看免费 | 综合国产在线观看 | 99色视频在线 | 国产色视频网站 | 成人黄色在线电影 | 亚洲性少妇性猛交wwww乱大交 | 婷婷丁香花五月天 | 在线免费观看视频你懂的 | 日韩69视频 | 一区二区精品视频 | 国产精品久久久久久久久久99 | 91色国产| 91精品欧美一区二区三区 | av中文字幕网 | 91传媒在线观看 | 日韩精品资源 | 日日夜夜天天人人 | 九九热免费精品视频 | 精品欧美一区二区在线观看 | 天天做天天爱天天综合网 | 亚洲国产精品小视频 | 久久视频在线免费观看 | 精品国产免费人成在线观看 | 狠狠色丁香婷婷综合久久片 | 亚洲午夜激情网 | 欧美午夜视频在线 | 中文字幕中文字幕在线中文字幕三区 | 91亚洲精品久久久蜜桃 | 最新婷婷色 | 精品国产乱码久久久久久浪潮 | 日韩中文字幕免费在线播放 | 日韩手机在线 | 青青河边草免费观看 | 六月激情久久 | 伊人热 | 色综合在 | 超碰在线人| 久久九九影院 | 亚洲毛片久久 | 狠狠操操网 | 日韩sese| 玖玖在线资源 | 亚洲激情网站免费观看 | 狠狠婷婷 | 在线 成人| 国产区久久 | 91九色自拍 | 欧美日本不卡视频 | 日本韩国精品一区二区在线观看 | 三级黄色理论片 | 国产淫片 | 日韩精品大片 | 日本不卡一区二区三区在线观看 | 在线视频91 | 色综合亚洲精品激情狠狠 | 久草在线最新免费 | 久久久免费看视频 | 免费视频网 | 免费在线观看亚洲视频 | 中文字幕人成一区 | 综合在线色 | 久久精品a | 二区三区中文字幕 | 天天做天天爱天天综合网 | 中文字幕在线播出 | 欧美做受高潮1 | 色爽网站 | 免费视频99 | 女人18片毛片90分钟 | 不卡精品视频 | 国产久草在线 | 国产精品视频最多的网站 | 日韩av伦理片 | 波多野结衣精品在线 | 超碰日韩在线 | 激情欧美xxxx | 国产亚洲精品久久久久久移动网络 | 正在播放 久久 | 精品欧美小视频在线观看 | 精品999在线观看 | 亚洲aⅴ在线| 久久a免费视频 | 久久久久久久国产精品 | 在线色亚洲 | 99精品在线免费 | 日韩视频中文 | 久久久999免费视频 日韩网站在线 | 久久优 | 中文伊人 | 欧美性色19p | 日韩在线不卡视频 | 超碰99人人 | 欧美另类高清 videos | av高清一区二区三区 | 久草在线这里只有精品 | 国产亚洲精品久久久久久久久久 | 国产一级一级国产 | 狠狠操天天射 | 国产在线播放一区二区三区 | 激情综合久久 | 玖玖在线观看视频 | 国产日韩欧美在线 | 久久久久久不卡 | 久久a v视频 | 97超碰在线久草超碰在线观看 | 色噜噜日韩精品欧美一区二区 | 亚洲欧美日本一区二区三区 | 久操中文字幕在线观看 | 综合久久一本 | 欧美日韩中文在线观看 | 日韩欧美在线视频一区二区 | 久热av在线| 国产视频亚洲视频 | 国产一区二区在线观看视频 | 亚洲一级电影视频 | 最近最新最好看中文视频 | 久久99精品热在线观看 | 97操碰| 日韩欧美精选 | 五月天天色| 草久久精品 | 狠狠狠狠狠狠 | 日韩欧美电影 | 欧美亚洲免费在线一区 | 成人免费观看网址 | 欧美精品久久久久性色 | 国产精品原创av片国产免费 | 久久精品www人人爽人人 | 久久在视频 | 九九热精品视频在线观看 | 久久精品欧美一区 | 成人久久久久久久久久 | 免费a级黄色毛片 | 麻豆免费看片 | 精品欧美在线视频 | 国产精品99久久久久的智能播放 | 亚洲精选视频免费看 | 精品一区二区在线观看 | 欧美日韩不卡一区二区 | 国产91精品在线观看 | 天天操网站 | 成人观看| 久久在线影院 | 91丨精品丨蝌蚪丨白丝jk | 高清不卡免费视频 | 亚洲一区久久久 | 久久精品99久久 | 正在播放五月婷婷狠狠干 | 亚洲精品国产拍在线 | 午夜久久久精品 | 日韩视频 一区 | 亚洲国产精品传媒在线观看 | 久久精品女人毛片国产 | 国产一区高清在线 | 国产99在线免费 | 久草资源免费 | 国产免费av一区二区三区 | 99视频在线精品国自产拍免费观看 | 国产免费大片 | 久久久久久久久久久网站 | 能在线观看的日韩av | 日韩免费福利 | 91在线视频免费播放 | 亚洲欧洲一区二区在线观看 | 欧美做受高潮1 | 五月激情婷婷丁香 | 18性欧美xxxⅹ性满足 | 久草在线中文888 | 久草在线中文888 | 性色视频在线 | 日日夜夜精品网站 | 日韩精品短视频 | 日韩欧美高清 | 国产精品理论在线观看 | 丁香六月色| 久久高视频 | 欧美一区在线观看视频 | 亚洲天堂网在线播放 | 国产高清综合 | 成人精品一区二区三区中文字幕 | 亚洲精品免费在线观看视频 | 亚洲精品视频二区 | 国产黄色在线看 | 天天爱天天 | 日韩电影中文,亚洲精品乱码 | 日韩精品久久久久久 | av片在线观看 | 欧美尹人| 日韩特黄av| 91av在线视频播放 | 国产剧情亚洲 | 中文十次啦 | 亚洲精品在线资源 | 国产区精品 | 国产成人精品一区二三区 | 国产精品一区二区av麻豆 | 国产精品wwwwww | 伊人激情网 | 亚洲综合精品视频 | av超碰在线| 久久成人精品电影 | 成人片在线播放 | 中文在线中文资源 | 国产精品久久久久久影院 | 国产精品自拍在线 | 91av视频观看 | 99九九视频| 中文字幕成人在线观看 | 免费看国产黄色 | 91chinesexxx| 亚洲精品18日本一区app | 亚洲国产精品电影在线观看 | 97精品在线 | 91成人在线视频 | 日韩一二区在线 | 婷婷色吧| www天天干com | 国产女人40精品一区毛片视频 | 欧美成人久久 | 亚洲精品视频在线免费播放 | 91久草视频| 激情综合亚洲精品 | 国产a级免费 | 99精品视频在线免费观看 | 国内精品久久久久久久久久清纯 | v片在线看 | 国产五月婷婷 | 99久久综合精品五月天 | 成人在线视频观看 | 99精品国产99久久久久久97 | 天天射天天搞 | 久久网站av | 国产精品综合久久久久 | 欧美成人性战久久 | 91精品久久久久久粉嫩 | 又污又黄的网站 | 久久99精品久久久久久 | 成人一区二区三区中文字幕 | 国产成人综合在线观看 | 深爱五月激情五月 | 在线免费观看的av | 亚洲国产mv| 久草在线网址 | www免费在线观看 | 成 人 免费 黄 色 视频 | 国内精品久久久久影院男同志 | 久久国内精品99久久6app | 欧美地下肉体性派对 | www178ccom视频在线 | 91免费观看视频在线 | 国产999精品久久久久久绿帽 | www久久 | 少妇自拍av | 久久a级片| 午夜美女福利直播 | 中文字幕第一页在线 | 中文字幕av免费在线观看 | 久久99精品久久久久久清纯直播 | 免费a一级 | 天天干天天射天天操 | 91av免费在线观看 | 国产精品免费视频观看 | 日韩动漫免费观看高清完整版在线观看 | 808电影免费观看三年 | 黄色网在线播放 | 亚洲国产精品视频在线观看 | 欧美激情第28页 | 色视频在线看 | 精品国产美女在线 | 国产免费观看久久 | 在线观看亚洲精品视频 | 欧美成人精品三级在线观看播放 | 亚洲伊人婷婷 | 成人久久18免费网站 | 久久高清国产视频 | 成人黄在线观看 | 黄色网址a | 婷婷色综合色 | 有没有在线观看av | 不卡的一区二区三区 | 天天视频色| 国色天香永久免费 | 亚洲精品在线观看视频 | 精品美女在线观看 | 天天激情天天干 | 亚洲最大成人网4388xx | 色婷婷在线视频 | 欧美日韩中文国产 | 99久久综合狠狠综合久久 | 日韩免费在线观看网站 | 国产精品视频全国免费观看 | 97在线观视频免费观看 | 国产成人精品国内自产拍免费看 | 青春草免费在线视频 | 91av资源网| 国产精品久久久久国产精品日日 | 国产一区二区播放 | 久久久久伦理电影 | 欧美一二三区在线播放 | 久久久久国产精品免费免费搜索 | 亚洲一区av | 久视频在线播放 | 在线你懂的视频 | 日韩精品专区在线影院重磅 | 91视频麻豆视频 | 日韩在线高清免费视频 | 黄色大片入口 | av免费观看网址 | 狠狠狠狠狠狠狠干 | 婷婷六月久久 | 黄色一级大片在线免费看产 | 97超碰在线人人 | 中文字幕黄色 | 奇米影视777四色米奇影院 | 99精品国产99久久久久久福利 | 一二区精品 | 久久伊人精品天天 | 精品欧美小视频在线观看 | 韩日精品在线观看 | 91福利在线观看 | 在线免费观看的av | 黄色免费网 | 成人av免费电影 | 天天干人人| 国产日韩av在线 | 国产亚洲欧美精品久久久久久 | 91手机电影 | 91精品国产成人观看 | 日韩电影在线观看中文字幕 | 国产精品免费一区二区三区在线观看 | 国产高清在线免费观看 | 亚洲精品视频播放 | 91亚洲精品国偷拍 | 亚洲欧美一区二区三区孕妇写真 | 久久婷亚洲五月一区天天躁 | 欧美极度另类性三渗透 | 懂色av一区二区三区蜜臀 | 91天堂在线观看 | 黄色大片入口 | 一区二区视频在线播放 | 久久亚洲私人国产精品va | 91视频免费观看 | 色婷婷亚洲婷婷 | 干av在线 | 91视频在线观看下载 | 五月婷香蕉久色在线看 | 国产91粉嫩白浆在线观看 | 天天操人 | 99婷婷狠狠成为人免费视频 | 亚洲全部视频 | 久久99精品国产99久久6尤 | 69av网| 国产永久免费高清在线观看视频 | 免费激情网| 久久婷婷一区 | 在线观看中文字幕第一页 | 亚洲精品午夜视频 | 中文字幕在线专区 | 福利av影院 | 久久99视频 | 天天干天天拍天天操天天拍 | 亚洲国产日韩精品 | 日日操网 | 精品久久精品久久 | 91大神一区二区三区 | 特级西西444www高清大视频 | 免费能看的黄色片 | 国产精品久久99综合免费观看尤物 | 午夜性盈盈 | 亚洲精品乱码久久久久久写真 | 欧洲亚洲女同hd | 国精产品999国精产品视频 | 欧洲色综合 | 日韩在线观看一区 | 久久观看最新视频 | 正在播放一区二区 | 深夜免费福利 | 国产一区二区综合 | 久草在线免费资源 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 亚洲精欧美一区二区精品 | 久久久五月天 | 国产一级电影免费观看 | 国产亚洲精品成人 | 天天爽天天射 | 国产高清成人av | 在线免费观看黄色av | 亚洲午夜av| av一级片在线观看 | 日本中文在线 | 国产精品露脸在线 | 天堂中文在线播放 | 91香蕉亚洲精品 | 免费观看全黄做爰大片国产 | 婷婷午夜 | 五月婷婷欧美视频 | 美腿丝袜av | 麻豆国产视频 | 日韩成人黄色 | 色综合夜色一区 | 91精品视频一区二区三区 | 狠狠综合网 | 不卡精品 | 色噜噜噜噜| 午夜精品久久久久久久久久久久久久 | 中文在线天堂资源 | 欧美一区二区三区不卡 | 成人久久精品 | 青青射| 91 在线视频 | 久久理论片 | 91午夜精品 | 韩国三级av在线 | 久久这里只有精品首页 | 天天色天天骑天天射 | 黄色电影网站在线观看 | 在线观看国产麻豆 | 国产一级精品视频 | 在线视频 区 | 成人午夜电影网 | 日日干天夜夜 | 国产三级精品在线 | 日韩在线不卡视频 | 91精品在线视频观看 | 国产视频999| 韩国av免费在线 | 国产一区av在线 | 日本精品一二区 | 久热爱 | 国产精品日韩欧美一区二区 | 国产资源精品在线观看 | 天天操天天艹 | 在线观看视频一区二区三区 | 国产成人一区二 | 亚洲一区美女视频在线观看免费 | 人人爽人人爽人人爽人人爽 | 日日日爽爽爽 | 91最新视频在线观看 | 亚洲免费成人av电影 | 久久最新网址 | 伊人婷婷在线 | 欧美巨大荫蒂茸毛毛人妖 | 黄av资源| 96av在线| 92国产精品久久久久首页 | 久操操 | 少妇av网 | 国产视频久久久 | 亚洲 中文 在线 精品 | 五月开心激情 | 97超碰资源 | 激情久久婷婷 | 欧美日韩国产一区二区三区 | 国产二区精品 | 久久久久婷 | 四虎国产精品成人免费4hu | 亚洲最新毛片 | 久久九九国产精品 | 欧美日本在线观看视频 | 国产国产人免费人成免费视频 | 在线免费看黄色 | 日韩欧美一区二区三区在线 | 波多野结衣在线视频免费观看 | 久久久免费观看视频 | 成人黄色在线观看视频 | 欧美成人tv| 中文字幕一区二区三区四区视频 | 三级av免费看| 久久久影视 | 久久免费视频一区 | 一区二区三区播放 | 欧美日韩精品国产 | 国产精品麻豆视频 | 特级西西444www大胆高清无视频 | 国产色婷婷精品综合在线手机播放 | 免费美女久久99 | 亚洲成人精品在线观看 | 四虎成人精品在永久免费 | 婷婷激情在线观看 | 亚洲精品网址在线观看 | 999在线精品 | 手机在线欧美 | 国产成人精品久久久 | 国产精品24小时在线观看 | 激情网第四色 | 婷婷视频在线播放 | 日韩在线网 | a亚洲视频 | 久久久精品 一区二区三区 国产99视频在线观看 | 青青河边草观看完整版高清 | 美女视频网 | 亚洲成人资源在线观看 | 日本在线成人 | 97电影院网| 国产福利在线 | 在线久草视频 | 在线免费性生活片 | 精品久久久久国产免费第一页 | 美女视频黄是免费的 | 五月天亚洲综合小说网 | 操操爽 | 久久综合9988久久爱 | 亚洲一区二区三区在线看 | 亚洲专区在线视频 | 国产精品久久久久久久久久久久久久 | 色五月成人 | 欧美天天综合网 | 久久好看免费视频 | 青青草华人在线视频 | 国产偷国产偷亚洲清高 | 91成人天堂久久成人 | 久久综合色8888 | 久久av高清 | 激情视频网页 | 午夜视频久久久 | 色欧美日韩 | 97人人模人人爽人人喊网 | .精品久久久麻豆国产精品 亚洲va欧美 | 亚洲精品午夜国产va久久成人 | 99久久婷婷国产精品综合 | 色婷婷精品大在线视频 | 午夜av电影院 | 欧美aa在线 | 精品福利片 | 亚洲黄色在线观看 | 久久精品电影院 | 亚洲乱码精品久久久久 | 成 人 黄 色 视频播放1 | 日韩精品中文字幕在线不卡尤物 | av在线影片 | 在线观看av大片 | 国产一及片 | 在线国产不卡 | 亚洲欧美日韩精品久久奇米一区 | 欧美热久久 | 99综合电影在线视频 | 欧美色图另类 | 午夜精品福利在线 | 五月天综合色激情 | 91视频免费| 91最新网址在线观看 | 99久久精品免费看 | 超碰官网 | 久久视频在线观看中文字幕 | 成人免费大片黄在线播放 | 精品99在线视频 | 欧美成人性战久久 | 精品国产乱码久久久久久浪潮 | 欧美一区二区在线刺激视频 | 久久天天躁 | 欧美肥妇free | 久久99精品一区二区三区三区 | 国产精品久久久久久久久久久不卡 | 国产在线观看不卡 | 久久免费在线观看视频 | 亚一亚二国产专区 | 精品久久一区二区三区 | 视频一区视频二区在线观看 | 精品久久一区 | 欧美成人日韩 | 中文一区在线观看 | 欧美另类sm图片 | 欧美a级在线播放 | 日韩免费视频网站 | 天天操福利视频 | 久久草精品 | 国产精品成人一区二区三区吃奶 | av看片在线观看 | 国产福利午夜 | 国产精品破处视频 | 久久久久日本精品一区二区三区 | 日韩二区在线 | 人人爽人人爽人人爽人人爽 | 又黄又爽又无遮挡的视频 | 免费在线国产 | 久久久国产电影 | 中文字幕在线观看免费高清完整版 | 久久av电影 | 成年人黄色在线观看 | 日韩在线观看a | 日本九九视频 | 综合激情网 | 四虎国产精品成人免费4hu | 99久久99久国产黄毛片 | 97在线精品视频 | 精品九九久久 | 丁香五香天综合情 | 亚洲手机天堂 | 中文字幕av专区 | 激情电影影院 | 视频成人永久免费视频 | 天天弄天天操 | 久久久久国产免费免费 | 在线国产专区 | 欧美少妇的秘密 | 美女网站在线观看 | 亚洲精品大全 | 成人教育av | 久久久久综合网 | 亚洲精品视频网站在线观看 | 亚洲在线视频免费观看 | 久久国产精品一区二区三区四区 | 国产午夜三级一二三区 | 久久福利国产 | 婷婷色六月天 | 永久免费精品视频网站 | 国产精品午夜久久久久久99热 | 欧美伦理一区二区 | 美国人与动物xxxx | 91干干干 | 欧美一区二区在线刺激视频 | 日韩精品短视频 | 亚洲欧洲av | 天天天综合 | a极黄色片| 国产综合福利在线 | 久久精品老司机 | 一区中文字幕在线观看 | av黄色免费看 | 粉嫩av一区二区三区四区在线观看 | 国产69精品久久app免费版 | 精品久久久久一区二区国产 | 96国产精品视频 | 三级黄色在线观看 | 色九色| 日韩欧美视频一区二区三区 | 久久久久免费精品视频 | 久久久久免费观看 | 国产真实精品久久二三区 | 成人免费视频网址 | 国产999在线观看 | 狠狠操天天操 | 亚洲h色精品| 亚洲影视九九影院在线观看 | 欧美一级特黄高清视频 | 亚洲女欲精品久久久久久久18 | 日日操日日插 | 国产精品色婷婷视频 | av色网站 | 天天激情在线 | 91九色成人 | 香蕉视频日本 | 成 人 黄 色 片 在线播放 | 成年人视频在线观看免费 | 色综合天天 | 亚洲精品午夜aaa久久久 | 在线亚洲成人 | 日日夜夜精品网站 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 婷婷丁香花五月天 | 成人在线一区二区 | 玖玖在线观看视频 | 国产精品自产拍在线观看网站 | 免费在线观看亚洲视频 | 精品99在线观看 | 国产成人在线免费观看 | 久久久午夜视频 | 91探花在线 | 6080yy午夜一二三区久久 | 五月婷婷伊人网 | 伊人小视频 | 国产理论一区二区三区 | 亚洲人xxx| 免费欧美高清视频 | 免费a v网站| av三区在线 | 成人在线视频网 | 免费高清在线观看成人 | 久久国色夜色精品国产 | av片免费播放 | 成人av一区二区在线观看 | 国产精品麻豆欧美日韩ww | 1000部国产精品成人观看 | 国产精品久久久久久久久久免费看 | 美女视频黄在线观看 | 免费av影视| 99热最新精品| 国产精品福利无圣光在线一区 | 国产精品 视频 | 最近中文字幕 | 国产欧美精品在线观看 | 久久女教师 | 精品久久久久一区二区国产 | 国产精品成人自产拍在线观看 | 欧美在线观看视频一区二区 | 亚洲视频专区在线 | 日韩中文免费视频 | 超碰精品在线 | 黄色的网站免费看 | 97天堂网| 免费av网址在线观看 | 中文字幕日韩精品有码视频 | 久久人人爽人人爽人人片av软件 | 久久久黄色 | 中文字幕 国产精品 | 日韩伦理片一区二区三区 | 性色视频在线 | 欧美极度另类 | 五月婷久 | 国产亚洲精品美女久久 | 婷婷狠狠操 | 久久九九影视网 | 18国产精品白浆在线观看免费 | 免费av网址大全 | 国产精品都在这里 | 久久最新视频 | 91桃色免费观看 | 国产最新精品视频 | 天天干,天天操 | 好看的国产精品视频 | 久久久久北条麻妃免费看 | 久久免费播放视频 | 人人舔人人干 | 国产欧美在线一区 | 一区 二区电影免费在线观看 | 成年人在线电影 | 天天曰 | 国产午夜精品一区二区三区四区 | 91喷水 | 午夜在线国产 | 一二区精品 | 麻花豆传媒一二三产区 | 国产免费黄视频在线观看 | 亚洲一区不卡视频 | 色偷偷88888欧美精品久久久 | 日韩久久在线 | 在线成人免费av | 99性视频 | 国产精品永久久久久久久久久 | 九色最新网址 | 成人一区不卡 | 日韩首页 | 国产精品一区二区三区在线免费观看 | 国产精品亚州 | 日韩精品一区二区久久 | 在线 视频 一区二区 | 最新中文字幕在线观看视频 | 精品在线观看一区二区三区 | 六月激情丁香 | 日韩免费一区二区 | 日韩欧美视频一区 | 国产一区二区日本 | 色综合久久久久久中文网 | 91福利区一区二区三区 | 国产伦精品一区二区三区无广告 | 国产精品毛片一区二区在线看 | 欧美极度另类性三渗透 | ww亚洲ww亚在线观看 | 久久一二三四 | 日韩久久久久久久久久 | 亚洲少妇久久 | 午夜久久影视 | 日韩伦理片hd| 亚洲成人av电影 | 干干干操操操 | 视频99爱 | 91禁在线观看 | 中文字幕韩在线第一页 | 国产精品久久久久影院日本 | 国产专区精品 | 色婷婷精品大在线视频 | 毛片区| 91成人免费视频 | 六月激情 | 色视频网站在线观看一=区 a视频免费在线观看 | www.com久久久| 久久久久久国产精品美女 | 日韩欧美视频在线观看免费 | 色婷婷激情五月 | 一本一本久久a久久精品综合妖精 | 欧美国产日韩久久 | 国产麻豆精品一区 | 国产精品免费观看网站 | 国产小视频你懂的在线 | 狠狠久久婷婷 | 99热这里精品 | 亚洲激情校园春色 | 丁香综合网 | 中文字幕在线免费看线人 | 麻豆视频免费在线观看 | 337p日本大胆噜噜噜噜 | 在线播放日韩 | 在线免费av播放 | 久久久久电影网站 | 国产精品福利小视频 | 一区二区三区在线观看中文字幕 | 久久久久国产一区二区 | 日本精品视频在线 | 狠狠干夜夜操天天爽 | 国产精品久久久久av福利动漫 | 欧美日韩首页 | 欧美精品一区二区三区一线天视频 | 狠狠色综合欧美激情 | 中文字幕免费国产精品 | 天天综合天天做天天综合 | 激情五月婷婷综合 | 制服丝袜在线91 | 美女福利视频一区二区 | 国产高清在线观看av | 久久麻豆精品 | 久久国产精品久久w女人spa | 亚洲丝袜一区二区 | 日本亚洲国产 | www视频免费在线观看 | 国产精品高清在线观看 | 国产精品门事件 | 久久久www| 在线日韩| 亚洲高清色综合 | 丁香花中文字幕 | 日韩欧美网站 | 91福利国产在线观看 | 欧美一级电影免费观看 | 在线看中文字幕 | 又黄又刺激的视频 | 一区二区三区三区在线 | 天天色天天干天天色 | 黄色国产高清 | 九九久 | 亚洲精品国产精品国自产 | 国产亚洲综合精品 | 色综合久久中文字幕综合网 | 欧美午夜久久 | 亚洲黄a| 色就色,综合激情 | 中文字幕在线视频免费播放 | 成年人在线看片 | 天天色天天上天天操 | 一区二区三区免费在线观看视频 | 午夜av在线免费 | 日韩丝袜在线观看 | 久久成人午夜视频 | 日韩高清久久 | 又黄又爽的免费高潮视频 | 久久人人爽人人爽人人 | 深爱开心激情网 | 日本中文字幕电影在线免费观看 | av大全免费在线观看 | 五月婷婷中文 | 久久综合婷婷国产二区高清 | 亚洲精品高清视频在线观看 | 日韩精品一区二区三区在线视频 | 91久久精品日日躁夜夜躁国产 | 久久综合九色综合97_ 久久久 | 美女视频黄免费的 | 成人在线观看影院 | 亚洲二区精品 | 日韩电影在线看 | 日韩精品字幕 | 久草9视频 | japanesexxxxfreehd乱熟 | 欧美日韩三区二区 | 狠狠的日 | 久久久精品久久日韩一区综合 | 国产精品久久久久久影院 | 黄色一二级片 | 色天天| 99在线精品免费视频九九视 | a电影在线观看 | 成人免费在线电影 | 国产精品毛片久久久 | 在线看成人av | 99爱视频| 精品96久久久久久中文字幕无 | 日本最新一区二区三区 | 日日日日| 亚洲理论片 | 亚洲综合视频在线播放 |