Annotation of q_a/samples/ddk/detect/deteisa.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.