Lines Matching refs:pDevExt

279     PDEVEXT               pDevExt;
293 PDEVEXT pDevExt;
302 PDEVEXT pDevExt;
368 static VOID CreateResList(PDEVEXT pDevExt, PCM_RESOURCE_LIST *pResList, PULONG pResListSize);
438 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
439 if (pDevExt->MouseEnableCount)
441 pDevExt->MouExt.CurrentInput.UnitId = pDevExt->MouExt.UnitId;
442 if (!MouDataToQueue(&pDevExt->MouExt, &pDevExt->MouExt.CurrentInput))
445 else if (pDevExt->DpcInterlockMouse >= 0)
446 pDevExt->DpcInterlockMouse++;
448 KeInsertQueueDpc(&pDevExt->MouseIsrDpc, pDevObj->CurrentIrp, NULL);
471 static NTSTATUS GetBytePoll(int DevType, PDEVEXT pDevExt, PUCHAR Byte)
478 while ( (i < (ULONG)pDevExt->Cfg.PollingIterations)
479 && ((UCHAR)((byte = I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd])) & fMask) != fMask))
482 *Byte = I8X_GET_DATA_BYTE(pDevExt->DevRegs[i8042Dat]);
485 KeStallExecutionProcessor(pDevExt->Cfg.StallMicroseconds);
489 if (i >= (ULONG)pDevExt->Cfg.PollingIterations)
492 *Byte = I8X_GET_DATA_BYTE(pDevExt->DevRegs[i8042Dat]);
499 static NTSTATUS PutBytePoll(CCHAR PortType, BOOLEAN fWaitForAck, int AckDevType, PDEVEXT pDevExt, UCHAR Byte)
506 PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_WRITE_TO_AUXILIARY_DEVICE);
509 PUCHAR dataAddress = pDevExt->DevRegs[i8042Dat];
510 PUCHAR commandAddress = pDevExt->DevRegs[i8042Cmd];
511 for (unsigned j = 0; j < (unsigned)pDevExt->Cfg.iResend; j++)
514 while ( i++ < (ULONG)pDevExt->Cfg.PollingIterations
516 KeStallExecutionProcessor(pDevExt->Cfg.StallMicroseconds);
517 if (i >= (ULONG)pDevExt->Cfg.PollingIterations)
532 while ((status = GetBytePoll(AckDevType, pDevExt, &byte)) == STATUS_SUCCESS)
539 PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_WRITE_TO_AUXILIARY_DEVICE);
555 static VOID GetByteAsync(int DevType, PDEVEXT pDevExt, PUCHAR pByte)
565 while ( i < (ULONG)pDevExt->Cfg.PollingIterations
566 && ((UCHAR)((byte = I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd])) & fMask) != fMask))
569 *pByte = I8X_GET_DATA_BYTE(pDevExt->DevRegs[i8042Dat]);
573 if (i >= (ULONG)pDevExt->Cfg.PollingIterations)
576 *pByte = I8X_GET_DATA_BYTE(pDevExt->DevRegs[i8042Dat]);
583 static VOID PutByteAsync(CCHAR PortType, PDEVEXT pDevExt, UCHAR Byte)
586 while (I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd]) & INPUT_BUFFER_FULL)
587 if (i++ >= (ULONG)pDevExt->Cfg.PollingIterations)
591 I8X_PUT_COMMAND_BYTE(pDevExt->DevRegs[i8042Cmd], Byte);
593 I8X_PUT_DATA_BYTE(pDevExt->DevRegs[i8042Dat], Byte);
602 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
604 pDevExt->TimerCount = 3;
606 KBDSETPACKET keyboardPacket = pDevExt->KbdExt.CurrentOutput;
608 if (pDevExt->KbdExt.CurrentOutput.State == SendFirstByte)
609 PutByteAsync(i8042Dat, pDevExt, keyboardPacket.FirstByte);
610 else if (pDevExt->KbdExt.CurrentOutput.State == SendLastByte)
611 PutByteAsync(i8042Dat, pDevExt, keyboardPacket.LastByte);
619 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
620 pDevExt->KbdExt.CurrentOutput.State = SendFirstByte;
621 pDevExt->KbdExt.CurrentOutput.FirstByte = ((PKBDINITIATECTX)pCtx)->FirstByte;
622 pDevExt->KbdExt.CurrentOutput.LastByte = ((PKBDINITIATECTX)pCtx)->LastByte;
623 pDevExt->KbdExt.ResendCount = 0;
632 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
641 pDevExt->KbdExt.CurrentOutput.State = Idle;
642 pDevExt->KbdExt.ResendCount = 0;
675 PDEVEXT pDevExt = (PDEVEXT)((PGETDATAPTRCTX)pCtx)->pDevExt;
680 ((PGETDATAPTRCTX)pCtx)->DataIn = pDevExt->KbdExt.DataIn;
681 ((PGETDATAPTRCTX)pCtx)->DataOut = pDevExt->KbdExt.DataOut;
682 ((PGETDATAPTRCTX)pCtx)->cInput = pDevExt->KbdExt.cInput;
686 ((PGETDATAPTRCTX)pCtx)->DataIn = pDevExt->MouExt.DataIn;
687 ((PGETDATAPTRCTX)pCtx)->DataOut = pDevExt->MouExt.DataOut;
688 ((PGETDATAPTRCTX)pCtx)->cInput = pDevExt->MouExt.cInput;
697 PDEVEXT pDevExt = (PDEVEXT)((PI8042INITDATACTX)pCtx)->pDevExt;
702 pDevExt->KbdExt.cInput = 0;
703 pDevExt->KbdExt.DataIn = pDevExt->KbdExt.InputData;
704 pDevExt->KbdExt.DataOut = pDevExt->KbdExt.InputData;
708 pDevExt->MouExt.cInput = 0;
709 pDevExt->MouExt.DataIn = pDevExt->MouExt.InputData;
710 pDevExt->MouExt.DataOut = pDevExt->MouExt.InputData;
719 PDEVEXT pDevExt = (PDEVEXT)((PSETDATAPTRCTX)pCtx)->pDevExt;
724 pDevExt->KbdExt.DataOut = (PKEYBOARD_INPUT_DATA)((PSETDATAPTRCTX)pCtx)->DataOut;
725 pDevExt->KbdExt.cInput -= ((PSETDATAPTRCTX)pCtx)->cInput;
729 pDevExt->MouExt.DataOut = (PMOUSE_INPUT_DATA)((PSETDATAPTRCTX)pCtx)->DataOut;
730 pDevExt->MouExt.cInput -= ((PSETDATAPTRCTX)pCtx)->cInput;
745 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
747 KeCancelTimer(&pDevExt->CommandTimer);
756 pDevExt->Cfg.KbdInd = *(PKEYBOARD_INDICATOR_PARAMETERS)Irp->AssociatedIrp.SystemBuffer;
760 pDevExt->Cfg.KeyRepeatCurrent = *(PKEYBOARD_TYPEMATIC_PARAMETERS)Irp->AssociatedIrp.SystemBuffer;
791 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
799 if ((pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT) != KEYBOARD_HARDWARE_PRESENT)
804 else if (pDevExt->KbdExt.ConnectData.ClassService)
814 pDevExt->KbdExt.ConnectData = *((PCONNECT_DATA) (irpSp->Parameters.DeviceIoControl.Type3InputBuffer));
815 initDataCtx.pDevExt = pDevExt;
817 KeSynchronizeExecution(pDevExt->KbdIntObj, InitDataQueue, &initDataCtx);
822 if ((pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT) != MOUSE_HARDWARE_PRESENT)
827 else if (pDevExt->MouExt.ConnectData.ClassService)
837 pDevExt->MouExt.ConnectData = *((PCONNECT_DATA) (irpSp->Parameters.DeviceIoControl.Type3InputBuffer));
838 initDataCtx.pDevExt = pDevExt;
840 KeSynchronizeExecution(pDevExt->MouIntObj, InitDataQueue, &initDataCtx);
861 *(PKEYBOARD_ATTRIBUTES) Irp->AssociatedIrp.SystemBuffer = pDevExt->Cfg.KbdAttr;
869 + (sizeof(INDICATOR_LIST) * (pDevExt->Cfg.KbdAttr.NumberOfIndicators - 1));
876 Irp->AssociatedIrp.SystemBuffer)->NumberOfIndicatorKeys = pDevExt->Cfg.KbdAttr.NumberOfIndicators;
890 *(PKEYBOARD_INDICATOR_PARAMETERS)Irp->AssociatedIrp.SystemBuffer = pDevExt->Cfg.KbdInd;
910 *(PKEYBOARD_TYPEMATIC_PARAMETERS)Irp->AssociatedIrp.SystemBuffer = pDevExt->Cfg.KeyRepeatCurrent;
918 KbdAttr = &pDevExt->Cfg.KbdAttr;
934 *(PMOUSE_ATTRIBUTES) Irp->AssociatedIrp.SystemBuffer = pDevExt->Cfg.MouAttr;
978 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
1017 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
1023 interlockedResult = ASMAtomicIncU32(&pDevExt->KeyboardEnableCount);
1030 if (pDevExt->KeyboardEnableCount == 0)
1034 ASMAtomicDecU32(&pDevExt->KeyboardEnableCount);
1042 ASMAtomicIncU32(&pDevExt->MouseEnableCount);
1049 if (pDevExt->MouseEnableCount == 0)
1053 ASMAtomicDecU32(&pDevExt->MouseEnableCount);
1065 KeSynchronizeExecution(pDevExt->KbdIntObj, KbdStartWrapper, &keyboardInitiateContext);
1068 KeSetTimer(&pDevExt->CommandTimer, deltaTime, &pDevExt->TimeOutDpc);
1078 KeSynchronizeExecution(pDevExt->KbdIntObj, KbdStartWrapper, &keyboardInitiateContext);
1081 KeSetTimer(&pDevExt->CommandTimer, deltaTime, &pDevExt->TimeOutDpc);
1095 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
1110 timerContext.TimerCounter = &pDevExt->TimerCount;
1111 KeSynchronizeExecution(pDevExt->KbdIntObj, DecTimer, &timerContext);
1126 KeSetTimer(&pDevExt->CommandTimer, deltaTime, &pDevExt->TimeOutDpc);
1139 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
1143 opCtx.VariableAddress = &pDevExt->DpcInterlockKeyboard;
1146 KeSynchronizeExecution(pDevExt->KbdIntObj, DpcVarOp, (PVOID)&opCtx);
1155 getPtrCtx.pDevExt = pDevExt;
1158 setPtrCtx.pDevExt = pDevExt;
1161 KeSynchronizeExecution(pDevExt->KbdIntObj, GetDataQueuePtr, &getPtrCtx);
1165 PVOID classDeviceObject = pDevExt->KbdExt.ConnectData.ClassDeviceObject;
1166 PSERVICECALLBACK classService = pDevExt->KbdExt.ConnectData.ClassService;
1171 classService(classDeviceObject, getPtrCtx.DataOut, pDevExt->KbdExt.DataEnd, &inputDataConsumed);
1172 cbNotConsumed = (((PUCHAR) pDevExt->KbdExt.DataEnd - (PUCHAR) getPtrCtx.DataOut)
1184 setPtrCtx.DataOut = pDevExt->KbdExt.InputData;
1201 KeSynchronizeExecution(pDevExt->KbdIntObj, SetDataQueuePtr, &setPtrCtx);
1209 KeSynchronizeExecution(pDevExt->KbdIntObj, DpcVarOp, &opCtx);
1214 KeSetTimer(&pDevExt->KbdExt.DataConsumptionTimer, deltaTime, &pDevExt->KeyboardIsrDpcRetry);
1221 KeSynchronizeExecution(pDevExt->KbdIntObj, DpcVarOp, &opCtx);
1227 KeSynchronizeExecution(pDevExt->KbdIntObj, DpcVarOp, &opCtx);
1244 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
1248 opCtx.VariableAddress = &pDevExt->DpcInterlockMouse;
1251 KeSynchronizeExecution(pDevExt->MouIntObj, DpcVarOp, &opCtx);
1259 getPtrCtx.pDevExt = pDevExt;
1262 setPtrCtx.pDevExt = pDevExt;
1265 KeSynchronizeExecution(pDevExt->MouIntObj, GetDataQueuePtr, &getPtrCtx);
1268 PVOID classDeviceObject = pDevExt->MouExt.ConnectData.ClassDeviceObject;
1269 PSERVICECALLBACK classService = pDevExt->MouExt.ConnectData.ClassService;
1274 classService(classDeviceObject, getPtrCtx.DataOut, pDevExt->MouExt.DataEnd, &inputDataConsumed);
1275 cbNotConsumed = (((PUCHAR)pDevExt->MouExt.DataEnd - (PUCHAR) getPtrCtx.DataOut)
1285 setPtrCtx.DataOut = pDevExt->MouExt.InputData;
1300 KeSynchronizeExecution(pDevExt->MouIntObj, SetDataQueuePtr, &setPtrCtx);
1308 KeSynchronizeExecution(pDevExt->MouIntObj, DpcVarOp, &opCtx);
1313 KeSetTimer(&pDevExt->MouExt.DataConsumptionTimer, deltaTime, &pDevExt->MouseIsrDpcRetry);
1320 KeSynchronizeExecution(pDevExt->MouIntObj, DpcVarOp, &opCtx);
1327 KeSynchronizeExecution(pDevExt->MouIntObj, DpcVarOp, &opCtx);
1345 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
1347 if ((I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd]) & (OUTPUT_BUFFER_FULL|MOUSE_OUTPUT_BUFFER_FULL))
1351 if ((I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd]) & (OUTPUT_BUFFER_FULL|MOUSE_OUTPUT_BUFFER_FULL))
1357 GetByteAsync(MouDevType, pDevExt, &byte);
1359 if ( pDevExt->MouExt.LastByteReceived == 0xaa
1362 pDevExt->HardwarePresent &= ~WHEELMOUSE_HARDWARE_PRESENT;
1363 pDevExt->Cfg.MouAttr.NumberOfButtons = 2;
1365 PutByteAsync(i8042Cmd, pDevExt, I8042_WRITE_TO_AUXILIARY_DEVICE);
1366 PutByteAsync(i8042Dat, pDevExt, ENABLE_MOUSE_TRANSMISSION);
1368 pDevExt->MouExt.InputState = MouseExpectingACK;
1371 pDevExt->MouExt.LastByteReceived = byte;
1375 tickDelta.QuadPart = newTick.QuadPart - pDevExt->MouExt.PreviousTick.QuadPart;
1376 if ( pDevExt->MouExt.InputState != MouseIdle
1377 && pDevExt->MouExt.InputState != MouseExpectingACK
1378 && (tickDelta.LowPart >= pDevExt->MouExt.SynchTickCount || tickDelta.HighPart != 0))
1379 pDevExt->MouExt.InputState = MouseIdle;
1380 pDevExt->MouExt.PreviousTick = newTick;
1382 switch (pDevExt->MouExt.InputState)
1386 UCHAR fPrevBtns = pDevExt->MouExt.PreviousButtons;
1387 pDevExt->MouExt.CurrentInput.ButtonFlags = 0;
1388 pDevExt->MouExt.CurrentInput.ButtonData = 0;
1391 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
1393 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
1395 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
1397 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
1399 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
1401 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;
1403 pDevExt->MouExt.PreviousButtons = byte & (RIGHT_BUTTON_DOWN|MIDDLE_BUTTON_DOWN|LEFT_BUTTON_DOWN);
1404 pDevExt->MouExt.uCurrSignAndOverflow = (UCHAR) (byte & MOUSE_SIGN_OVERFLOW_MASK);
1405 pDevExt->MouExt.InputState = XMovement;
1411 if (pDevExt->MouExt.uCurrSignAndOverflow & X_OVERFLOW)
1413 uPrevSignAndOverflow = pDevExt->MouExt.uPrevSignAndOverflow;
1416 if ((uPrevSignAndOverflow & X_DATA_SIGN) != (pDevExt->MouExt.uCurrSignAndOverflow & X_DATA_SIGN))
1417 pDevExt->MouExt.uCurrSignAndOverflow ^= X_DATA_SIGN;
1419 if (pDevExt->MouExt.uCurrSignAndOverflow & X_DATA_SIGN)
1420 pDevExt->MouExt.CurrentInput.LastX = MOUSE_MAXIMUM_NEGATIVE_DELTA;
1422 pDevExt->MouExt.CurrentInput.LastX = MOUSE_MAXIMUM_POSITIVE_DELTA;
1426 pDevExt->MouExt.CurrentInput.LastX = (ULONG) byte;
1427 if (pDevExt->MouExt.uCurrSignAndOverflow & X_DATA_SIGN)
1428 pDevExt->MouExt.CurrentInput.LastX |= MOUSE_MAXIMUM_NEGATIVE_DELTA;
1430 pDevExt->MouExt.InputState = YMovement;
1436 if (pDevExt->MouExt.uCurrSignAndOverflow & Y_OVERFLOW)
1438 uPrevSignAndOverflow = pDevExt->MouExt.uPrevSignAndOverflow;
1441 if ((uPrevSignAndOverflow & Y_DATA_SIGN) != (pDevExt->MouExt.uCurrSignAndOverflow & Y_DATA_SIGN))
1442 pDevExt->MouExt.uCurrSignAndOverflow ^= Y_DATA_SIGN;
1444 if (pDevExt->MouExt.uCurrSignAndOverflow & Y_DATA_SIGN)
1445 pDevExt->MouExt.CurrentInput.LastY = MOUSE_MAXIMUM_POSITIVE_DELTA;
1447 pDevExt->MouExt.CurrentInput.LastY = MOUSE_MAXIMUM_NEGATIVE_DELTA;
1451 pDevExt->MouExt.CurrentInput.LastY = (ULONG) byte;
1452 if (pDevExt->MouExt.uCurrSignAndOverflow & Y_DATA_SIGN)
1453 pDevExt->MouExt.CurrentInput.LastY |= MOUSE_MAXIMUM_NEGATIVE_DELTA;
1454 pDevExt->MouExt.CurrentInput.LastY = -pDevExt->MouExt.CurrentInput.LastY;
1456 pDevExt->MouExt.uPrevSignAndOverflow = pDevExt->MouExt.uCurrSignAndOverflow;
1458 if (pDevExt->HardwarePresent & WHEELMOUSE_HARDWARE_PRESENT)
1459 pDevExt->MouExt.InputState = ZMovement;
1462 pDevExt->MouExt.CurrentInput.Flags = MOUSE_MOVE_RELATIVE;
1465 VMMDevReqMouseStatus *pReq = pDevExt->pReq;
1474 pDevExt->MouExt.CurrentInput.Flags = MOUSE_MOVE_ABSOLUTE;
1475 pDevExt->MouExt.CurrentInput.LastX = pReq->pointerXPos;
1476 pDevExt->MouExt.CurrentInput.LastY = pReq->pointerYPos;
1484 pDevExt->MouExt.InputState = MouseIdle;
1492 if (byte && pDevExt->MouExt.CurrentInput.Buttons == 0)
1498 pDevExt->MouExt.CurrentInput.ButtonData = 0x0078;
1500 pDevExt->MouExt.CurrentInput.ButtonData = 0xFF88;
1501 pDevExt->MouExt.CurrentInput.ButtonFlags |= MOUSE_WHEEL;
1504 pDevExt->MouExt.CurrentInput.Flags = MOUSE_MOVE_RELATIVE;
1507 VMMDevReqMouseStatus *pReq = pDevExt->pReq;
1516 pDevExt->MouExt.CurrentInput.Flags = MOUSE_MOVE_ABSOLUTE;
1517 pDevExt->MouExt.CurrentInput.LastX = pReq->pointerXPos;
1518 pDevExt->MouExt.CurrentInput.LastY = pReq->pointerYPos;
1527 pDevExt->MouExt.InputState = MouseIdle;
1534 pDevExt->MouExt.InputState = MouseIdle;
1537 PutByteAsync(i8042Cmd, pDevExt, I8042_WRITE_TO_AUXILIARY_DEVICE);
1538 PutByteAsync(i8042Dat, pDevExt, ENABLE_MOUSE_TRANSMISSION);
1561 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
1563 if ((I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd]) & (OUTPUT_BUFFER_FULL|MOUSE_OUTPUT_BUFFER_FULL))
1566 for (unsigned i = 0; i < (ULONG)pDevExt->Cfg.PollStatusIterations; i++)
1569 if ((I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd]) & (OUTPUT_BUFFER_FULL|MOUSE_OUTPUT_BUFFER_FULL))
1574 if ((I8X_GET_STATUS_BYTE(pDevExt->DevRegs[i8042Cmd]) & (OUTPUT_BUFFER_FULL|MOUSE_OUTPUT_BUFFER_FULL))
1577 if (pDevExt->KeyboardEnableCount == 0)
1578 UCHAR scanCode = I8X_GET_DATA_BYTE(pDevExt->DevRegs[i8042Dat]);
1584 GetByteAsync(KbdDevType, pDevExt, &scanCode);
1588 if (pDevExt->TimerCount == 0)
1590 pDevExt->TimerCount = -1;
1592 if ( pDevExt->KbdExt.CurrentOutput.State==Idle
1595 else if (pDevExt->KbdExt.ResendCount < pDevExt->Cfg.iResend)
1597 pDevExt->KbdExt.ResendCount++;
1602 pDevExt->KbdExt.CurrentOutput.State = Idle;
1603 KeInsertQueueDpc(&pDevExt->RetriesExceededDpc, pDevObj->CurrentIrp, NULL);
1608 if (pDevExt->TimerCount == 0)
1611 pDevExt->TimerCount = -1;
1613 pDevExt->KbdExt.ResendCount = 0;
1614 if (pDevExt->KbdExt.CurrentOutput.State == SendFirstByte)
1616 pDevExt->KbdExt.CurrentOutput.State = SendLastByte;
1619 else if (pDevExt->KbdExt.CurrentOutput.State == SendLastByte)
1621 pDevExt->KbdExt.CurrentOutput.State = Idle;
1629 PKEYBOARD_INPUT_DATA input = &pDevExt->KbdExt.CurrentInput;
1630 KBDSCANSTATE *pScanState = &pDevExt->KbdExt.CurrentScanState;
1676 if (pDevExt->KeyboardEnableCount)
1678 pDevExt->KbdExt.CurrentInput.UnitId = pDevExt->KbdExt.UnitId;
1679 if (!KbdDataToQueue(&pDevExt->KbdExt, input))
1682 else if (pDevExt->DpcInterlockKeyboard >= 0)
1683 pDevExt->DpcInterlockKeyboard++;
1685 KeInsertQueueDpc(&pDevExt->KeyboardIsrDpc, pDevObj->CurrentIrp, NULL);
1699 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
1700 status = PutBytePoll(i8042Dat, FALSE /*=wait*/, MouDevType, pDevExt, ENABLE_MOUSE_TRANSMISSION);
1710 PDEVEXT pDevExt = &pInit->DevExt;
1721 if (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
1751 PDEVEXT pDevExt = &pInit->DevExt;
1906 PDEVEXT pDevExt = (PDEVEXT)pPortDevObj->DeviceExtension;
1907 *pDevExt = pInit->DevExt;
1908 pDevExt->pDevObj = pPortDevObj;
1912 CreateResList(pDevExt, &resources, &resourceListSize);
1937 for (unsigned i = 0; i < pDevExt->Cfg.cPorts; i++)
1939 addressSpace = (pDevExt->Cfg.aPorts[i].Flags & CM_RESOURCE_PORT_IO) == CM_RESOURCE_PORT_IO ? 1 : 0;
1940 if (!HalTranslateBusAddress(pDevExt->Cfg.InterfaceType,
1941 pDevExt->Cfg.uBusNr,
1942 pDevExt->Cfg.aPorts[i].u.Port.Start,
1951 pDevExt->fUnmapRegs = TRUE;
1952 pDevExt->DevRegs[i] = (PUCHAR)MmMapIoSpace(Phys, pDevExt->Cfg.aPorts[i].u.Port.Length,
1957 pDevExt->fUnmapRegs = FALSE;
1958 pDevExt->DevRegs[i] = (PUCHAR)Phys.LowPart;
1961 if (!pDevExt->DevRegs[i])
1972 KeInitializeSpinLock(&pDevExt->ShIntObj);
1974 if (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
1976 pDevExt->KbdExt.InputData = (PKEYBOARD_INPUT_DATA)
1977 ExAllocatePool(NonPagedPool, pDevExt->Cfg.KbdAttr.InputDataQueueLength);
1979 if (!pDevExt->KbdExt.InputData)
1985 pDevExt->KbdExt.DataEnd =
1986 (PKEYBOARD_INPUT_DATA)((PCHAR) (pDevExt->KbdExt.InputData) + pDevExt->Cfg.KbdAttr.InputDataQueueLength);
1988 RtlZeroMemory(pDevExt->KbdExt.InputData, pDevExt->Cfg.KbdAttr.InputDataQueueLength);
1991 if (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT)
2029 pDevExt->MouExt.InputData =
2030 (PMOUSE_INPUT_DATA)ExAllocatePool(NonPagedPool, pDevExt->Cfg.MouAttr.InputDataQueueLength);
2031 if (!pDevExt->MouExt.InputData)
2037 pDevExt->MouExt.DataEnd = (PMOUSE_INPUT_DATA)((PCHAR) (pDevExt->MouExt.InputData) + pDevExt->Cfg.MouAttr.InputDataQueueLength);
2039 RtlZeroMemory(pDevExt->MouExt.InputData, pDevExt->Cfg.MouAttr.InputDataQueueLength);
2042 pDevExt->KbdExt.ConnectData.ClassDeviceObject = NULL;
2043 pDevExt->KbdExt.ConnectData.ClassService = NULL;
2044 pDevExt->MouExt.ConnectData.ClassDeviceObject = NULL;
2045 pDevExt->MouExt.ConnectData.ClassService = NULL;
2048 initDataCtx.pDevExt = pDevExt;
2054 pDevExt->DpcInterlockKeyboard = -1;
2055 pDevExt->DpcInterlockMouse = -1;
2058 KeInitializeDpc(&pDevExt->RetriesExceededDpc, (PKDEFERRED_ROUTINE)CtrlRetriesExceededDpc, pPortDevObj);
2059 KeInitializeDpc(&pDevExt->KeyboardIsrDpc, (PKDEFERRED_ROUTINE)CtrlKbdIsrDpc, pPortDevObj);
2060 KeInitializeDpc(&pDevExt->KeyboardIsrDpcRetry, (PKDEFERRED_ROUTINE)CtrlKbdIsrDpc, pPortDevObj);
2061 KeInitializeDpc(&pDevExt->MouseIsrDpc, (PKDEFERRED_ROUTINE)CtrlMouIsrDpc, pPortDevObj);
2062 KeInitializeDpc(&pDevExt->MouseIsrDpcRetry, (PKDEFERRED_ROUTINE)CtrlMouIsrDpc, pPortDevObj);
2063 KeInitializeDpc(&pDevExt->TimeOutDpc, (PKDEFERRED_ROUTINE)CtrlTimeoutDpc, pPortDevObj);
2065 KeInitializeTimer(&pDevExt->CommandTimer);
2066 pDevExt->TimerCount = -1;
2068 KeInitializeTimer(&pDevExt->KbdExt.DataConsumptionTimer);
2069 KeInitializeTimer(&pDevExt->MouExt.DataConsumptionTimer);
2071 IntVecKbd = HalGetInterruptVector(pDevExt->Cfg.InterfaceType,
2072 pDevExt->Cfg.uBusNr,
2073 pDevExt->Cfg.KbdInt.u.Interrupt.Level,
2074 pDevExt->Cfg.KbdInt.u.Interrupt.Vector,
2077 IntVecMou = HalGetInterruptVector(pDevExt->Cfg.InterfaceType,
2078 pDevExt->Cfg.uBusNr,
2079 pDevExt->Cfg.MouInt.u.Interrupt.Level,
2080 pDevExt->Cfg.MouInt.u.Interrupt.Vector,
2083 if ( (pDevExt->HardwarePresent & (KEYBOARD_HARDWARE_PRESENT | MOUSE_HARDWARE_PRESENT))
2087 if (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT)
2089 status = IoConnectInterrupt(&pDevExt->MouIntObj, MouIntHandler, pPortDevObj,
2090 &pDevExt->ShIntObj, IntVecMou, IrqlMou,
2092 pDevExt->Cfg.MouInt.Flags == CM_RESOURCE_INTERRUPT_LATCHED
2094 pDevExt->Cfg.MouInt.ShareDisposition,
2095 AffMou, pDevExt->Cfg.fFloatSave);
2104 if (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
2106 status = IoConnectInterrupt(&pDevExt->KbdIntObj, KbdIntHandler, pPortDevObj,
2107 &pDevExt->ShIntObj, IntVecKbd, IrqlKbd,
2109 pDevExt->Cfg.KbdInt.Flags == CM_RESOURCE_INTERRUPT_LATCHED
2111 pDevExt->Cfg.KbdInt.ShareDisposition,
2112 AffKbd, pDevExt->Cfg.fFloatSave);
2117 if (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
2127 if (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT)
2163 pDevExt->pReq = pReq;
2190 if (pDevExt)
2192 if (pDevExt->KbdIntObj)
2193 IoDisconnectInterrupt(pDevExt->KbdIntObj);
2194 if (pDevExt->MouIntObj)
2195 IoDisconnectInterrupt(pDevExt->MouIntObj);
2196 if (pDevExt->KbdExt.InputData)
2197 ExFreePool(pDevExt->KbdExt.InputData);
2198 if (pDevExt->MouExt.InputData)
2199 ExFreePool(pDevExt->MouExt.InputData);
2200 if (pDevExt->fUnmapRegs)
2202 for (unsigned i = 0; i < pDevExt->Cfg.cPorts; i++)
2203 if (pDevExt->DevRegs[i])
2204 MmUnmapIoSpace(pDevExt->DevRegs[i], pDevExt->Cfg.aPorts[i].u.Port.Length);
2243 static VOID CreateResList(PDEVEXT pDevExt, PCM_RESOURCE_LIST *pResList, PULONG pResListSize)
2245 ULONG cPorts = pDevExt->Cfg.cPorts;
2246 if (pDevExt->Cfg.KbdInt.Type == CmResourceTypeInterrupt)
2248 if (pDevExt->Cfg.MouInt.Type == CmResourceTypeInterrupt)
2262 (*pResList)->List[0].InterfaceType = pDevExt->Cfg.InterfaceType;
2263 (*pResList)->List[0].BusNumber = pDevExt->Cfg.uBusNr;
2267 if (pDevExt->Cfg.KbdInt.Type == CmResourceTypeInterrupt)
2268 (*pResList)->List[0].PartialResourceList.PartialDescriptors[i++] = pDevExt->Cfg.KbdInt;
2269 if (pDevExt->Cfg.MouInt.Type == CmResourceTypeInterrupt)
2270 (*pResList)->List[0].PartialResourceList.PartialDescriptors[i++] = pDevExt->Cfg.MouInt;
2271 for (unsigned j = 0; j < pDevExt->Cfg.cPorts; j++)
2272 (*pResList)->List[0].PartialResourceList.PartialDescriptors[i++] = pDevExt->Cfg.aPorts[j];
2278 static NTSTATUS GetCtrlCmd(ULONG HwDisEnMask, PDEVEXT pDevExt, PUCHAR pByte)
2283 status = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_DISABLE_KEYBOARD_DEVICE);
2290 status = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_DISABLE_MOUSE_DEVICE);
2294 PutBytePoll(i8042Cmd, FALSE/*=wait*/, NoDevice, pDevExt, I8042_ENABLE_KEYBOARD_DEVICE);
2299 status = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_READ_CONTROLLER_COMMAND_BYTE);
2304 status = GetBytePoll(CtrlDevType, pDevExt, pByte);
2317 status2 = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_ENABLE_KEYBOARD_DEVICE);
2329 status2 = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_ENABLE_MOUSE_DEVICE);
2344 static NTSTATUS PutCtrlCmd(PDEVEXT pDevExt, UCHAR Byte)
2347 status = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_WRITE_CONTROLLER_COMMAND_BYTE);
2351 return (PutBytePoll(i8042Dat, FALSE /*=wait*/, NoDevice, pDevExt, Byte));
2357 static VOID TransCtrlCmd(PDEVEXT pDevExt, PI8042TRANSMITCCBCTX pCtx)
2360 pCtx->Status = GetCtrlCmd(pCtx->HwDisEnMask, pDevExt, &bCtrlCmd);
2369 pCtx->Status = PutCtrlCmd(pDevExt, bCtrlCmd);
2372 pCtx->Status = GetCtrlCmd(pCtx->HwDisEnMask, pDevExt, &bVrfyCmd);
2384 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
2386 NTSTATUS status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, SET_MOUSE_RESOLUTION);
2390 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, 0x00);
2396 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, SET_MOUSE_SCALING_1TO1);
2401 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, READ_MOUSE_STATUS);
2405 status = GetBytePoll(CtrlDevType, pDevExt, &byte);
2409 status = GetBytePoll(CtrlDevType, pDevExt, &buttons);
2412 status = GetBytePoll(CtrlDevType, pDevExt, &byte);
2429 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
2431 NTSTATUS status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, MOUSE_RESET);
2438 status = GetBytePoll(CtrlDevType, pDevExt, &byte);
2449 status = GetBytePoll(CtrlDevType, pDevExt, &byte);
2460 pDevExt->Cfg.MouAttr.NumberOfButtons = numButtons;
2462 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, SET_MOUSE_SAMPLING_RATE);
2466 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, 60);
2470 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, SET_MOUSE_RESOLUTION);
2474 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, (UCHAR)pDevExt->Cfg.MouseResolution);
2477 pDevExt->MouExt.uPrevSignAndOverflow = 0;
2478 pDevExt->MouExt.InputState = MouseExpectingACK;
2479 pDevExt->MouExt.LastByteReceived = 0;
2491 PDEVEXT pDevExt = (PDEVEXT)pDevObj->DeviceExtension;
2494 PutBytePoll(i8042Dat, fWaitForAck, KbdDevType, pDevExt, KEYBOARD_RESET);
2501 status = GetBytePoll(KbdDevType, pDevExt, &byte);
2537 TransCtrlCmd(pDevExt, &Ctx);
2539 TransCtrlCmd(pDevExt, &Ctx);
2546 PKEYBOARD_ID pId = &pDevExt->Cfg.KbdAttr.KeyboardIdentifier;
2547 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, KbdDevType, pDevExt, SET_KEYBOARD_TYPEMATIC);
2550 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, KbdDevType, pDevExt,
2551 ConvertTypematic(pDevExt->Cfg.KeyRepeatCurrent.Rate,
2552 pDevExt->Cfg.KeyRepeatCurrent.Delay));
2556 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, KbdDevType, pDevExt, SET_KEYBOARD_INDICATORS);
2559 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, KbdDevType, pDevExt,
2560 (UCHAR)pDevExt->Cfg.KbdInd.LedFlags);
2565 if (pDevExt->Cfg.KbdAttr.KeyboardMode == 1)
2570 TransCtrlCmd(pDevExt, &Ctx);
2577 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, KbdDevType, pDevExt, SELECT_SCAN_CODE_SET);
2579 pDevExt->Cfg.KbdAttr.KeyboardMode = 2;
2582 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, KbdDevType, pDevExt, 1);
2584 pDevExt->Cfg.KbdAttr.KeyboardMode = 2;
2597 pDevExt->KbdExt.CurrentOutput.State = Idle;
2598 pDevExt->KbdExt.CurrentOutput.FirstByte = 0;
2599 pDevExt->KbdExt.CurrentOutput.LastByte = 0;
2609 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
2610 PUCHAR dataAddress = pDevExt->DevRegs[i8042Dat];
2611 PUCHAR commandAddress = pDevExt->DevRegs[i8042Cmd];
2619 TransCtrlCmd(pDevExt, &Ctx);
2625 if (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT)
2629 pDevExt->HardwarePresent &= ~MOUSE_HARDWARE_PRESENT;
2632 if (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
2636 pDevExt->HardwarePresent &= ~KEYBOARD_HARDWARE_PRESENT;
2639 if (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
2641 NTSTATUS status = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_ENABLE_KEYBOARD_DEVICE);
2643 pDevExt->HardwarePresent &= ~KEYBOARD_HARDWARE_PRESENT;
2648 if (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT)
2650 NTSTATUS status = PutBytePoll(i8042Cmd, FALSE /*=wait*/, NoDevice, pDevExt, I8042_ENABLE_MOUSE_DEVICE);
2652 pDevExt->HardwarePresent &= ~MOUSE_HARDWARE_PRESENT;
2656 if (pDevExt->HardwarePresent)
2658 Ctx.HwDisEnMask = pDevExt->HardwarePresent;
2660 Ctx.ByteMask = (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
2663 (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT) ? CCB_ENABLE_MOUSE_INTERRUPT : 0;
2664 TransCtrlCmd(pDevExt, &Ctx);
2937 PDEVEXT pDevExt = &pInit->DevExt;
2938 if ( (pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT)
2942 pDevExt->HardwarePresent |= KEYBOARD_HARDWARE_PRESENT;
2944 PI8042CFGINF pCfg = &pDevExt->Cfg;
3091 PDEVEXT pDevExt = &pInit->DevExt;
3093 if ( (pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT)
3103 pDevExt->HardwarePresent |= MOUSE_HARDWARE_PRESENT;
3107 if (!(pDevExt->HardwarePresent & MOUSE_HARDWARE_PRESENT))
3110 PI8042CFGINF pCfg = &pDevExt->Cfg;
3111 if (!(pDevExt->HardwarePresent & KEYBOARD_HARDWARE_PRESENT))
3222 PDEVEXT pDevExt = (PDEVEXT) pDevObj->DeviceExtension;
3224 if (!pDevExt->Cfg.EnableWheelDetection)
3231 status = PutBytePoll(i8042Dat, TRUE /*=wait*/, MouDevType, pDevExt, s_ucCommands[iCmd]);
3242 status = GetBytePoll(CtrlDevType, pDevExt, &byte);
3253 pDevExt->HardwarePresent |= (WHEELMOUSE_HARDWARE_PRESENT | MOUSE_HARDWARE_PRESENT);
3254 pDevExt->Cfg.MouAttr.MouseIdentifier = WHEELMOUSE_I8042_HARDWARE;
3257 pDevExt->HardwarePresent |= MOUSE_HARDWARE_PRESENT;
3261 pDevExt->MouExt.uPrevSignAndOverflow = 0;
3262 pDevExt->MouExt.InputState = MouseExpectingACK;