ReactOS  0.4.15-dev-3295-gaa8fc87
hardware.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS ISA PnP Bus driver
3  * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE: Hardware support code
5  * COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
6  * Copyright 2020 HervĂ© Poussineau <hpoussin@reactos.org>
7  * Copyright 2021 Dmitry Borisov <di.sean@protonmail.com>
8  */
9 
10 #include "isapnp.h"
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 #ifdef _MSC_VER
16 #pragma warning(disable:28138) /* ISA bus always uses hardcoded port addresses */
17 #endif
18 
19 typedef enum
20 {
25 
26 static
27 inline
28 VOID
31 {
33 }
34 
35 static
36 inline
37 VOID
39  _In_ UCHAR Data)
40 {
42 }
43 
44 static
45 inline
46 UCHAR
48  _In_ PUCHAR ReadDataPort)
49 {
50  return READ_PORT_UCHAR(ReadDataPort);
51 }
52 
53 static
54 inline
55 VOID
59 {
62 }
63 
64 static
65 inline
66 VOID
70 {
71  WriteAddress(Address + 1);
74  WriteData(Value >> 8);
75 }
76 
77 static
78 inline
79 VOID
83 {
85  WriteWord(Address, Value >> 16);
86 }
87 
88 static
89 inline
90 UCHAR
92  _In_ PUCHAR ReadDataPort,
94 {
96  return ReadData(ReadDataPort);
97 }
98 
99 static
100 inline
101 USHORT
103  _In_ PUCHAR ReadDataPort,
105 {
106  return ((ReadByte(ReadDataPort, Address) << 8) |
107  (ReadByte(ReadDataPort, Address + 1)));
108 }
109 
110 static
111 inline
112 ULONG
114  _In_ PUCHAR ReadDataPort,
116 {
117  return ((ReadWord(ReadDataPort, Address) << 8) |
118  (ReadWord(ReadDataPort, Address + 2)));
119 }
120 
121 static
122 inline
123 VOID
125  _In_ PUCHAR ReadDataPort)
126 {
127  WriteByte(ISAPNP_READPORT, (UCHAR)((ULONG_PTR)ReadDataPort >> 2));
128 }
129 
130 static
131 inline
132 VOID
134 {
136 }
137 
138 static
139 inline
140 VOID
142 {
144 }
145 
146 static
147 inline
148 VOID
150  _In_ UCHAR Csn)
151 {
152  WriteByte(ISAPNP_WAKE, Csn);
153 }
154 
155 static
156 inline
157 UCHAR
159  _In_ PUCHAR ReadDataPort)
160 {
161  return ReadByte(ReadDataPort, ISAPNP_RESOURCEDATA);
162 }
163 
164 static
165 inline
166 UCHAR
168  _In_ PUCHAR ReadDataPort)
169 {
170  return ReadByte(ReadDataPort, ISAPNP_STATUS);
171 }
172 
173 static
174 inline
175 VOID
177  _In_ UCHAR Csn)
178 {
180 }
181 
182 static
183 inline
184 VOID
186  _In_ UCHAR LogDev)
187 {
189 }
190 
191 static
192 inline
193 VOID
195  _In_ PUCHAR ReadDataPort,
196  _In_ UCHAR LogDev)
197 {
198  WriteLogicalDeviceNumber(LogDev);
199 
201  ReadByte(ReadDataPort, ISAPNP_IORANGECHECK) & ~2);
202 
204 }
205 
206 static
207 inline
208 VOID
210  _In_ UCHAR LogDev)
211 {
212  WriteLogicalDeviceNumber(LogDev);
214 }
215 
216 static
217 inline
218 USHORT
220  _In_ PUCHAR ReadDataPort,
221  _In_ UCHAR Index)
222 {
223  return ReadWord(ReadDataPort, ISAPNP_IOBASE(Index));
224 }
225 
226 static
227 inline
228 UCHAR
230  _In_ PUCHAR ReadDataPort,
231  _In_ UCHAR Index)
232 {
233  return ReadByte(ReadDataPort, ISAPNP_IRQNO(Index)) & 0x0F;
234 }
235 
236 static
237 inline
238 UCHAR
240  _In_ PUCHAR ReadDataPort,
241  _In_ UCHAR Index)
242 {
243  return ReadByte(ReadDataPort, ISAPNP_IRQTYPE(Index));
244 }
245 
246 static
247 inline
248 UCHAR
250  _In_ PUCHAR ReadDataPort,
251  _In_ UCHAR Index)
252 {
253  return ReadByte(ReadDataPort, ISAPNP_DMACHANNEL(Index)) & 0x07;
254 }
255 
256 static
257 inline
258 USHORT
260  _In_ PUCHAR ReadDataPort,
261  _In_ UCHAR Index)
262 {
263  return ReadWord(ReadDataPort, ISAPNP_MEMBASE(Index));
264 }
265 
266 static
267 inline
268 UCHAR
270  _In_ PUCHAR ReadDataPort,
271  _In_ UCHAR Index)
272 {
273  return ReadByte(ReadDataPort, ISAPNP_MEMCONTROL(Index));
274 }
275 
276 static
277 inline
278 USHORT
280  _In_ PUCHAR ReadDataPort,
281  _In_ UCHAR Index)
282 {
283  return ReadWord(ReadDataPort, ISAPNP_MEMLIMIT(Index));
284 }
285 
286 static
287 inline
288 ULONG
290  _In_ PUCHAR ReadDataPort,
291  _In_ UCHAR Index)
292 {
293  return ReadDoubleWord(ReadDataPort, ISAPNP_MEMBASE32(Index));
294 }
295 
296 static
297 inline
298 UCHAR
300  _In_ PUCHAR ReadDataPort,
301  _In_ UCHAR Index)
302 {
303  return ReadByte(ReadDataPort, ISAPNP_MEMCONTROL32(Index));
304 }
305 
306 static
307 inline
308 ULONG
310  _In_ PUCHAR ReadDataPort,
311  _In_ UCHAR Index)
312 {
313  return ReadDoubleWord(ReadDataPort, ISAPNP_MEMLIMIT32(Index));
314 }
315 
316 static
317 inline
318 UCHAR
320  _In_ UCHAR Lfsr,
321  _In_ UCHAR InputBit)
322 {
323  UCHAR NextLfsr = Lfsr >> 1;
324 
325  NextLfsr |= (((Lfsr ^ NextLfsr) ^ InputBit)) << 7;
326 
327  return NextLfsr;
328 }
329 
330 static
331 VOID
333 {
334  UCHAR i, Lfsr;
335 
336  WriteAddress(0x00);
337  WriteAddress(0x00);
338 
339  Lfsr = ISAPNP_LFSR_SEED;
340  for (i = 0; i < 32; i++)
341  {
342  WriteAddress(Lfsr);
343  Lfsr = NextLFSR(Lfsr, 0);
344  }
345 }
346 
347 static
348 CODE_SEG("PAGE")
349 UCHAR
351  _In_ PUCHAR ReadDataPort)
352 {
353  UCHAR i;
354 
355  PAGED_CODE();
356 
357  for (i = 0; i < 20; i++)
358  {
359  if (ReadStatus(ReadDataPort) & 0x01)
360  return ReadResourceData(ReadDataPort);
361 
363  }
364 
365  return 0xFF;
366 }
367 
368 static
369 CODE_SEG("PAGE")
370 VOID
372  _In_ PUCHAR ReadDataPort,
375 {
376  USHORT i;
377 
378  PAGED_CODE();
379 
380  for (i = 0; i < Length; i++)
381  {
382  UCHAR Byte = PeekByte(ReadDataPort);
383 
384  if (Buffer)
385  ((PUCHAR)Buffer)[i] = Byte;
386  }
387 }
388 
389 static
390 CODE_SEG("PAGE")
391 VOID
393  _In_reads_bytes_(Length) PUCHAR ResourceData,
396 {
397  PUCHAR Dest = Buffer;
398 
399  PAGED_CODE();
400 
401  while (Length--)
402  {
403  *Dest++ = *ResourceData++;
404  }
405 }
406 
407 static
408 CODE_SEG("PAGE")
409 UCHAR
411  _In_ PISAPNP_IDENTIFIER Identifier)
412 {
413  UCHAR i, j, Lfsr;
414 
415  PAGED_CODE();
416 
417  Lfsr = ISAPNP_LFSR_SEED;
418  for (i = 0; i < FIELD_OFFSET(ISAPNP_IDENTIFIER, Checksum); i++)
419  {
420  UCHAR Byte = ((PUCHAR)Identifier)[i];
421 
422  for (j = 0; j < RTL_BITS_OF(Byte); j++)
423  {
424  Lfsr = NextLFSR(Lfsr, Byte);
425  Byte >>= 1;
426  }
427  }
428 
429  return Lfsr;
430 }
431 
432 static
433 CODE_SEG("PAGE")
434 VOID
437  _In_ USHORT CompressedData)
438 {
439  PAGED_CODE();
440 
441  Buffer[0] = ((CompressedData >> 2) & 0x1F) + 'A' - 1;
442  Buffer[1] = (((CompressedData & 0x3) << 3) | ((CompressedData >> 13) & 0x7)) + 'A' - 1;
443  Buffer[2] = ((CompressedData >> 8) & 0x1F) + 'A' - 1;
444 }
445 
446 static
447 CODE_SEG("PAGE")
448 NTSTATUS
450  _In_ PUCHAR ReadDataPort,
452  _In_ ULONG MaxLength,
453  _Out_ PUSHORT MaxLogDev)
454 {
455  PAGED_CODE();
456 
457  *MaxLogDev = 0;
458 
459  while (TRUE)
460  {
461  UCHAR Tag;
462  USHORT TagLen;
463 
464  if (MaxLength < 1)
465  return STATUS_BUFFER_OVERFLOW;
466 
467  Tag = PeekByte(ReadDataPort);
468  if (Tag == 0)
469  {
470  DPRINT("Invalid tag\n");
472  }
473  *Buffer++ = Tag;
474  --MaxLength;
475 
477  {
478  TagLen = ISAPNP_SMALL_TAG_LEN(Tag);
480  }
481  else
482  {
483  UCHAR Temp[2];
484 
485  if (MaxLength < sizeof(Temp))
486  return STATUS_BUFFER_OVERFLOW;
487 
488  Peek(ReadDataPort, &Temp, sizeof(Temp));
489  *Buffer++ = Temp[0];
490  *Buffer++ = Temp[1];
491  MaxLength -= sizeof(Temp);
492 
493  TagLen = Temp[0] + (Temp[1] << 8);
495  }
496 
497  if (Tag == 0xFF && TagLen == 0xFFFF)
498  {
499  DPRINT("Invalid tag\n");
501  }
502 
503  if (TagLen > MaxLength)
504  return STATUS_BUFFER_OVERFLOW;
505 
506  Peek(ReadDataPort, Buffer, TagLen);
507  MaxLength -= TagLen;
508  Buffer += TagLen;
509 
510  if (Tag == ISAPNP_TAG_LOGDEVID)
511  (*MaxLogDev)++;
512 
513  if (Tag == ISAPNP_TAG_END)
514  break;
515  }
516 
517  return STATUS_SUCCESS;
518 }
519 
520 static
521 CODE_SEG("PAGE")
522 VOID
525 {
527 
528  PAGED_CODE();
529 
530  if (LogDevice->FriendlyName)
531  ExFreePoolWithTag(LogDevice->FriendlyName, TAG_ISAPNP);
532 
533  if (LogDevice->Alternatives)
534  ExFreePoolWithTag(LogDevice->Alternatives, TAG_ISAPNP);
535 
536  Entry = LogDevice->CompatibleIdList.Flink;
537  while (Entry != &LogDevice->CompatibleIdList)
538  {
539  PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId =
541 
542  RemoveEntryList(&CompatibleId->IdLink);
543 
544  Entry = Entry->Flink;
545 
546  ExFreePoolWithTag(CompatibleId, TAG_ISAPNP);
547  }
548 
549  ExFreePoolWithTag(LogDevice, TAG_ISAPNP);
550 }
551 
552 static
553 CODE_SEG("PAGE")
554 NTSTATUS
556  _In_ PUCHAR ResourceData,
557  _In_ USHORT LogDevToParse,
559 {
560  USHORT LogDev;
562  PUCHAR IdStrPos = NULL;
563  USHORT IdStrLen = 0;
564  UCHAR NumberOfIo = 0,
565  NumberOfIrq = 0,
566  NumberOfDma = 0,
567  NumberOfMemRange = 0,
568  NumberOfMemRange32 = 0,
569  NumberOfDepedentSet = 0;
570 
571  PAGED_CODE();
572 
573  DPRINT("%s for CSN %u, LDN %u\n", __FUNCTION__, LogDevice->CSN, LogDevice->LDN);
574 
575  LogDev = LogDevToParse + 1;
576 
577  while (TRUE)
578  {
579  UCHAR Tag;
580  USHORT TagLen;
581 
582  Tag = *ResourceData++;
583 
585  {
586  TagLen = ISAPNP_SMALL_TAG_LEN(Tag);
588  }
589  else
590  {
591  TagLen = *ResourceData++;
592  TagLen += *ResourceData++ << 8;
593 
595  }
596 
597  switch (Tag)
598  {
599  case ISAPNP_TAG_LOGDEVID:
600  {
601  ISAPNP_LOGDEVID Temp;
602 
603  --LogDev;
604 
605  if (LogDev != 0 ||
606  (TagLen > sizeof(ISAPNP_LOGDEVID) ||
607  TagLen < (sizeof(ISAPNP_LOGDEVID) - 1)))
608  {
609  goto SkipTag;
610  }
611 
612  PeekCached(ResourceData, &Temp, TagLen);
613  ResourceData += TagLen;
614 
615  DPRINT("Found tag 0x%X (len %u)\n"
616  " VendorId 0x%04X\n"
617  " ProdId 0x%04X\n",
618  Tag, TagLen,
619  Temp.VendorId,
620  Temp.ProdId);
621 
622  IsaPnpExtractAscii(LogDevice->LogVendorId, Temp.VendorId);
623  LogDevice->LogProdId = RtlUshortByteSwap(Temp.ProdId);
624 
625  break;
626  }
627 
629  {
630  ISAPNP_COMPATID Temp;
631  PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId;
632 
633  if (LogDev != 0 || TagLen != sizeof(ISAPNP_COMPATID))
634  goto SkipTag;
635 
636  CompatibleId = ExAllocatePoolWithTag(PagedPool,
638  TAG_ISAPNP);
639  if (!CompatibleId)
641 
642  PeekCached(ResourceData, &Temp, TagLen);
643  ResourceData += TagLen;
644 
645  DPRINT("Found tag 0x%X (len %u)\n"
646  " VendorId 0x%04X\n"
647  " ProdId 0x%04X\n",
648  Tag, TagLen,
649  Temp.VendorId,
650  Temp.ProdId);
651 
652  IsaPnpExtractAscii(CompatibleId->VendorId, Temp.VendorId);
653  CompatibleId->ProdId = RtlUshortByteSwap(Temp.ProdId);
654 
655  InsertTailList(&LogDevice->CompatibleIdList, &CompatibleId->IdLink);
656 
657  break;
658  }
659 
660  case ISAPNP_TAG_IRQ:
661  {
663 
664  if (LogDev != 0 ||
665  (TagLen > sizeof(ISAPNP_IRQ_DESCRIPTION) ||
666  TagLen < (sizeof(ISAPNP_IRQ_DESCRIPTION) - 1)) ||
667  NumberOfIrq >= RTL_NUMBER_OF(LogDevice->Irq))
668  {
669  goto SkipTag;
670  }
671 
672  if (DfState == dfStarted)
673  {
674  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
675  goto SkipTag;
676 
677  Description = &LogDevice->Alternatives->Irq[NumberOfDepedentSet];
678  }
679  else
680  {
681  Description = &LogDevice->Irq[NumberOfIrq].Description;
682 
683  LogDevice->Irq[NumberOfIrq].Index = NumberOfIrq;
684  ++NumberOfIrq;
685  }
686 
687  PeekCached(ResourceData, Description, TagLen);
688  ResourceData += TagLen;
689 
690  if (TagLen == (sizeof(ISAPNP_IRQ_DESCRIPTION) - 1))
691  Description->Information = 0x01;
692 
693  DPRINT("Found tag 0x%X (len %u)\n"
694  " Mask 0x%X\n"
695  " Information 0x%X\n",
696  Tag, TagLen,
697  Description->Mask,
698  Description->Information);
699 
700  break;
701  }
702 
703  case ISAPNP_TAG_DMA:
704  {
706 
707  if (LogDev != 0 || TagLen != sizeof(ISAPNP_DMA_DESCRIPTION) ||
708  NumberOfDma >= RTL_NUMBER_OF(LogDevice->Dma))
709  {
710  goto SkipTag;
711  }
712 
713  if (DfState == dfStarted)
714  {
715  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
716  goto SkipTag;
717 
718  Description = &LogDevice->Alternatives->Dma[NumberOfDepedentSet];
719  }
720  else
721  {
722  Description = &LogDevice->Dma[NumberOfDma].Description;
723 
724  LogDevice->Dma[NumberOfDma].Index = NumberOfDma;
725  ++NumberOfDma;
726  }
727 
728  PeekCached(ResourceData, Description, TagLen);
729  ResourceData += TagLen;
730 
731  DPRINT("Found tag 0x%X (len %u)\n"
732  " Mask 0x%X\n"
733  " Information 0x%X\n",
734  Tag, TagLen,
735  Description->Mask,
736  Description->Information);
737 
738  break;
739  }
740 
741  case ISAPNP_TAG_STARTDEP:
742  {
743  if (LogDev != 0 || TagLen > 1 ||
744  NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
745  {
746  goto SkipTag;
747  }
748 
749  if (DfState == dfNotStarted)
750  {
751  LogDevice->Alternatives = ExAllocatePoolZero(PagedPool,
752  sizeof(ISAPNP_ALTERNATIVES),
753  TAG_ISAPNP);
754  if (!LogDevice->Alternatives)
756 
757  DfState = dfStarted;
758  }
759  else if (DfState == dfStarted)
760  {
761  ++NumberOfDepedentSet;
762  }
763  else
764  {
765  goto SkipTag;
766  }
767 
768  ++LogDevice->Alternatives->Count;
769 
770  if (TagLen != 1)
771  {
772  LogDevice->Alternatives->Priority[NumberOfDepedentSet] = 1;
773  }
774  else
775  {
776  PeekCached(ResourceData,
777  &LogDevice->Alternatives->Priority[NumberOfDepedentSet],
778  TagLen);
779  ResourceData += TagLen;
780  }
781 
782  DPRINT("*** Start depedent set %u, priority %u ***\n",
783  NumberOfDepedentSet,
784  LogDevice->Alternatives->Priority[NumberOfDepedentSet]);
785 
786  break;
787  }
788 
789  case ISAPNP_TAG_ENDDEP:
790  {
791  if (LogDev != 0 || DfState != dfStarted)
792  goto SkipTag;
793 
794  DfState = dfDone;
795 
796  ResourceData += TagLen;
797 
798  if (HasIoAlternatives(LogDevice->Alternatives))
799  LogDevice->Alternatives->IoIndex = NumberOfIo++;
800  if (HasIrqAlternatives(LogDevice->Alternatives))
801  LogDevice->Alternatives->IrqIndex = NumberOfIrq++;
802  if (HasDmaAlternatives(LogDevice->Alternatives))
803  LogDevice->Alternatives->DmaIndex = NumberOfDma++;
804  if (HasMemoryAlternatives(LogDevice->Alternatives))
805  LogDevice->Alternatives->MemRangeIndex = NumberOfMemRange++;
806  if (HasMemory32Alternatives(LogDevice->Alternatives))
807  LogDevice->Alternatives->MemRange32Index = NumberOfMemRange32++;
808 
809  DPRINT("*** End of depedent set ***\n");
810 
811  break;
812  }
813 
814  case ISAPNP_TAG_IOPORT:
815  {
817 
818  if (LogDev != 0 || TagLen != sizeof(ISAPNP_IO_DESCRIPTION) ||
819  NumberOfIo >= RTL_NUMBER_OF(LogDevice->Io))
820  {
821  goto SkipTag;
822  }
823 
824  if (DfState == dfStarted)
825  {
826  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
827  goto SkipTag;
828 
829  Description = &LogDevice->Alternatives->Io[NumberOfDepedentSet];
830  }
831  else
832  {
833  Description = &LogDevice->Io[NumberOfIo].Description;
834 
835  LogDevice->Io[NumberOfIo].Index = NumberOfIo;
836  ++NumberOfIo;
837  }
838 
839  PeekCached(ResourceData, Description, TagLen);
840  ResourceData += TagLen;
841 
842  DPRINT("Found tag 0x%X (len %u)\n"
843  " Information 0x%X\n"
844  " Minimum 0x%X\n"
845  " Maximum 0x%X\n"
846  " Alignment 0x%X\n"
847  " Length 0x%X\n",
848  Tag, TagLen,
849  Description->Information,
850  Description->Minimum,
851  Description->Maximum,
852  Description->Alignment,
853  Description->Length);
854 
855  break;
856  }
857 
858  case ISAPNP_TAG_FIXEDIO:
859  {
862 
863  if (LogDev != 0 || TagLen != sizeof(ISAPNP_FIXED_IO_DESCRIPTION) ||
864  NumberOfIo >= RTL_NUMBER_OF(LogDevice->Io))
865  {
866  goto SkipTag;
867  }
868 
869  if (DfState == dfStarted)
870  {
871  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
872  goto SkipTag;
873 
874  Description = &LogDevice->Alternatives->Io[NumberOfDepedentSet];
875  }
876  else
877  {
878  Description = &LogDevice->Io[NumberOfIo].Description;
879 
880  LogDevice->Io[NumberOfIo].Index = NumberOfIo;
881  ++NumberOfIo;
882  }
883 
884  PeekCached(ResourceData, &Temp, TagLen);
885  ResourceData += TagLen;
886 
887  Description->Information = 0;
888  Description->Minimum =
889  Description->Maximum = Temp.IoBase;
890  Description->Alignment = 1;
891  Description->Length = Temp.Length;
892 
893  DPRINT("Found tag 0x%X (len %u)\n"
894  " IoBase 0x%X\n"
895  " Length 0x%X\n",
896  Tag, TagLen,
897  Temp.IoBase,
898  Temp.Length);
899 
900  break;
901  }
902 
903  case ISAPNP_TAG_END:
904  {
905  if (IdStrPos)
906  {
907  PSTR End;
908 
909  LogDevice->FriendlyName = ExAllocatePoolWithTag(PagedPool,
910  IdStrLen + sizeof(ANSI_NULL),
911  TAG_ISAPNP);
912  if (!LogDevice->FriendlyName)
914 
915  PeekCached(IdStrPos, LogDevice->FriendlyName, IdStrLen);
916 
917  End = LogDevice->FriendlyName + IdStrLen - 1;
918  while (End > LogDevice->FriendlyName && *End == ' ')
919  {
920  --End;
921  }
922  *++End = ANSI_NULL;
923  }
924 
925  return STATUS_SUCCESS;
926  }
927 
928  case ISAPNP_TAG_MEMRANGE:
929  {
931 
932  if (LogDev != 0 || TagLen != sizeof(ISAPNP_MEMRANGE_DESCRIPTION) ||
933  NumberOfMemRange >= RTL_NUMBER_OF(LogDevice->MemRange))
934  {
935  goto SkipTag;
936  }
937 
938  if (DfState == dfStarted)
939  {
940  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
941  goto SkipTag;
942 
943  Description = &LogDevice->Alternatives->MemRange[NumberOfDepedentSet];
944  }
945  else
946  {
947  Description = &LogDevice->MemRange[NumberOfMemRange].Description;
948 
949  LogDevice->MemRange[NumberOfMemRange].Index = NumberOfMemRange;
950  ++NumberOfMemRange;
951  }
952 
953  PeekCached(ResourceData, Description, TagLen);
954  ResourceData += TagLen;
955 
956  DPRINT("Found tag 0x%X (len %u)\n"
957  " Information 0x%X\n"
958  " Minimum 0x%X\n"
959  " Maximum 0x%X\n"
960  " Alignment 0x%X\n"
961  " Length 0x%X\n",
962  Tag, TagLen,
963  Description->Information,
964  Description->Minimum,
965  Description->Maximum,
966  Description->Alignment,
967  Description->Length);
968 
969  break;
970  }
971 
972  case ISAPNP_TAG_ANSISTR:
973  {
974  /* If logical device identifier is not supplied, use card identifier */
975  if (LogDev == LogDevToParse + 1 || LogDev == 0)
976  {
977  IdStrPos = ResourceData;
978  IdStrLen = TagLen;
979 
980  ResourceData += TagLen;
981 
982  DPRINT("Found tag 0x%X (len %u)\n"
983  " '%.*s'\n",
984  Tag, TagLen,
985  IdStrLen,
986  IdStrPos);
987  }
988  else
989  {
990  goto SkipTag;
991  }
992 
993  break;
994  }
995 
997  {
999 
1000  if (LogDev != 0 || TagLen != sizeof(ISAPNP_MEMRANGE32_DESCRIPTION) ||
1001  NumberOfMemRange32 >= RTL_NUMBER_OF(LogDevice->MemRange32))
1002  {
1003  goto SkipTag;
1004  }
1005 
1006  if (DfState == dfStarted)
1007  {
1008  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
1009  goto SkipTag;
1010 
1011  Description = &LogDevice->Alternatives->MemRange32[NumberOfDepedentSet];
1012  }
1013  else
1014  {
1015  Description = &LogDevice->MemRange32[NumberOfMemRange32].Description;
1016 
1017  LogDevice->MemRange32[NumberOfMemRange32].Index = NumberOfMemRange32;
1018  ++NumberOfMemRange32;
1019  }
1020 
1021  PeekCached(ResourceData, Description, TagLen);
1022  ResourceData += TagLen;
1023 
1024  DPRINT("Found tag 0x%X (len %u)\n"
1025  " Information 0x%X\n"
1026  " Minimum 0x%08lX\n"
1027  " Maximum 0x%08lX\n"
1028  " Alignment 0x%08lX\n"
1029  " Length 0x%08lX\n",
1030  Tag, TagLen,
1031  Description->Information,
1032  Description->Minimum,
1033  Description->Maximum,
1034  Description->Alignment,
1035  Description->Length);
1036 
1037  break;
1038  }
1039 
1041  {
1044 
1045  if (LogDev != 0 || TagLen != sizeof(ISAPNP_FIXEDMEMRANGE_DESCRIPTION) ||
1046  NumberOfMemRange32 >= RTL_NUMBER_OF(LogDevice->MemRange32))
1047  {
1048  goto SkipTag;
1049  }
1050 
1051  if (DfState == dfStarted)
1052  {
1053  if (NumberOfDepedentSet >= ISAPNP_MAX_ALTERNATIVES)
1054  goto SkipTag;
1055 
1056  Description = &LogDevice->Alternatives->MemRange32[NumberOfDepedentSet];
1057  }
1058  else
1059  {
1060  Description = &LogDevice->MemRange32[NumberOfMemRange32].Description;
1061 
1062  LogDevice->MemRange32[NumberOfMemRange32].Index = NumberOfMemRange32;
1063  ++NumberOfMemRange32;
1064  }
1065 
1066  PeekCached(ResourceData, &Temp, TagLen);
1067  ResourceData += TagLen;
1068 
1069  Description->Information = Temp.Information;
1070  Description->Minimum =
1071  Description->Maximum = Temp.MemoryBase;
1072  Description->Alignment = 1;
1073  Description->Length = Temp.Length;
1074 
1075  DPRINT("Found tag 0x%X (len %u)\n"
1076  " Information 0x%X\n"
1077  " MemoryBase 0x%08lX\n"
1078  " Length 0x%08lX\n",
1079  Tag, TagLen,
1080  Temp.Information,
1081  Temp.MemoryBase,
1082  Temp.Length);
1083 
1084  break;
1085  }
1086 
1087 SkipTag:
1088  default:
1089  {
1090  if (LogDev == 0)
1091  DPRINT("Found unknown tag 0x%X (len %u)\n", Tag, TagLen);
1092 
1093  /* We don't want to read informations on this
1094  * logical device, or we don't know the tag. */
1095  ResourceData += TagLen;
1096  break;
1097  }
1098  }
1099  }
1100 }
1101 
1102 static
1103 CODE_SEG("PAGE")
1104 BOOLEAN
1106  _In_ PUCHAR ReadDataPort,
1107  _Inout_ PISAPNP_LOGICAL_DEVICE LogDevice)
1108 {
1109  UCHAR i;
1110 
1111  PAGED_CODE();
1112 
1113  DPRINT("%s for CSN %u, LDN %u\n", __FUNCTION__, LogDevice->CSN, LogDevice->LDN);
1114 
1115  WriteLogicalDeviceNumber(LogDevice->LDN);
1116 
1117  /* If the device is not activated by BIOS we just report a NULL resource list */
1118  if (!(ReadByte(ReadDataPort, ISAPNP_ACTIVATE) & 1))
1119  {
1120  LogDevice->Flags &= ~ISAPNP_HAS_RESOURCES;
1121  return FALSE;
1122  }
1123 
1124  for (i = 0; i < RTL_NUMBER_OF(LogDevice->Io); i++)
1125  {
1126  LogDevice->Io[i].CurrentBase = ReadIoBase(ReadDataPort, i);
1127 
1128  /* Skip empty descriptors */
1129  if (!LogDevice->Io[i].CurrentBase)
1130  break;
1131  }
1132  for (i = 0; i < RTL_NUMBER_OF(LogDevice->Irq); i++)
1133  {
1134  LogDevice->Irq[i].CurrentNo = ReadIrqNo(ReadDataPort, i);
1135 
1136  if (!LogDevice->Irq[i].CurrentNo)
1137  break;
1138 
1139  LogDevice->Irq[i].CurrentType = ReadIrqType(ReadDataPort, i);
1140  }
1141  for (i = 0; i < RTL_NUMBER_OF(LogDevice->Dma); i++)
1142  {
1143  LogDevice->Dma[i].CurrentChannel = ReadDmaChannel(ReadDataPort, i);
1144 
1145  if (LogDevice->Dma[i].CurrentChannel == 4)
1146  break;
1147  }
1148  for (i = 0; i < RTL_NUMBER_OF(LogDevice->MemRange); i++)
1149  {
1150  LogDevice->MemRange[i].CurrentBase = ReadMemoryBase(ReadDataPort, i) << 8;
1151 
1152  if (!LogDevice->MemRange[i].CurrentBase)
1153  break;
1154 
1155  LogDevice->MemRange[i].CurrentLength = ReadMemoryLimit(ReadDataPort, i) << 8;
1156 
1157  if (ReadMemoryControl(ReadDataPort, i) & MEMORY_UPPER_LIMIT)
1158  {
1159  LogDevice->MemRange[i].CurrentLength -= LogDevice->MemRange[i].CurrentBase;
1160  }
1161  else
1162  {
1163  LogDevice->MemRange[i].CurrentLength =
1164  RANGE_LENGTH_TO_LENGTH(LogDevice->MemRange[i].CurrentLength);
1165  }
1166  }
1167  for (i = 0; i < RTL_NUMBER_OF(LogDevice->MemRange32); i++)
1168  {
1169  LogDevice->MemRange32[i].CurrentBase = ReadMemoryBase32(ReadDataPort, i);
1170 
1171  if (!LogDevice->MemRange32[i].CurrentBase)
1172  break;
1173 
1174  LogDevice->MemRange32[i].CurrentLength = ReadMemoryLimit32(ReadDataPort, i);
1175 
1176  if (ReadMemoryControl32(ReadDataPort, i) & MEMORY_UPPER_LIMIT)
1177  {
1178  LogDevice->MemRange32[i].CurrentLength -= LogDevice->MemRange32[i].CurrentBase;
1179  }
1180  else
1181  {
1182  LogDevice->MemRange32[i].CurrentLength =
1183  RANGE_LENGTH_TO_LENGTH(LogDevice->MemRange32[i].CurrentLength);
1184  }
1185  }
1186 
1187  LogDevice->Flags |= ISAPNP_HAS_RESOURCES;
1188  return TRUE;
1189 }
1190 
1191 static
1192 CODE_SEG("PAGE")
1193 VOID
1195  _In_ PUCHAR ReadDataPort,
1196  _In_ PISAPNP_LOGICAL_DEVICE LogDevice,
1197  _In_ PCM_PARTIAL_RESOURCE_LIST PartialResourceList)
1198 {
1199  UCHAR i,
1200  NumberOfIo = 0,
1201  NumberOfIrq = 0,
1202  NumberOfDma = 0,
1203  NumberOfMemory = 0,
1204  NumberOfMemory32 = 0;
1205 
1206  PAGED_CODE();
1207 
1208  WriteLogicalDeviceNumber(LogDevice->LDN);
1209 
1210  for (i = 0; i < PartialResourceList->Count; i++)
1211  {
1212  PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor = &PartialResourceList->PartialDescriptors[i];
1213  UCHAR Index;
1214 
1215  switch (Descriptor->Type)
1216  {
1217  case CmResourceTypePort:
1218  {
1219  (VOID)FindIoDescriptor(LogDevice,
1220  0,
1221  Descriptor->u.Port.Start.LowPart,
1222  Descriptor->u.Port.Start.LowPart +
1223  Descriptor->u.Port.Length - 1,
1224  NULL,
1225  NULL,
1226  &Index);
1227 
1228  WriteWord(ISAPNP_IOBASE(Index), (USHORT)Descriptor->u.Port.Start.LowPart);
1229 
1230  ++NumberOfIo;
1231  break;
1232  }
1233 
1235  {
1236  (VOID)FindIrqDescriptor(LogDevice, Descriptor->u.Interrupt.Level, &Index);
1237 
1238  WriteByte(ISAPNP_IRQNO(Index), (UCHAR)Descriptor->u.Interrupt.Level);
1242 
1243  ++NumberOfIrq;
1244  break;
1245  }
1246 
1247  case CmResourceTypeDma:
1248  {
1249  (VOID)FindDmaDescriptor(LogDevice, Descriptor->u.Dma.Channel, &Index);
1250 
1251  WriteByte(ISAPNP_DMACHANNEL(Index), (UCHAR)Descriptor->u.Dma.Channel);
1252 
1253  ++NumberOfDma;
1254  break;
1255  }
1256 
1257  case CmResourceTypeMemory:
1258  {
1259  BOOLEAN Memory32;
1261  UCHAR MemoryControl = MEMORY_USE_8_BIT_DECODER;
1262 
1263  (VOID)FindMemoryDescriptor(LogDevice,
1264  Descriptor->u.Memory.Start.LowPart,
1265  Descriptor->u.Memory.Start.LowPart +
1266  Descriptor->u.Memory.Length - 1,
1267  &Memory32,
1268  &Information,
1269  &Index);
1270 
1271  if (!Memory32)
1272  {
1274  MemoryControl = MEMORY_USE_16_BIT_DECODER;
1275 
1277  (USHORT)(Descriptor->u.Memory.Start.LowPart >> 8));
1278 
1279  if (ReadMemoryControl(ReadDataPort, Index) & MEMORY_UPPER_LIMIT)
1280  {
1282  MemoryControl | MEMORY_UPPER_LIMIT);
1284  (USHORT)((Descriptor->u.Memory.Start.LowPart +
1285  Descriptor->u.Memory.Length) >> 8));
1286  }
1287  else
1288  {
1289  WriteByte(ISAPNP_MEMCONTROL(Index), MemoryControl);
1292  u.Memory.Length) >> 8));
1293  }
1294 
1295  ++NumberOfMemory;
1296  }
1297  else
1298  {
1300  Descriptor->u.Memory.Start.LowPart);
1301 
1303  MemoryControl = MEMORY_USE_32_BIT_DECODER;
1305  MemoryControl = MEMORY_USE_16_BIT_DECODER;
1306 
1307  if (ReadMemoryControl32(ReadDataPort, Index) & MEMORY_UPPER_LIMIT)
1308  {
1310  MemoryControl | MEMORY_UPPER_LIMIT);
1312  Descriptor->u.Memory.Start.LowPart +
1313  Descriptor->u.Memory.Length);
1314  }
1315  else
1316  {
1317  WriteByte(ISAPNP_MEMCONTROL32(Index), MemoryControl);
1319  LENGTH_TO_RANGE_LENGTH(Descriptor->u.Memory.Length));
1320  }
1321 
1322  ++NumberOfMemory32;
1323  }
1324 
1325  break;
1326  }
1327 
1328  default:
1329  break;
1330  }
1331  }
1332 
1333  for (i = NumberOfIo; i < RTL_NUMBER_OF(LogDevice->Io); i++)
1334  {
1335  WriteWord(ISAPNP_IOBASE(i), 0);
1336  }
1337  for (i = NumberOfIrq; i < RTL_NUMBER_OF(LogDevice->Irq); i++)
1338  {
1339  WriteByte(ISAPNP_IRQNO(i), 0);
1340  WriteByte(ISAPNP_IRQTYPE(i), 0);
1341  }
1342  for (i = NumberOfDma; i < RTL_NUMBER_OF(LogDevice->Dma); i++)
1343  {
1345  }
1346  for (i = NumberOfMemory; i < RTL_NUMBER_OF(LogDevice->MemRange); i++)
1347  {
1348  WriteWord(ISAPNP_MEMBASE(i), 0);
1351  }
1352  for (i = NumberOfMemory32; i < RTL_NUMBER_OF(LogDevice->MemRange32); i++)
1353  {
1357  }
1358 }
1359 
1360 CODE_SEG("PAGE")
1361 UCHAR
1363  _In_ PUCHAR ReadDataPort)
1364 {
1365  ULONG NumberOfRead = 0;
1366  UCHAR Csn = 0;
1367 
1368  PAGED_CODE();
1369 
1370  DPRINT("Setting read data port: 0x%p\n", ReadDataPort);
1371 
1372  SendKey();
1373 
1377 
1378  SendKey();
1379 
1380  Wake(0x00);
1382 
1383  SetReadDataPort(ReadDataPort);
1384 
1385  Wake(0x00);
1386 
1387  while (TRUE)
1388  {
1389  ISAPNP_IDENTIFIER Identifier;
1390  UCHAR i, j;
1391  BOOLEAN Seen55aa = FALSE;
1392 
1395 
1396  RtlZeroMemory(&Identifier, sizeof(Identifier));
1397 
1398  for (i = 0; i < sizeof(Identifier); i++)
1399  {
1400  UCHAR Byte = 0;
1401 
1402  for (j = 0; j < RTL_BITS_OF(Byte); j++)
1403  {
1404  USHORT Data;
1405 
1406  Data = ReadData(ReadDataPort) << 8;
1408  Data |= ReadData(ReadDataPort);
1410 
1411  Byte >>= 1;
1412 
1413  if (Data == 0x55AA)
1414  {
1415  Byte |= 0x80;
1416  Seen55aa = TRUE;
1417  }
1418  }
1419 
1420  ((PUCHAR)&Identifier)[i] = Byte;
1421  }
1422 
1423  ++NumberOfRead;
1424 
1425  if (Identifier.Checksum != 0x00 &&
1426  Identifier.Checksum != IsaPnpChecksum(&Identifier))
1427  {
1428  DPRINT("Bad checksum\n");
1429  break;
1430  }
1431 
1432  if (!Seen55aa)
1433  {
1434  DPRINT("Saw no sign of life\n");
1435  break;
1436  }
1437 
1438  Csn++;
1439 
1440  WriteCsn(Csn);
1442 
1443  Wake(0x00);
1444  }
1445 
1446  Wake(0x00);
1447 
1448  if (NumberOfRead == 1)
1449  {
1450  DPRINT("Trying next read data port\n");
1451  return 0;
1452  }
1453  else
1454  {
1455  DPRINT("Found %u cards at read port 0x%p\n", Csn, ReadDataPort);
1456  return Csn;
1457  }
1458 }
1459 
1460 _Requires_lock_held_(FdoExt->DeviceSyncEvent)
1461 CODE_SEG("PAGE")
1462 NTSTATUS
1463 IsaHwFillDeviceList(
1464  _In_ PISAPNP_FDO_EXTENSION FdoExt)
1465 {
1466  PISAPNP_LOGICAL_DEVICE LogDevice;
1467  UCHAR Csn;
1469  PUCHAR ResourceData;
1470 
1471  PAGED_CODE();
1472  ASSERT(FdoExt->ReadDataPort);
1473 
1474  DPRINT("%s for read port 0x%p\n", __FUNCTION__, FdoExt->ReadDataPort);
1475 
1477  if (!ResourceData)
1478  {
1479  DPRINT1("Failed to allocate memory for cache data\n");
1481  }
1482 
1483  for (Entry = FdoExt->DeviceListHead.Flink;
1484  Entry != &FdoExt->DeviceListHead;
1485  Entry = Entry->Flink)
1486  {
1487  LogDevice = CONTAINING_RECORD(Entry, ISAPNP_LOGICAL_DEVICE, DeviceLink);
1488 
1489  LogDevice->Flags &= ~ISAPNP_PRESENT;
1490  }
1491 
1492  for (Csn = 1; Csn <= FdoExt->Cards; Csn++)
1493  {
1494  NTSTATUS Status;
1495  UCHAR TempId[3], LogDev;
1496  ISAPNP_IDENTIFIER Identifier;
1497  USHORT MaxLogDev;
1498 
1499  Wake(Csn);
1500 
1501  Peek(FdoExt->ReadDataPort, &Identifier, sizeof(Identifier));
1502 
1503  IsaPnpExtractAscii(TempId, Identifier.VendorId);
1504  Identifier.ProdId = RtlUshortByteSwap(Identifier.ProdId);
1505 
1506  Status = ReadTags(FdoExt->ReadDataPort, ResourceData, ISAPNP_MAX_RESOURCEDATA, &MaxLogDev);
1507  if (!NT_SUCCESS(Status))
1508  {
1509  DPRINT1("Failed to read tags with status 0x%08lx, CSN %u\n", Status, Csn);
1510  continue;
1511  }
1512 
1513  DPRINT("Detected ISA PnP device - VID: '%.3s' PID: 0x%04x SN: 0x%08lX\n",
1514  TempId, Identifier.ProdId, Identifier.Serial);
1515 
1516  for (LogDev = 0; LogDev < MaxLogDev; LogDev++)
1517  {
1518  BOOLEAN IsAlreadyEnumerated = FALSE;
1519 
1520  for (Entry = FdoExt->DeviceListHead.Flink;
1521  Entry != &FdoExt->DeviceListHead;
1522  Entry = Entry->Flink)
1523  {
1524  LogDevice = CONTAINING_RECORD(Entry, ISAPNP_LOGICAL_DEVICE, DeviceLink);
1525 
1526  /* This logical device has already been enumerated */
1527  if ((LogDevice->SerialNumber == Identifier.Serial) &&
1528  (RtlCompareMemory(LogDevice->VendorId, TempId, 3) == 3) &&
1529  (LogDevice->ProdId == Identifier.ProdId) &&
1530  (LogDevice->LDN == LogDev))
1531  {
1532  LogDevice->Flags |= ISAPNP_PRESENT;
1533 
1534  /* Assign a new CSN */
1535  LogDevice->CSN = Csn;
1536 
1537  if (LogDevice->Pdo)
1538  {
1540 
1541  if (PdoExt->Common.State == dsStarted)
1542  ActivateDevice(FdoExt->ReadDataPort, LogDev);
1543  }
1544 
1545  DPRINT("Skip CSN %u, LDN %u\n", LogDevice->CSN, LogDevice->LDN);
1546  IsAlreadyEnumerated = TRUE;
1547  break;
1548  }
1549  }
1550 
1551  if (IsAlreadyEnumerated)
1552  continue;
1553 
1554  LogDevice = ExAllocatePoolZero(NonPagedPool, sizeof(ISAPNP_LOGICAL_DEVICE), TAG_ISAPNP);
1555  if (!LogDevice)
1556  {
1557  DPRINT1("Failed to allocate logical device!\n");
1558  goto Deactivate;
1559  }
1560 
1561  InitializeListHead(&LogDevice->CompatibleIdList);
1562 
1563  LogDevice->CSN = Csn;
1564  LogDevice->LDN = LogDev;
1565 
1566  Status = ParseTags(ResourceData, LogDev, LogDevice);
1567  if (!NT_SUCCESS(Status))
1568  {
1569  DPRINT1("Failed to parse tags with status 0x%08lx, CSN %u, LDN %u\n",
1570  Status, LogDevice->CSN, LogDevice->LDN);
1571  FreeLogicalDevice(LogDevice);
1572  goto Deactivate;
1573  }
1574 
1575  if (!ReadCurrentResources(FdoExt->ReadDataPort, LogDevice))
1576  DPRINT("Unable to read boot resources\n");
1577 
1578  IsaPnpExtractAscii(LogDevice->VendorId, Identifier.VendorId);
1579  LogDevice->ProdId = Identifier.ProdId;
1580  LogDevice->SerialNumber = Identifier.Serial;
1581 
1582  if (MaxLogDev > 1)
1583  LogDevice->Flags |= ISAPNP_HAS_MULTIPLE_LOGDEVS;
1584 
1585  LogDevice->Flags |= ISAPNP_PRESENT;
1586 
1587  InsertTailList(&FdoExt->DeviceListHead, &LogDevice->DeviceLink);
1588  FdoExt->DeviceCount++;
1589 
1590  /* Now we wait for the start device IRP */
1591 Deactivate:
1592  DeactivateDevice(LogDev);
1593  }
1594  }
1595 
1596  ExFreePoolWithTag(ResourceData, TAG_ISAPNP);
1597 
1598  return STATUS_SUCCESS;
1599 }
1600 
1601 CODE_SEG("PAGE")
1602 NTSTATUS
1604  _In_ PISAPNP_FDO_EXTENSION FdoExt,
1607 {
1608  UCHAR i,
1609  NumberOfIo = 0,
1610  NumberOfIrq = 0,
1611  NumberOfDma = 0,
1612  NumberOfMemory = 0;
1613 
1614  PAGED_CODE();
1615 
1616  if (!Resources)
1618 
1619  /* Validate the resource list */
1620  for (i = 0; i < Resources->List[0].PartialResourceList.Count; i++)
1621  {
1623  &Resources->List[0].PartialResourceList.PartialDescriptors[i];
1624 
1625  switch (Descriptor->Type)
1626  {
1627  case CmResourceTypePort:
1628  {
1629  if (++NumberOfIo > RTL_NUMBER_OF(LogicalDevice->Io))
1631 
1633  0,
1634  Descriptor->u.Port.Start.LowPart,
1635  Descriptor->u.Port.Start.LowPart +
1636  Descriptor->u.Port.Length - 1,
1637  NULL,
1638  NULL,
1639  NULL))
1640  {
1642  }
1643 
1644  break;
1645  }
1646 
1648  {
1649  if (++NumberOfIrq > RTL_NUMBER_OF(LogicalDevice->Irq))
1651 
1652  if (!FindIrqDescriptor(LogicalDevice, Descriptor->u.Interrupt.Level, NULL))
1654 
1655  break;
1656  }
1657 
1658  case CmResourceTypeDma:
1659  {
1660  if (++NumberOfDma > RTL_NUMBER_OF(LogicalDevice->Dma))
1662 
1663  if (!FindDmaDescriptor(LogicalDevice, Descriptor->u.Dma.Channel, NULL))
1665 
1666  break;
1667  }
1668 
1669  case CmResourceTypeMemory:
1670  {
1671  BOOLEAN Memory32;
1672 
1673  if (++NumberOfMemory > RTL_NUMBER_OF(LogicalDevice->MemRange))
1675 
1677  Descriptor->u.Memory.Start.LowPart,
1678  Descriptor->u.Memory.Start.LowPart +
1679  Descriptor->u.Memory.Length - 1,
1680  &Memory32,
1681  NULL,
1682  NULL))
1683  {
1685  }
1686 
1687  if (!Memory32 && (Descriptor->u.Memory.Start.LowPart & 0xFF))
1688  return STATUS_INVALID_PARAMETER;
1689 
1690  break;
1691  }
1692 
1693  default:
1694  break;
1695  }
1696  }
1697 
1698  WriteResources(FdoExt->ReadDataPort, LogicalDevice, &Resources->List[0].PartialResourceList);
1699 
1701 
1702  return STATUS_SUCCESS;
1703 }
1704 
1706 VOID
1707 IsaHwWakeDevice(
1709 {
1710  SendKey();
1712 }
1713 
1715 VOID
1716 IsaHwActivateDevice(
1717  _In_ PISAPNP_FDO_EXTENSION FdoExt,
1719 {
1720  ActivateDevice(FdoExt->ReadDataPort, LogicalDevice->LDN);
1721 }
1722 
1724 VOID
1725 IsaHwDeactivateDevice(
1727 {
1729 }
1730 
1732 VOID
1733 IsaHwWaitForKey(VOID)
1734 {
1735  WaitForKey();
1736 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
_IRQL_requires_max_(DISPATCH_LEVEL)
Definition: hardware.c:1705
static USHORT ReadMemoryLimit(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:279
#define ISAPNP_HAS_RESOURCES
Cleared when the device has no boot resources.
Definition: isapnp.h:136
static VOID WriteWord(_In_ UCHAR Address, _In_ USHORT Value)
Definition: hardware.c:67
BOOLEAN FindIoDescriptor(_In_ PISAPNP_LOGICAL_DEVICE LogDevice, _In_opt_ ULONG Base, _In_ ULONG RangeStart, _In_ ULONG RangeEnd, _Out_opt_ PUCHAR Information, _Out_opt_ PULONG Length, _Out_opt_ PUCHAR WriteOrder)
Definition: isapnp.c:518
DEPEDENT_FUNCTION_STATE
Definition: hardware.c:19
#define ISAPNP_IS_SMALL_TAG(t)
Definition: isapnphw.h:54
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define ISAPNP_CONFIG_RESET_CSN
Definition: isapnphw.h:50
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:339
FORCEINLINE BOOLEAN HasIoAlternatives(_In_ PISAPNP_ALTERNATIVES Alternatives)
Definition: isapnp.h:242
#define _Inout_
Definition: ms_sal.h:378
static UCHAR ReadIrqType(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:239
struct _Entry Entry
Definition: kefuncs.h:627
#define ISAPNP_SMALL_TAG_NAME(t)
Definition: isapnphw.h:55
#define ISAPNP_PRESENT
Cleared when the device is physically removed.
Definition: isapnp.h:134
#define _Out_
Definition: ms_sal.h:345
#define READ_PORT_UCHAR(p)
Definition: pc98vid.h:22
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define ISAPNP_TAG_COMPATDEVID
Definition: isapnphw.h:59
#define TRUE
Definition: types.h:120
#define RtlUshortByteSwap(_x)
Definition: rtlfuncs.h:3197
#define ISAPNP_CONFIG_WAIT_FOR_KEY
Definition: isapnphw.h:49
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
BOOLEAN FindIrqDescriptor(_In_ PISAPNP_LOGICAL_DEVICE LogDevice, _In_ ULONG Vector, _Out_opt_ PUCHAR WriteOrder)
Definition: isapnp.c:583
unsigned char * PUCHAR
Definition: retypes.h:3
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG _In_opt_ PVOID Data
Definition: wdfdevice.h:4527
LONG NTSTATUS
Definition: precomp.h:26
USHORT VendorId
Definition: isapnphw.h:100
static VOID WriteCsn(_In_ UCHAR Csn)
Definition: hardware.c:176
#define LENGTH_TO_RANGE_LENGTH(Length)
Definition: isapnphw.h:79
static NTSTATUS ReadTags(_In_ PUCHAR ReadDataPort, _Out_writes_(ISAPNP_MAX_RESOURCEDATA) PUCHAR Buffer, _In_ ULONG MaxLength, _Out_ PUSHORT MaxLogDev)
Definition: hardware.c:449
static ULONG ReadDoubleWord(_In_ PUCHAR ReadDataPort, _In_ UCHAR Address)
Definition: hardware.c:113
static UCHAR PeekByte(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:350
#define ISAPNP_DMACHANNEL(n)
Definition: isapnphw.h:43
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt(IN PDEVICE_OBJECT DeviceObject)
Definition: usbhub.c:133
#define ISAPNP_CONFIGCONTROL
Definition: isapnphw.h:21
static VOID WriteLogicalDeviceNumber(_In_ UCHAR LogDev)
Definition: hardware.c:185
#define MEMRANGE_32_BIT_MEMORY_ONLY
Definition: isapnphw.h:72
static VOID IsaPnpExtractAscii(_Out_writes_all_(3) PUCHAR Buffer, _In_ USHORT CompressedData)
Definition: hardware.c:435
static VOID SetReadDataPort(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:124
ISAPNP_IO Io[8]
Definition: isapnp.h:126
static const WCHAR Description[]
Definition: oid.c:1266
#define MEMRANGE_16_BIT_MEMORY_MASK
Definition: isapnphw.h:71
#define InsertTailList(ListHead, Entry)
BOOLEAN FindMemoryDescriptor(_In_ PISAPNP_LOGICAL_DEVICE LogDevice, _In_ ULONG RangeStart, _In_ ULONG RangeEnd, _Out_opt_ PBOOLEAN Memory32, _Out_opt_ PUCHAR Information, _Out_opt_ PUCHAR WriteOrder)
Definition: isapnp.c:695
#define ISAPNP_ACTIVATE
Definition: isapnphw.h:28
USHORT ProdId
Definition: isapnphw.h:94
#define ISAPNP_STATUS
Definition: isapnphw.h:24
#define ISAPNP_READPORT
Definition: isapnphw.h:19
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1044
#define CmResourceTypePort
Definition: hwresource.cpp:123
#define ISAPNP_WAKE
Definition: isapnphw.h:22
static UCHAR NextLFSR(_In_ UCHAR Lfsr, _In_ UCHAR InputBit)
Definition: hardware.c:319
static UCHAR ReadStatus(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:167
FORCEINLINE BOOLEAN HasDmaAlternatives(_In_ PISAPNP_ALTERNATIVES Alternatives)
Definition: isapnp.h:258
static VOID WriteByte(_In_ UCHAR Address, _In_ UCHAR Value)
Definition: hardware.c:56
static VOID WriteAddress(_In_ UCHAR Address)
Definition: hardware.c:29
uint32_t ULONG_PTR
Definition: typedefs.h:65
Definition: isapnp.h:76
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
#define ISAPNP_TAG_ANSISTR
Definition: isapnphw.h:73
NTSTATUS IsaHwConfigureDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice, _In_ PCM_RESOURCE_LIST Resources)
Definition: hardware.c:1603
_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice
Definition: isapnp.h:399
#define ISAPNP_TAG_FIXEDIO
Definition: isapnphw.h:65
#define MEMORY_USE_32_BIT_DECODER
Definition: isapnphw.h:36
#define STATUS_INVALID_PARAMETER_3
Definition: ntstatus.h:477
#define FALSE
Definition: types.h:117
#define ANSI_NULL
#define ISAPNP_MEMCONTROL32(n)
Definition: isapnphw.h:45
#define ISAPNP_IRQNO(n)
Definition: isapnphw.h:39
static VOID PeekCached(_In_reads_bytes_(Length) PUCHAR ResourceData, _Out_writes_bytes_all_(Length) PVOID Buffer, _In_ USHORT Length)
Definition: hardware.c:392
static UCHAR ReadDmaChannel(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:249
#define IRQTYPE_LOW_LEVEL
Definition: isapnphw.h:41
COMMON_DEVICE_EXTENSION Common
Definition: usbhub.h:204
static UCHAR IsaPnpChecksum(_In_ PISAPNP_IDENTIFIER Identifier)
Definition: hardware.c:410
PVOID DeviceExtension
Definition: env_spec_w32.h:418
#define ISAPNP_LFSR_SEED
Definition: isapnphw.h:52
unsigned char BOOLEAN
static VOID ActivateDevice(_In_ PUCHAR ReadDataPort, _In_ UCHAR LogDev)
Definition: hardware.c:194
#define ISAPNP_MAX_RESOURCEDATA
Maximum size of resource data structure supported by the driver.
Definition: isapnp.h:27
static WCHAR Address[46]
Definition: ping.c:68
#define STATUS_INVALID_PARAMETER_2
Definition: ntstatus.h:476
#define _Out_writes_bytes_all_(size)
Definition: ms_sal.h:362
#define _In_
Definition: ms_sal.h:308
static VOID SendKey(VOID)
Definition: hardware.c:332
static VOID WriteDoubleWord(_In_ UCHAR Address, _In_ ULONG Value)
Definition: hardware.c:80
#define ISAPNP_ADDRESS
Definition: isapnphw.h:16
Definition: bufpool.h:45
PDEVICE_OBJECT Pdo
Definition: isapnp.h:103
static ULONG ReadMemoryLimit32(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:309
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:406
static VOID WriteResources(_In_ PUCHAR ReadDataPort, _In_ PISAPNP_LOGICAL_DEVICE LogDevice, _In_ PCM_PARTIAL_RESOURCE_LIST PartialResourceList)
Definition: hardware.c:1194
Status
Definition: gdiplustypes.h:24
USHORT VendorId
Definition: isapnphw.h:93
#define ISAPNP_LOGICALDEVICENUMBER
Definition: isapnphw.h:26
#define MEMORY_USE_8_BIT_DECODER
Definition: isapnphw.h:34
static VOID WriteData(_In_ UCHAR Data)
Definition: hardware.c:38
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MEMORY_UPPER_LIMIT
Definition: isapnphw.h:33
_In_ WDFCOLLECTION _In_ ULONG Index
#define ISAPNP_TAG_IRQ
Definition: isapnphw.h:60
LIST_ENTRY IdLink
Definition: isapnp.h:80
static NTSTATUS ParseTags(_In_ PUCHAR ResourceData, _In_ USHORT LogDevToParse, _Inout_ PISAPNP_LOGICAL_DEVICE LogDevice)
Definition: hardware.c:555
#define IRQTYPE_HIGH_EDGE
Definition: isapnphw.h:42
static UCHAR ReadResourceData(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:158
#define ISAPNP_SMALL_TAG_LEN(t)
Definition: isapnphw.h:56
#define ISAPNP_MEMBASE(n)
Definition: isapnphw.h:31
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
LIST_ENTRY DeviceLink
Definition: isapnp.h:138
#define ISAPNP_TAG_LOGDEVID
Definition: isapnphw.h:58
BOOLEAN FindDmaDescriptor(_In_ PISAPNP_LOGICAL_DEVICE LogDevice, _In_ ULONG Channel, _Out_opt_ PUCHAR WriteOrder)
Definition: isapnp.c:639
static UCHAR ReadMemoryControl32(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:299
unsigned char UCHAR
Definition: xmlstorage.h:181
#define STATUS_RESOURCE_DATA_NOT_FOUND
Definition: ntstatus.h:373
#define ISAPNP_MEMLIMIT(n)
Definition: isapnphw.h:37
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21
_Requires_lock_held_(FdoExt->DeviceSyncEvent) NTSTATUS IsaHwFillDeviceList(_In_ PISAPNP_FDO_EXTENSION FdoExt)
Definition: hardware.c:1460
static USHORT ReadWord(_In_ PUCHAR ReadDataPort, _In_ UCHAR Address)
Definition: hardware.c:102
#define VOID
Definition: acefi.h:82
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:475
#define ISAPNP_TAG_MEM32RANGE
Definition: isapnphw.h:75
Definition: typedefs.h:119
static UCHAR ReadData(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:47
static BOOLEAN ReadCurrentResources(_In_ PUCHAR ReadDataPort, _Inout_ PISAPNP_LOGICAL_DEVICE LogDevice)
Definition: hardware.c:1105
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4061
LIST_ENTRY CompatibleIdList
Definition: isapnp.h:122
USHORT ProdId
Definition: isapnp.h:79
static UCHAR ReadByte(_In_ PUCHAR ReadDataPort, _In_ UCHAR Address)
Definition: hardware.c:91
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define ISAPNP_MEMLIMIT32(n)
Definition: isapnphw.h:46
ISAPNP_DMA Dma[2]
Definition: isapnp.h:128
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ISAPNP_TAG_ENDDEP
Definition: isapnphw.h:63
unsigned short USHORT
Definition: pedump.c:61
#define ISAPNP_MAX_ALTERNATIVES
Maximum number of Start DF tags supported by the driver.
Definition: isapnp.h:30
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
static VOID DeactivateDevice(_In_ UCHAR LogDev)
Definition: hardware.c:209
#define ISAPNP_TAG_FIXEDMEM32RANGE
Definition: isapnphw.h:76
signed char * PSTR
Definition: retypes.h:7
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
static USHORT ReadMemoryBase(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:259
#define NULL
Definition: types.h:112
#define ISAPNP_TAG_STARTDEP
Definition: isapnphw.h:62
#define __drv_freesMem(kind)
Definition: driverspecs.h:271
#define CmResourceTypeInterrupt
Definition: hwresource.cpp:124
#define ISAPNP_IOBASE(n)
Definition: isapnphw.h:38
ISAPNP_MEMRANGE MemRange[4]
Definition: isapnp.h:129
#define DPRINT1
Definition: precomp.h:8
unsigned char Byte
Definition: zlib.h:37
#define ISAPNP_TAG_DMA
Definition: isapnphw.h:61
#define CM_RESOURCE_INTERRUPT_LATCHED
Definition: cmtypes.h:144
static VOID Peek(_In_ PUCHAR ReadDataPort, _Out_writes_bytes_all_opt_(Length) PVOID Buffer, _In_ USHORT Length)
Definition: hardware.c:371
#define ISAPNP_IORANGECHECK
Definition: isapnphw.h:29
#define MEMORY_USE_16_BIT_DECODER
Definition: isapnphw.h:35
static ULONG ReadMemoryBase32(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:289
#define _Out_writes_all_(size)
Definition: ms_sal.h:357
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ISAPNP_SERIALISOLATION
Definition: isapnphw.h:20
#define ISAPNP_RESOURCEDATA
Definition: isapnphw.h:23
static VOID Wake(_In_ UCHAR Csn)
Definition: hardware.c:149
UCHAR IsaHwTryReadDataPort(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:1362
#define STATUS_SUCCESS
Definition: shellext.h:65
static VOID EnterIsolationState(VOID)
Definition: hardware.c:133
FORCEINLINE BOOLEAN HasMemory32Alternatives(_In_ PISAPNP_ALTERNATIVES Alternatives)
Definition: isapnp.h:274
#define DPRINT
Definition: sndvol32.h:71
#define ISAPNP_TAG_MEMRANGE
Definition: isapnphw.h:70
#define ISAPNP_MEMCONTROL(n)
Definition: isapnphw.h:32
#define CmResourceTypeMemory
Definition: hwresource.cpp:125
#define STATUS_INVALID_PARAMETER_4
Definition: ntstatus.h:478
#define ISAPNP_WRITE_DATA
Definition: isapnphw.h:17
UCHAR VendorId[3]
Definition: isapnp.h:78
#define RTL_BITS_OF(sizeOfArg)
Definition: ntbasedef.h:668
#define __FUNCTION__
Definition: types.h:112
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
static CODE_SEG("PAGE")
Definition: isapnp.c:1482
#define ISAPNP_TAG_IOPORT
Definition: isapnphw.h:64
unsigned short * PUSHORT
Definition: retypes.h:2
static VOID WaitForKey(VOID)
Definition: hardware.c:141
VOID NTAPI KeStallExecutionProcessor(IN ULONG MicroSeconds)
Definition: ntoskrnl.c:96
base of all file and directory entries
Definition: entries.h:82
#define ISAPNP_LARGE_TAG_NAME(t)
Definition: isapnphw.h:69
#define ISAPNP_CARDSELECTNUMBER
Definition: isapnphw.h:25
#define ISAPNP_HAS_MULTIPLE_LOGDEVS
Indicates if the parent card has multiple logical devices.
Definition: isapnp.h:135
#define ISAPNP_IRQTYPE(n)
Definition: isapnphw.h:40
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
static UCHAR ReadIrqNo(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:229
static UCHAR ReadMemoryControl(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:269
#define CmResourceTypeDma
Definition: hwresource.cpp:126
static USHORT ReadIoBase(_In_ PUCHAR ReadDataPort, _In_ UCHAR Index)
Definition: hardware.c:219
#define ISAPNP_MEMBASE32(n)
Definition: isapnphw.h:44
#define TAG_ISAPNP
Definition: isapnp.h:24
static VOID FreeLogicalDevice(_In_ __drv_freesMem(Mem) PISAPNP_LOGICAL_DEVICE LogDevice)
Definition: hardware.c:523
#define PAGED_CODE()
#define _Out_writes_bytes_all_opt_(size)
Definition: ms_sal.h:363
#define _In_reads_bytes_(size)
Definition: ms_sal.h:321
#define RANGE_LENGTH_TO_LENGTH(RangeLength)
Definition: isapnphw.h:78
FORCEINLINE BOOLEAN HasIrqAlternatives(_In_ PISAPNP_ALTERNATIVES Alternatives)
Definition: isapnp.h:250
FORCEINLINE BOOLEAN HasMemoryAlternatives(_In_ PISAPNP_ALTERNATIVES Alternatives)
Definition: isapnp.h:266
#define _Out_writes_(size)
Definition: ms_sal.h:348
ISAPNP_IRQ Irq[2]
Definition: isapnp.h:127
#define ISAPNP_TAG_END
Definition: isapnphw.h:66