|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: deteisa.c ! 8: ! 9: Abstract: ! 10: ! 11: This is the main file for the autodetection DLL for all the EISA adapters ! 12: which MS is shipping with Windows NT. ! 13: ! 14: ! 15: --*/ ! 16: ! 17: #include <ntddk.h> ! 18: #include <ntddnetd.h> ! 19: ! 20: #include <windef.h> ! 21: #include <winerror.h> ! 22: ! 23: #include <stdio.h> ! 24: #include <stdlib.h> ! 25: #include <string.h> ! 26: #include "detect.h" ! 27: ! 28: ! 29: // Prototype "borrowed" from WINUSER.H ! 30: extern int WINAPIV wsprintfW(LPWSTR, LPCWSTR, ...); ! 31: // Prototype "borrowed" from WINBASE.H ! 32: VOID WINAPI Sleep( DWORD dwMilliseconds ); ! 33: ! 34: // ! 35: // Individual card detection routines ! 36: // ! 37: ! 38: ! 39: // ! 40: // Helper functions ! 41: // ! 42: ! 43: ULONG ! 44: FindEisaCard( ! 45: IN ULONG AdapterNumber, ! 46: IN ULONG BusNumber, ! 47: IN BOOLEAN First, ! 48: IN ULONG CompressedId, ! 49: OUT PULONG Confidence ! 50: ); ! 51: ! 52: #ifdef WORKAROUND ! 53: ! 54: UCHAR EisaFirstTime = 1; ! 55: ! 56: // ! 57: // List of all the adapters supported in this file, this cannot be > 256 ! 58: // because of the way tokens are generated. ! 59: // ! 60: // ! 61: // NOTE : If you change the index of an adapter, be sure the change it in ! 62: // EisaQueryCfgHandler(), EisaFirstNextHandler() and EisaVerifyCfgHandler() as ! 63: // well! ! 64: // ! 65: ! 66: static ADAPTER_INFO Adapters[] = { ! 67: ! 68: { ! 69: 1000, ! 70: L"NE3200", ! 71: L"SLOTNUMBER 1 100 ", ! 72: NULL, ! 73: 999 ! 74: ! 75: }, ! 76: ! 77: { ! 78: 1100, ! 79: L"DEC422", ! 80: L"SLOTNUMBER 1 100 ", ! 81: NULL, ! 82: 999 ! 83: ! 84: }, ! 85: ! 86: { ! 87: 1200, ! 88: L"P1990", ! 89: L"SLOTNUMBER 1 100 ", ! 90: NULL, ! 91: 999 ! 92: ! 93: }, ! 94: ! 95: { ! 96: 1300, ! 97: L"NETFLX", ! 98: L"SLOTNUMBER 1 100 ", ! 99: NULL, ! 100: 999 ! 101: ! 102: }, ! 103: ! 104: { ! 105: 1400, ! 106: L"CPQTOK", ! 107: L"SLOTNUMBER 1 100 ", ! 108: NULL, ! 109: 999 ! 110: ! 111: } ! 112: }; ! 113: ! 114: #else ! 115: ! 116: // ! 117: // List of all the adapters supported in this file, this cannot be > 256 ! 118: // because of the way tokens are generated. ! 119: // ! 120: // ! 121: // NOTE : If you change the index of an adapter, be sure the change it in ! 122: // EisaQueryCfgHandler(), EisaFirstNextHandler() and EisaVerifyCfgHandler() as ! 123: // well! ! 124: // ! 125: ! 126: static ADAPTER_INFO Adapters[] = { ! 127: ! 128: { ! 129: 1000, ! 130: L"NE3200", ! 131: L"SLOTNUMBER\0001\000100\0", ! 132: NULL, ! 133: 999 ! 134: ! 135: }, ! 136: ! 137: { ! 138: 1100, ! 139: L"DEC422", ! 140: L"SLOTNUMBER\0001\000100\0", ! 141: NULL, ! 142: 999 ! 143: ! 144: }, ! 145: ! 146: { ! 147: 1200, ! 148: L"P1990", ! 149: L"SLOTNUMBER\0001\000100\0", ! 150: NULL, ! 151: 999 ! 152: ! 153: }, ! 154: ! 155: { ! 156: 1300, ! 157: L"NETFLEX", ! 158: L"SLOTNUMBER\0001\000100\0", ! 159: NULL, ! 160: 999 ! 161: ! 162: }, ! 163: ! 164: { ! 165: 1400, ! 166: L"CPQTOK", ! 167: L"SLOTNUMBER\0001\000100\0", ! 168: NULL, ! 169: 999 ! 170: ! 171: } ! 172: ! 173: }; ! 174: ! 175: #endif ! 176: ! 177: // ! 178: // Structure for holding state of a search ! 179: // ! 180: ! 181: typedef struct _SEARCH_STATE { ! 182: ! 183: ULONG SlotNumber; ! 184: ! 185: } SEARCH_STATE, *PSEARCH_STATE; ! 186: ! 187: ! 188: // ! 189: // This is an array of search states. We need one state for each type ! 190: // of adapter supported. ! 191: // ! 192: ! 193: static SEARCH_STATE SearchStates[sizeof(Adapters) / sizeof(ADAPTER_INFO)] = {0}; ! 194: ! 195: ! 196: // ! 197: // Structure for holding a particular adapter's complete information ! 198: // ! 199: typedef struct _EISA_ADAPTER { ! 200: ! 201: LONG CardType; ! 202: INTERFACE_TYPE InterfaceType; ! 203: ULONG BusNumber; ! 204: ULONG SlotNumber; ! 205: ! 206: } EISA_ADAPTER, *PEISA_ADAPTER; ! 207: ! 208: ! 209: extern ! 210: LONG ! 211: EisaIdentifyHandler( ! 212: IN LONG Index, ! 213: IN WCHAR * Buffer, ! 214: IN LONG BuffSize ! 215: ) ! 216: ! 217: /*++ ! 218: ! 219: Routine Description: ! 220: ! 221: This routine returns information about the netcards supported by ! 222: this file. ! 223: ! 224: Arguments: ! 225: ! 226: Index - The index of the netcard being address. The first ! 227: cards information is at index 1000, the second at 1100, etc. ! 228: ! 229: Buffer - Buffer to store the result into. ! 230: ! 231: BuffSize - Number of bytes in Buffer ! 232: ! 233: Return Value: ! 234: ! 235: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 236: ! 237: --*/ ! 238: ! 239: ! 240: { ! 241: LONG NumberOfAdapters; ! 242: LONG Code = Index % 100; ! 243: LONG Length; ! 244: LONG i; ! 245: ! 246: NumberOfAdapters = sizeof(Adapters) / sizeof(ADAPTER_INFO); ! 247: ! 248: #ifdef WORKAROUND ! 249: ! 250: // ! 251: // We need to convert unicode spaces into unicode NULLs. ! 252: // ! 253: ! 254: if (EisaFirstTime) { ! 255: ! 256: EisaFirstTime = 0; ! 257: ! 258: for (i = 0; i < NumberOfAdapters; i++) { ! 259: ! 260: Length = UnicodeStrLen(Adapters[i].Parameters); ! 261: ! 262: for (; Length > 0; Length--) { ! 263: ! 264: if (Adapters[i].Parameters[Length] == L' ') { ! 265: ! 266: Adapters[i].Parameters[Length] = UNICODE_NULL; ! 267: ! 268: } ! 269: ! 270: } ! 271: ! 272: } ! 273: ! 274: } ! 275: ! 276: #endif ! 277: ! 278: Index = Index - Code; ! 279: ! 280: if (((Index / 100) - 10) < NumberOfAdapters) { ! 281: ! 282: // ! 283: // Find the correct adapter ID ! 284: // ! 285: ! 286: for (i=0; i < NumberOfAdapters; i++) { ! 287: ! 288: if (Adapters[i].Index == Index) { ! 289: ! 290: switch (Code) { ! 291: ! 292: case 0: ! 293: ! 294: // ! 295: // Find the string length ! 296: // ! 297: ! 298: Length = UnicodeStrLen(Adapters[i].InfId); ! 299: ! 300: Length ++; ! 301: ! 302: if (BuffSize < Length) { ! 303: ! 304: return(ERROR_INSUFFICIENT_BUFFER); ! 305: ! 306: } ! 307: ! 308: memcpy((PVOID)Buffer, Adapters[i].InfId, Length * sizeof(WCHAR)); ! 309: break; ! 310: ! 311: case 3: ! 312: ! 313: // ! 314: // Maximum value is 1000 ! 315: // ! 316: ! 317: if (BuffSize < 5) { ! 318: ! 319: return(ERROR_INSUFFICIENT_BUFFER); ! 320: ! 321: } ! 322: ! 323: wsprintfW((PVOID)Buffer, L"%d", Adapters[i].SearchOrder); ! 324: ! 325: break; ! 326: ! 327: default: ! 328: ! 329: return(ERROR_INVALID_PARAMETER); ! 330: ! 331: } ! 332: ! 333: return(0); ! 334: ! 335: } ! 336: ! 337: } ! 338: ! 339: return(ERROR_INVALID_PARAMETER); ! 340: ! 341: } ! 342: ! 343: return(ERROR_NO_MORE_ITEMS); ! 344: ! 345: } ! 346: ! 347: ! 348: extern ! 349: LONG ! 350: EisaFirstNextHandler( ! 351: IN LONG NetcardId, ! 352: IN INTERFACE_TYPE InterfaceType, ! 353: IN ULONG BusNumber, ! 354: IN BOOL First, ! 355: OUT PVOID *Token, ! 356: OUT LONG *Confidence ! 357: ) ! 358: ! 359: /*++ ! 360: ! 361: Routine Description: ! 362: ! 363: This routine finds the instances of a physical adapter identified ! 364: by the NetcardId. ! 365: ! 366: Arguments: ! 367: ! 368: NetcardId - The index of the netcard being address. The first ! 369: cards information is id 1000, the second id 1100, etc. ! 370: ! 371: InterfaceType - Microchannel ! 372: ! 373: BusNumber - The bus number of the bus to search. ! 374: ! 375: First - TRUE is we are to search for the first instance of an ! 376: adapter, FALSE if we are to continue search from a previous stopping ! 377: point. ! 378: ! 379: Token - A pointer to a handle to return to identify the found ! 380: instance ! 381: ! 382: Confidence - A pointer to a long for storing the confidence factor ! 383: that the card exists. ! 384: ! 385: Return Value: ! 386: ! 387: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 388: ! 389: --*/ ! 390: ! 391: { ! 392: ULONG CompressedId; ! 393: ULONG ReturnValue; ! 394: ! 395: if (InterfaceType != Eisa) { ! 396: ! 397: *Confidence = 0; ! 398: return(0); ! 399: ! 400: } ! 401: ! 402: // ! 403: // Get CompressedId ! 404: // ! 405: ! 406: switch (NetcardId) { ! 407: ! 408: // ! 409: // NE3200 ! 410: // ! 411: ! 412: case 1000: ! 413: ! 414: CompressedId = 0x07CC3A; ! 415: break; ! 416: ! 417: // ! 418: // DEC422 ! 419: // ! 420: ! 421: case 1100: ! 422: ! 423: CompressedId = 0x42A310; ! 424: break; ! 425: ! 426: // ! 427: // PROTEON 1990 ! 428: // ! 429: ! 430: case 1200: ! 431: ! 432: CompressedId = 0x604F42; ! 433: break; ! 434: ! 435: // ! 436: // NET FLEX ! 437: // ! 438: ! 439: case 1300: ! 440: ! 441: CompressedId = 0x61110E; ! 442: break; ! 443: ! 444: // ! 445: // COMPAQ Jupiter board ! 446: // ! 447: ! 448: case 1400: ! 449: ! 450: CompressedId = 0x60110E; ! 451: break; ! 452: ! 453: default: ! 454: ! 455: return(ERROR_INVALID_PARAMETER); ! 456: ! 457: } ! 458: ! 459: // ! 460: // Call FindFirst Routine ! 461: // ! 462: ! 463: ReturnValue = FindEisaCard( ! 464: (ULONG)((NetcardId - 1000) / 100), ! 465: BusNumber, ! 466: (BOOLEAN)First, ! 467: CompressedId, ! 468: Confidence ! 469: ); ! 470: ! 471: if (ReturnValue == 0) { ! 472: ! 473: // ! 474: // In this module I use the token as follows: Remember that ! 475: // the token can only be 2 bytes long (the low 2) because of ! 476: // the interface to the upper part of this DLL. ! 477: // ! 478: // The rest of the high byte is the the bus number. ! 479: // The low byte is the driver index number into Adapters. ! 480: // ! 481: // NOTE: This presumes that there are < 129 buses in the ! 482: // system. Is this reasonable? ! 483: // ! 484: ! 485: *Token = (PVOID)((BusNumber & 0x7F) << 8); ! 486: ! 487: *Token = (PVOID)(((ULONG)*Token) | ((NetcardId - 1000) / 100)); ! 488: ! 489: } ! 490: ! 491: return(ReturnValue); ! 492: ! 493: } ! 494: ! 495: extern ! 496: LONG ! 497: EisaOpenHandleHandler( ! 498: IN PVOID Token, ! 499: OUT PVOID *Handle ! 500: ) ! 501: ! 502: /*++ ! 503: ! 504: Routine Description: ! 505: ! 506: This routine takes a token returned by FirstNext and converts it ! 507: into a permanent handle. ! 508: ! 509: Arguments: ! 510: ! 511: Token - The token. ! 512: ! 513: Handle - A pointer to the handle, so we can store the resulting ! 514: handle. ! 515: ! 516: Return Value: ! 517: ! 518: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 519: ! 520: --*/ ! 521: ! 522: { ! 523: PEISA_ADAPTER Adapter; ! 524: LONG AdapterNumber; ! 525: ULONG BusNumber; ! 526: INTERFACE_TYPE InterfaceType; ! 527: ! 528: // ! 529: // Get info from the token ! 530: // ! 531: ! 532: InterfaceType = Eisa; ! 533: ! 534: BusNumber = (ULONG)(((ULONG)Token >> 8) & 0x7F); ! 535: ! 536: AdapterNumber = ((ULONG)Token) & 0xFF; ! 537: ! 538: // ! 539: // Store information ! 540: // ! 541: ! 542: Adapter = (PEISA_ADAPTER)DetectAllocateHeap( ! 543: sizeof(EISA_ADAPTER) ! 544: ); ! 545: ! 546: if (Adapter == NULL) { ! 547: ! 548: return(ERROR_NOT_ENOUGH_MEMORY); ! 549: ! 550: } ! 551: ! 552: // ! 553: // Copy across address ! 554: // ! 555: ! 556: Adapter->SlotNumber = SearchStates[(ULONG)AdapterNumber].SlotNumber; ! 557: Adapter->CardType = Adapters[AdapterNumber].Index; ! 558: Adapter->InterfaceType = InterfaceType; ! 559: Adapter->BusNumber = BusNumber; ! 560: ! 561: *Handle = (PVOID)Adapter; ! 562: ! 563: return(0); ! 564: } ! 565: ! 566: LONG ! 567: EisaCreateHandleHandler( ! 568: IN LONG NetcardId, ! 569: IN INTERFACE_TYPE InterfaceType, ! 570: IN ULONG BusNumber, ! 571: OUT PVOID *Handle ! 572: ) ! 573: ! 574: /*++ ! 575: ! 576: Routine Description: ! 577: ! 578: This routine is used to force the creation of a handle for cases ! 579: where a card is not found via FirstNext, but the user says it does ! 580: exist. ! 581: ! 582: Arguments: ! 583: ! 584: NetcardId - The id of the card to create the handle for. ! 585: ! 586: InterfaceType - Microchannel ! 587: ! 588: BusNumber - The bus number of the bus in the system. ! 589: ! 590: Handle - A pointer to the handle, for storing the resulting handle. ! 591: ! 592: Return Value: ! 593: ! 594: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 595: ! 596: --*/ ! 597: ! 598: { ! 599: PEISA_ADAPTER Adapter; ! 600: LONG NumberOfAdapters; ! 601: LONG i; ! 602: ! 603: if (InterfaceType != Eisa) { ! 604: ! 605: return(ERROR_INVALID_PARAMETER); ! 606: ! 607: } ! 608: ! 609: NumberOfAdapters = sizeof(Adapters) / sizeof(ADAPTER_INFO); ! 610: ! 611: for (i=0; i < NumberOfAdapters; i++) { ! 612: ! 613: if (Adapters[i].Index == NetcardId) { ! 614: ! 615: // ! 616: // Store information ! 617: // ! 618: ! 619: Adapter = (PEISA_ADAPTER)DetectAllocateHeap( ! 620: sizeof(EISA_ADAPTER) ! 621: ); ! 622: ! 623: if (Adapter == NULL) { ! 624: ! 625: return(ERROR_NOT_ENOUGH_MEMORY); ! 626: ! 627: } ! 628: ! 629: // ! 630: // Copy across memory address ! 631: // ! 632: ! 633: Adapter->SlotNumber = 1; ! 634: Adapter->CardType = NetcardId; ! 635: Adapter->InterfaceType = InterfaceType; ! 636: Adapter->BusNumber = BusNumber; ! 637: ! 638: *Handle = (PVOID)Adapter; ! 639: ! 640: return(0); ! 641: ! 642: } ! 643: ! 644: } ! 645: ! 646: return(ERROR_INVALID_PARAMETER); ! 647: } ! 648: ! 649: extern ! 650: LONG ! 651: EisaCloseHandleHandler( ! 652: IN PVOID Handle ! 653: ) ! 654: ! 655: /*++ ! 656: ! 657: Routine Description: ! 658: ! 659: This frees any resources associated with a handle. ! 660: ! 661: Arguments: ! 662: ! 663: Handle - The handle. ! 664: ! 665: Return Value: ! 666: ! 667: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 668: ! 669: --*/ ! 670: ! 671: { ! 672: DetectFreeHeap(Handle); ! 673: ! 674: return(0); ! 675: } ! 676: ! 677: LONG ! 678: EisaQueryCfgHandler( ! 679: IN PVOID Handle, ! 680: OUT WCHAR *Buffer, ! 681: IN LONG BuffSize ! 682: ) ! 683: ! 684: /*++ ! 685: ! 686: Routine Description: ! 687: ! 688: This routine calls the appropriate driver's query config handler to ! 689: get the parameters for the adapter associated with the handle. ! 690: ! 691: Arguments: ! 692: ! 693: Handle - The handle. ! 694: ! 695: Buffer - The resulting parameter list. ! 696: ! 697: BuffSize - Length of the given buffer in WCHARs. ! 698: ! 699: Return Value: ! 700: ! 701: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 702: ! 703: --*/ ! 704: ! 705: { ! 706: PEISA_ADAPTER Adapter = (PEISA_ADAPTER)(Handle); ! 707: LONG OutputLengthLeft = BuffSize; ! 708: LONG CopyLength; ! 709: ULONG CompressedId; ! 710: PVOID BusHandle; ! 711: ULONG ReturnValue; ! 712: ULONG Confidence; ! 713: ! 714: ULONG StartPointer = (ULONG)Buffer; ! 715: ! 716: if (Adapter->InterfaceType != Eisa) { ! 717: ! 718: return(ERROR_INVALID_PARAMETER); ! 719: ! 720: } ! 721: ! 722: // ! 723: // Verify the SlotNumber ! 724: // ! 725: ! 726: if (!GetEisaKey(Adapter->BusNumber, &BusHandle)) { ! 727: ! 728: return(ERROR_INVALID_PARAMETER); ! 729: ! 730: } ! 731: ! 732: if (!GetEisaCompressedId( ! 733: BusHandle, ! 734: Adapter->SlotNumber, ! 735: &CompressedId ! 736: )) { ! 737: ! 738: // ! 739: // Fail ! 740: // ! 741: ! 742: return(ERROR_INVALID_PARAMETER); ! 743: ! 744: } ! 745: ! 746: // ! 747: // Verify ID ! 748: // ! 749: ! 750: ReturnValue = ERROR_INVALID_PARAMETER; ! 751: ! 752: switch (Adapter->CardType) { ! 753: ! 754: // ! 755: // NE3200 ! 756: // ! 757: ! 758: case 1000: ! 759: ! 760: if (CompressedId == 0x07CC3A) { ! 761: ! 762: ReturnValue = 0; ! 763: ! 764: } else { ! 765: ! 766: CompressedId = 0x07CC3A; ! 767: ! 768: } ! 769: break; ! 770: ! 771: // ! 772: // DEC422 ! 773: // ! 774: ! 775: case 1100: ! 776: ! 777: if (CompressedId == 0x42A310) { ! 778: ! 779: ReturnValue = 0; ! 780: ! 781: } else { ! 782: ! 783: CompressedId = 0x42A310; ! 784: ! 785: } ! 786: break; ! 787: ! 788: // ! 789: // PROTEON 1990 ! 790: // ! 791: ! 792: case 1200: ! 793: ! 794: if (CompressedId == 0x604F42) { ! 795: ! 796: ReturnValue = 0; ! 797: ! 798: } else { ! 799: ! 800: CompressedId = 0x604F42; ! 801: ! 802: } ! 803: break; ! 804: ! 805: // ! 806: // NET FLEX ! 807: // ! 808: ! 809: case 1300: ! 810: ! 811: if (CompressedId == 0x61110E) { ! 812: ! 813: ReturnValue = 0; ! 814: ! 815: } else { ! 816: ! 817: CompressedId = 0x61110E; ! 818: ! 819: } ! 820: break; ! 821: ! 822: // ! 823: // COMPAQ Jupiter board ! 824: // ! 825: ! 826: case 1400: ! 827: ! 828: if (CompressedId == 0x60110E) { ! 829: ! 830: ReturnValue = 0; ! 831: ! 832: } else { ! 833: ! 834: CompressedId = 0x60110E; ! 835: ! 836: } ! 837: break; ! 838: ! 839: default: ! 840: ! 841: return(ERROR_INVALID_PARAMETER); ! 842: ! 843: } ! 844: ! 845: ! 846: if (ReturnValue != 0) { ! 847: ! 848: // ! 849: // Try to find it in another slot ! 850: // ! 851: ! 852: ReturnValue = FindEisaCard( ! 853: Adapter->CardType, ! 854: Adapter->BusNumber, ! 855: TRUE, ! 856: CompressedId, ! 857: &Confidence ! 858: ); ! 859: ! 860: if (Confidence != 100) { ! 861: ! 862: // ! 863: // Confidence is not absolute -- we are out of here. ! 864: // ! 865: ! 866: return(ERROR_INVALID_PARAMETER); ! 867: ! 868: } ! 869: ! 870: Adapter->SlotNumber = SearchStates[(ULONG)Adapter->CardType].SlotNumber; ! 871: ! 872: } ! 873: ! 874: // ! 875: // Build resulting buffer ! 876: // ! 877: ! 878: // ! 879: // Put in SlotNumber ! 880: // ! 881: ! 882: // ! 883: // Copy in the title string ! 884: // ! 885: ! 886: CopyLength = UnicodeStrLen(SlotNumberString) + 1; ! 887: ! 888: if (OutputLengthLeft < CopyLength) { ! 889: ! 890: return(ERROR_INSUFFICIENT_BUFFER); ! 891: ! 892: } ! 893: ! 894: memcpy((PVOID)Buffer, ! 895: (PVOID)SlotNumberString, ! 896: (CopyLength * sizeof(WCHAR)) ! 897: ); ! 898: ! 899: Buffer = &(Buffer[CopyLength]); ! 900: OutputLengthLeft -= CopyLength; ! 901: ! 902: // ! 903: // Copy in the value ! 904: // ! 905: ! 906: if (OutputLengthLeft < 8) { ! 907: ! 908: return(ERROR_INSUFFICIENT_BUFFER); ! 909: ! 910: } ! 911: ! 912: CopyLength = wsprintfW(Buffer,L"0x%x",(ULONG)(Adapter->SlotNumber)); ! 913: ! 914: if (CopyLength < 0) { ! 915: ! 916: return(ERROR_INSUFFICIENT_BUFFER); ! 917: ! 918: } ! 919: ! 920: CopyLength++; // Add in the \0 ! 921: ! 922: Buffer = &(Buffer[CopyLength]); ! 923: OutputLengthLeft -= CopyLength; ! 924: ! 925: // ! 926: // Copy in final \0 ! 927: // ! 928: ! 929: if (OutputLengthLeft < 1) { ! 930: ! 931: return(ERROR_INSUFFICIENT_BUFFER); ! 932: ! 933: } ! 934: ! 935: CopyLength = (ULONG)Buffer - StartPointer; ! 936: Buffer[CopyLength] = L'\0'; ! 937: ! 938: return(0); ! 939: } ! 940: ! 941: extern ! 942: LONG ! 943: EisaVerifyCfgHandler( ! 944: IN PVOID Handle, ! 945: IN WCHAR *Buffer ! 946: ) ! 947: ! 948: /*++ ! 949: ! 950: Routine Description: ! 951: ! 952: This routine verifys that a given parameter list is complete and ! 953: correct for the adapter associated with the handle. ! 954: ! 955: Arguments: ! 956: ! 957: Handle - The handle. ! 958: ! 959: Buffer - The parameter list. ! 960: ! 961: Return Value: ! 962: ! 963: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 964: ! 965: --*/ ! 966: ! 967: { ! 968: PEISA_ADAPTER Adapter = (PEISA_ADAPTER)(Handle); ! 969: WCHAR *Place; ! 970: ULONG CompressedId; ! 971: ULONG SlotNumber; ! 972: PVOID BusHandle; ! 973: BOOLEAN Found; ! 974: ! 975: if (Adapter->InterfaceType != Eisa) { ! 976: ! 977: return(ERROR_INVALID_DATA); ! 978: ! 979: } ! 980: ! 981: // ! 982: // Parse out the parameter. ! 983: // ! 984: ! 985: // ! 986: // Get the SlotNumber ! 987: // ! 988: ! 989: Place = FindParameterString(Buffer, SlotNumberString); ! 990: ! 991: if (Place == NULL) { ! 992: ! 993: return(ERROR_INVALID_DATA); ! 994: ! 995: } ! 996: ! 997: Place += UnicodeStrLen(SlotNumberString) + 1; ! 998: ! 999: // ! 1000: // Now parse the thing. ! 1001: // ! 1002: ! 1003: ScanForNumber(Place, &SlotNumber, &Found); ! 1004: ! 1005: if (Found == FALSE) { ! 1006: ! 1007: return(ERROR_INVALID_DATA); ! 1008: ! 1009: } ! 1010: ! 1011: // ! 1012: // Verify the SlotNumber ! 1013: // ! 1014: ! 1015: if (!GetEisaKey(Adapter->BusNumber, &BusHandle)) { ! 1016: ! 1017: return(ERROR_INVALID_DATA); ! 1018: ! 1019: } ! 1020: ! 1021: if (!GetEisaCompressedId( ! 1022: BusHandle, ! 1023: SlotNumber, ! 1024: &CompressedId ! 1025: )) { ! 1026: ! 1027: // ! 1028: // Fail ! 1029: // ! 1030: ! 1031: return(ERROR_INVALID_DATA); ! 1032: ! 1033: } ! 1034: ! 1035: // ! 1036: // Verify ID ! 1037: // ! 1038: ! 1039: switch (Adapter->CardType) { ! 1040: ! 1041: // ! 1042: // NE3200 ! 1043: // ! 1044: ! 1045: case 1000: ! 1046: ! 1047: if (CompressedId != 0x07CC3A) { ! 1048: ! 1049: return(ERROR_INVALID_DATA); ! 1050: ! 1051: } ! 1052: break; ! 1053: ! 1054: // ! 1055: // DEC422 ! 1056: // ! 1057: ! 1058: case 1100: ! 1059: ! 1060: if (CompressedId != 0x42A310) { ! 1061: ! 1062: return(ERROR_INVALID_DATA); ! 1063: ! 1064: } ! 1065: break; ! 1066: ! 1067: // ! 1068: // PROTEON 1990 ! 1069: // ! 1070: ! 1071: case 1200: ! 1072: ! 1073: if (CompressedId != 0x604F42) { ! 1074: ! 1075: return(ERROR_INVALID_DATA); ! 1076: ! 1077: } ! 1078: break; ! 1079: ! 1080: // ! 1081: // NET FLEX ! 1082: // ! 1083: ! 1084: case 1300: ! 1085: ! 1086: if (CompressedId != 0x61110E) { ! 1087: ! 1088: return(ERROR_INVALID_DATA); ! 1089: ! 1090: } ! 1091: break; ! 1092: ! 1093: // ! 1094: // COMPAQ Jupiter Board ! 1095: // ! 1096: ! 1097: case 1400: ! 1098: ! 1099: if (CompressedId != 0x60110E) { ! 1100: ! 1101: return(ERROR_INVALID_DATA); ! 1102: ! 1103: } ! 1104: break; ! 1105: ! 1106: default: ! 1107: ! 1108: return(ERROR_INVALID_DATA); ! 1109: ! 1110: } ! 1111: ! 1112: return(0); ! 1113: ! 1114: } ! 1115: ! 1116: extern ! 1117: LONG ! 1118: EisaQueryMaskHandler( ! 1119: IN LONG NetcardId, ! 1120: OUT WCHAR *Buffer, ! 1121: IN LONG BuffSize ! 1122: ) ! 1123: ! 1124: /*++ ! 1125: ! 1126: Routine Description: ! 1127: ! 1128: This routine returns the parameter list information for a specific ! 1129: network card. ! 1130: ! 1131: Arguments: ! 1132: ! 1133: NetcardId - The id of the desired netcard. ! 1134: ! 1135: Buffer - The buffer for storing the parameter information. ! 1136: ! 1137: BuffSize - Length of Buffer in WCHARs. ! 1138: ! 1139: Return Value: ! 1140: ! 1141: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 1142: ! 1143: --*/ ! 1144: ! 1145: { ! 1146: WCHAR *Result; ! 1147: LONG Length; ! 1148: LONG NumberOfAdapters; ! 1149: LONG i; ! 1150: ! 1151: // ! 1152: // Find the adapter ! 1153: // ! 1154: ! 1155: NumberOfAdapters = sizeof(Adapters) / sizeof(ADAPTER_INFO); ! 1156: ! 1157: for (i=0; i < NumberOfAdapters; i++) { ! 1158: ! 1159: if (Adapters[i].Index == NetcardId) { ! 1160: ! 1161: Result = Adapters[i].Parameters; ! 1162: ! 1163: // ! 1164: // Find the string length (Ends with 2 NULLs) ! 1165: // ! 1166: ! 1167: for (Length=0; ; Length++) { ! 1168: ! 1169: if (Result[Length] == L'\0') { ! 1170: ! 1171: ++Length; ! 1172: ! 1173: if (Result[Length] == L'\0') { ! 1174: ! 1175: break; ! 1176: ! 1177: } ! 1178: ! 1179: } ! 1180: ! 1181: } ! 1182: ! 1183: Length++; ! 1184: ! 1185: if (BuffSize < Length) { ! 1186: ! 1187: return(ERROR_NOT_ENOUGH_MEMORY); ! 1188: ! 1189: } ! 1190: ! 1191: memcpy((PVOID)Buffer, Result, Length * sizeof(WCHAR)); ! 1192: ! 1193: return(0); ! 1194: ! 1195: } ! 1196: ! 1197: } ! 1198: ! 1199: return(ERROR_INVALID_PARAMETER); ! 1200: ! 1201: } ! 1202: ! 1203: extern ! 1204: LONG ! 1205: EisaParamRangeHandler( ! 1206: IN LONG NetcardId, ! 1207: IN WCHAR *Param, ! 1208: OUT LONG *Values, ! 1209: OUT LONG *BuffSize ! 1210: ) ! 1211: ! 1212: /*++ ! 1213: ! 1214: Routine Description: ! 1215: ! 1216: This routine returns a list of valid values for a given parameter name ! 1217: for a given card. ! 1218: ! 1219: Arguments: ! 1220: ! 1221: NetcardId - The Id of the card desired. ! 1222: ! 1223: Param - A WCHAR string of the parameter name to query the values of. ! 1224: ! 1225: Values - A pointer to a list of LONGs into which we store valid values ! 1226: for the parameter. ! 1227: ! 1228: BuffSize - At entry, the length of Values in LONGs. At exit, the ! 1229: number of LONGs stored in Values. ! 1230: ! 1231: Return Value: ! 1232: ! 1233: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 1234: ! 1235: --*/ ! 1236: ! 1237: { ! 1238: ! 1239: *BuffSize = 0; ! 1240: return(0); ! 1241: ! 1242: } ! 1243: ! 1244: extern ! 1245: LONG ! 1246: EisaQueryParameterNameHandler( ! 1247: IN WCHAR *Param, ! 1248: OUT WCHAR *Buffer, ! 1249: IN LONG BufferSize ! 1250: ) ! 1251: ! 1252: /*++ ! 1253: ! 1254: Routine Description: ! 1255: ! 1256: Returns a localized, displayable name for a specific parameter. All the ! 1257: parameters that this file uses are define by MS, so no strings are ! 1258: needed here. ! 1259: ! 1260: Arguments: ! 1261: ! 1262: Param - The parameter to be queried. ! 1263: ! 1264: Buffer - The buffer to store the result into. ! 1265: ! 1266: BufferSize - The length of Buffer in WCHARs. ! 1267: ! 1268: Return Value: ! 1269: ! 1270: ERROR_INVALID_PARAMETER -- To indicate that the MS supplied strings ! 1271: should be used. ! 1272: ! 1273: --*/ ! 1274: ! 1275: { ! 1276: return(ERROR_INVALID_PARAMETER); ! 1277: } ! 1278: ! 1279: ULONG ! 1280: FindEisaCard( ! 1281: IN ULONG AdapterNumber, ! 1282: IN ULONG BusNumber, ! 1283: IN BOOLEAN First, ! 1284: IN ULONG CompressedId, ! 1285: OUT PULONG Confidence ! 1286: ) ! 1287: ! 1288: /*++ ! 1289: ! 1290: Routine Description: ! 1291: ! 1292: This routine finds the instances of a physical adapter identified ! 1293: by the CompressedId. ! 1294: ! 1295: Arguments: ! 1296: ! 1297: AdapterNumber - The index into the global array of adapters for the card. ! 1298: ! 1299: BusNumber - The bus number of the bus to search. ! 1300: ! 1301: First - TRUE is we are to search for the first instance of an ! 1302: adapter, FALSE if we are to continue search from a previous stopping ! 1303: point. ! 1304: ! 1305: CompressedId - The EISA Compressed Id of the card. ! 1306: ! 1307: Confidence - A pointer to a long for storing the confidence factor ! 1308: that the card exists. ! 1309: ! 1310: Return Value: ! 1311: ! 1312: 0 if nothing went wrong, else the appropriate WINERROR.H value. ! 1313: ! 1314: --*/ ! 1315: ! 1316: { ! 1317: PVOID BusHandle; ! 1318: ULONG TmpCompressedId; ! 1319: ! 1320: if (First) { ! 1321: ! 1322: SearchStates[AdapterNumber].SlotNumber = 1; ! 1323: ! 1324: } else { ! 1325: ! 1326: SearchStates[AdapterNumber].SlotNumber++; ! 1327: ! 1328: } ! 1329: ! 1330: if (!GetEisaKey(BusNumber, &BusHandle)) { ! 1331: ! 1332: return(ERROR_INVALID_PARAMETER); ! 1333: ! 1334: } ! 1335: ! 1336: while (TRUE) { ! 1337: ! 1338: if (!GetEisaCompressedId(BusHandle, ! 1339: SearchStates[AdapterNumber].SlotNumber, ! 1340: &TmpCompressedId)) { ! 1341: ! 1342: *Confidence = 0; ! 1343: return(0); ! 1344: ! 1345: } ! 1346: ! 1347: if (CompressedId == TmpCompressedId) { ! 1348: ! 1349: *Confidence = 100; ! 1350: return(0); ! 1351: ! 1352: } ! 1353: ! 1354: SearchStates[AdapterNumber].SlotNumber++; ! 1355: ! 1356: } ! 1357: ! 1358: DeleteEisaKey(BusHandle); ! 1359: ! 1360: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.