|
|
1.1 ! root 1: ;************************************************************************* ! 2: ; ! 3: ; UTILITY.INF ! 4: ; ! 5: ; Network Installation utility functions. Each major piece of ! 6: ; functionality is coded as a [Section], and is invoked by name from ! 7: ; the outer level INF. See TEMPLATE.INF for example usage. ! 8: ; ! 9: ; CHANGES: ! 10: ; DavidHov 6/11/92 Added Service"Linkage" key return ! 11: ; value to [AddSoftwareComponent] ! 12: ; ! 13: ; DavidHov 8/24/92 Add WinSock support routines for ! 14: ; transports ! 15: ; ! 16: ; ! 17: ; ! 18: ;************************************************************************* ! 19: ! 20: ; ! 21: ;-------------------------------------------------------------------------- ! 22: ; Header to be used at the front of all externally available INF sections. ! 23: ;-------------------------------------------------------------------------- ! 24: ; ! 25: ;************************************************************************* ! 26: ; ! 27: ; SECTION: sectionname ! 28: ; ! 29: ; PURPOSE: <describe purpose of section> ! 30: ; ! 31: ; ARGUMENTS: $0 ! 32: ; $1 ! 33: ; ! 34: ; RETURNS: $R0 ! 35: ; $R1 ! 36: ; ! 37: ; REFERENCES: <list of global or parent variables referenced> ! 38: ; ! 39: ; MODIFIES: <list of global or parent variables modified> ! 40: ; ! 41: ; ! 42: ;************************************************************************* ! 43: ;************************************************************************* ! 44: ; end of section sectionname ! 45: ;************************************************************************* ! 46: ! 47: ; ! 48: ; Initialize general constants ! 49: ; ! 50: [InitBaseVars] ! 51: ! 52: KeyNull = "" ! 53: MAXIMUM_ALLOWED = 33554432 ! 54: KeyInfo = {} ! 55: RegistryErrorIndex = NO_ERROR ! 56: NoTitle = 0 ! 57: ! 58: CurrentControlSet = "SYSTEM\CurrentControlSet" ! 59: ServicesBaseName = $(CurrentControlSet)"\Services" ! 60: NetworkCardKeyName = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards" ! 61: ! 62: !RegLastError = NO_ERROR ! 63: ! 64: [RegistryErrorSetup] ! 65: RegistryErrorIndex = ^(RegistryErrors$(!STF_LANGUAGE),1) ! 66: RegistryErrorList = ^(RegistryErrors$(!STF_LANGUAGE),2) ! 67: ! 68: ;************************************************************************* ! 69: ; ! 70: ; SECTION: RegistryErrorString ! 71: ; ! 72: ; PURPOSE: Translate a numeric registry error code into a string ! 73: ; ! 74: ; ARGUMENTS: $0 Registry error code ! 75: ; ! 76: ; RETURNS: $R0 String containing displayable text in language ! 77: ; ! 78: ; REFERENCES: !STF_LANGUAGE -- global "user's language" variable; ! 79: ; see [RegistryErrorSetup] ! 80: ; ! 81: ; MODIFIES: Nothing ! 82: ; ! 83: ; ! 84: ;************************************************************************* ! 85: [RegistryErrorString] ! 86: ! 87: read-syms RegistryErrorSetup ! 88: read-syms RegistryErrorUnknown$(!STF_LANGUAGE) ! 89: ! 90: set RE_String = *($(RegistryErrorList),~($(RegistryErrorIndex),$($0))) ! 91: ! 92: Ifstr $(RE_String) == "" ! 93: set RE_String = $(Error_Bogus) ! 94: endif ! 95: ! 96: return $(RE_String) ! 97: ! 98: ;************************************************************************* ! 99: ; end of section RegistryErrorString ! 100: ;************************************************************************* ! 101: ! 102: ;************************************************************************* ! 103: ; ! 104: ; SECTION: BaseServiceKey ! 105: ; ! 106: ; PURPOSE: Return an open key handle to the top of the services tree ! 107: ; ! 108: ; ARGUMENTS: none ! 109: ; ! 110: ; RETURNS: $R0 Registry error code ! 111: ; $R1 Registry key variable for SERVICES0 ! 112: ; ! 113: ; REFERENCES: Nothing ! 114: ; ! 115: ; MODIFIES: Nothing ! 116: ; ! 117: ;************************************************************************* ! 118: [BaseServiceKey] ! 119: read-syms InitBaseVars ! 120: set BS_KeyServices = "" ! 121: ! 122: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName) $(MAXIMUM_ALLOWED) BS_KeyServices ! 123: ! 124: Ifstr $(BS_KeyServices) == $(KeyNull) ! 125: Debug-Output "UTILITY.INF: could not open Services base key" ! 126: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 127: endif ! 128: ! 129: B_S_Return = + ! 130: return $(RegistryErrorIndex), $(BS_KeyServices) ! 131: ! 132: ;************************************************************************* ! 133: ; ! 134: ; SECTION: ReduceInfPath ! 135: ; ! 136: ; PURPOSE: Process the path\name string to an INF file. If ! 137: ; its path points to STF_WINDOWSSYSPATH, remove the path prefix. ! 138: ; ! 139: ; ARGUMENTS: $0 Path\name to INF file ! 140: ; ! 141: ; RETURNS: $R0 Resulting string ! 142: ; ! 143: ; REFERENCES: Nothing ! 144: ; ! 145: ; MODIFIES: Nothing ! 146: ; ! 147: ;************************************************************************* ! 148: [ReduceInfPath] ! 149: Set RIP_Result = $($0) ! 150: ! 151: Split-String $(RIP_Result) "\" InList ! 152: Set BasePath = $(!STF_WINDOWSSYSPATH)"\" ! 153: Split-String $(BasePath) "\" BaseList ! 154: ! 155: ; ! 156: ; See how many of the path elements match ! 157: ; ! 158: ! 159: Set Indx = 0 ! 160: Set Matched = 0 ! 161: QueryListSize InListSize, $(InList) ! 162: ForListDo $(BaseList) ! 163: Set-add Indx = $(Indx),1 ! 164: Ifint $(Indx) <= $(InListSize) ! 165: Set Instr = *($(InList),$(Indx)) ! 166: Ifstr(i) $($) == $(Instr) ! 167: Set-add Matched = $(Matched),1 ! 168: Endif ! 169: Endif ! 170: EndForListDo ! 171: ! 172: ; ! 173: ; If all the path elements of the input path matched ! 174: ; those of STF_WINDOWSSYSPATH, strip them off of the result. ! 175: ; ! 176: ! 177: Ifint $(Indx) == $(Matched) ! 178: Set RIP_Result = "" ! 179: Set Indx2 = 0 ! 180: ForListDo $(InList) ! 181: Set-add Indx2 = $(Indx2),1 ! 182: Ifint $(Indx2) > $(Indx) ! 183: Set RIP_Result = $(RIP_Result)$($) ! 184: Endif ! 185: EndForListDo ! 186: Endif ! 187: ! 188: Return $(RIP_Result) ! 189: ! 190: ;************************************************************************* ! 191: ; ! 192: ; SECTION: InstallSoftwareProduct ! 193: ; ! 194: ; PURPOSE: Add a new component into the Registry ! 195: ; ! 196: ; ARGUMENTS: $0 name of Manufacturer ! 197: ; $1 name of Product ! 198: ; $2 full INF path and name ! 199: ; ! 200: ; RETURNS: $R0 error code or zero if no error ! 201: ; $R1 Registry key variable for ! 202: ; SOFTWARE\Manufacturer\Product\Version key ! 203: ; $R2 Registry key variable for ! 204: ; ...\NetRules ! 205: ; ! 206: ; REFERENCES: none ! 207: ; ! 208: ; MODIFIES: none ! 209: ; ! 210: ;************************************************************************* ! 211: ! 212: [InstallSoftwareProduct] ! 213: read-syms InitBaseVars ! 214: ! 215: set IS_MfgName = $($0) ! 216: set IS_ProdName = $($1) ! 217: set IS_Infname = $($2) ! 218: set IS_KeySoftware = "" ! 219: set IS_KeyMfg = "" ! 220: set IS_KeyProduct = "" ! 221: set IS_KeyVersion = "" ! 222: set IS_KeyNetRules = "" ! 223: set IS_MfgCreated = 1 ! 224: set IS_ProductCreated = 1 ! 225: ; ! 226: ; Validate the arguments passed in ! 227: ; ! 228: set RegistryErrorIndex = INVALID_DATA_PASSED ! 229: ! 230: Ifstr(i) $(IS_MfgName) == "" ! 231: goto I_S_Return ! 232: endif ! 233: Ifstr(i) $(IS_ProdName) == "" ! 234: goto I_S_Return ! 235: endif ! 236: ! 237: set RegistryErrorIndex = NO_ERROR ! 238: ; ! 239: ; Open the HKEY_LOCAL_MACHINE\SOFTWARE key ! 240: ; ! 241: OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_SoftwareBase) $(MAXIMUM_ALLOWED) IS_KeySoftware ! 242: ! 243: Ifstr $(IS_KeySoftware) == $(KeyNull) ! 244: set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG ! 245: goto I_S_Return ! 246: endif ! 247: ; ! 248: ; Create the Manufacturer's key if necessary ! 249: ; ! 250: CreateRegKey $(IS_KeySoftware) {$(IS_MfgName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyMfg ! 251: Ifstr $(IS_KeyMfg) == $(KeyNull) ! 252: set IS_MfgCreated = 0 ! 253: OpenRegKey $(IS_KeySoftware) "" $(IS_MfgName) $(MAXIMUM_ALLOWED) IS_KeyMfg ! 254: Ifstr $(IS_KeyMfg) == $(KeyNull) ! 255: set RegistryErrorIndex = UNABLE_OPEN_MICROSOFT_KEY ! 256: goto I_S_Return ! 257: endif ! 258: endif ! 259: ; ! 260: ; Create the Software Product key if necessary ! 261: ; ! 262: CreateRegKey $(IS_KeyMfg) {$(IS_ProdName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyProduct ! 263: Ifstr $(IS_KeyProduct) == $(KeyNull) ! 264: set IS_ProductCreated = 0 ! 265: OpenRegKey $(IS_KeyMfg) "" $(IS_ProdName) $(MAXIMUM_ALLOWED) IS_KeyProduct ! 266: Ifstr $(IS_KeyProduct) == $(KeyNull) ! 267: set RegistryErrorIndex = UNABLE_CREATE_PRODUCT_KEY ! 268: goto I_S_Return ! 269: endif ! 270: endif ! 271: ; ! 272: ; Create the software product version key. ! 273: ; ! 274: CreateRegKey $(IS_KeyProduct) {"CurrentVersion",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyVersion ! 275: Ifstr $(IS_KeyVersion) == $(KeyNull) ! 276: OpenRegKey $(IS_KeyProduct) "" "CurrentVersion" $(MAXIMUM_ALLOWED) IS_KeyVersion ! 277: Ifstr $(IS_KeyVersion) == $(KeyNull) ! 278: set RegistryErrorIndex = UNABLE_CREATE_PRODUCT_VERSION ! 279: goto I_S_Return ! 280: endif ! 281: endif ! 282: ! 283: set RegistryErrorIndex = NO_ERROR ! 284: ; ! 285: ; Create the NetRules key ! 286: ; ! 287: CreateRegKey $(IS_KeyVersion) {NetRules,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyNetRules ! 288: Ifstr $(IS_KeyNetRules) == $(KeyNull) ! 289: OpenRegKey $(IS_KeyVersion) "" NetRules $(MAXIMUM_ALLOWED) IS_KeyNetRules ! 290: Ifstr $(IS_KeyNetRules) == $(KeyNull) ! 291: set RegistryErrorIndex = UNABLE_CREATE_NETRULES_KEY ! 292: goto I_S_Return ! 293: endif ! 294: endif ! 295: ; ! 296: ; Set the "Infname" value if non-null; reduce it if it's in %SystemRoot% ! 297: ; ! 298: Ifstr $(IS_Infname) != "" ! 299: Shell "", ReduceInfPath, $(IS_Infname) ! 300: SetRegValue $(IS_KeyNetRules) {InfName,$(NoTitle),$(!REG_VT_SZ),$($R0)} ! 301: endif ! 302: ! 303: ; ! 304: ; Exit, leaving $(IS_KeyVersion) and $(IS_KeyNetRules) open for the caller... ! 305: ; ! 306: I_S_Return = + ! 307: Ifstr $(IS_KeyProduct) != "" ! 308: Ifint $(IS_ProductCreated) == 1 ! 309: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 310: Debug-Output "UTILITY.INF: DeleteRegTree Product Key" ! 311: ;DeleteRegTree $(IS_KeyProduct) "" ! 312: set IS_KeyProduct = "" ! 313: endif ! 314: endif ! 315: Ifstr $(IS_KeyProduct) != "" ! 316: CloseRegKey $(IS_KeyProduct) ! 317: endif ! 318: endif ! 319: Ifstr $(IS_KeyMfg) != "" ! 320: Ifint $(IS_MfgCreated) == 1 ! 321: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 322: ;DeleteRegTree $(IS_KeyMfg) "" ! 323: Debug-Output "UTILITY.INF: DeleteRegTree Manufacturer Key" ! 324: set IS_KeyMfg = "" ! 325: endif ! 326: endif ! 327: Ifstr $(IS_KeyMfg) != "" ! 328: CloseRegKey $(IS_KeyMfg) ! 329: endif ! 330: endif ! 331: Ifstr $(IS_KeySoftware) != "" ! 332: CloseRegKey $(IS_KeySoftware) ! 333: endif ! 334: return $(RegistryErrorIndex), $(IS_KeyVersion), $(IS_KeyNetRules) ! 335: ! 336: ;************************************************************************* ! 337: ; end of section InstallSoftwareProduct ! 338: ;************************************************************************* ! 339: ! 340: ;************************************************************************* ! 341: ; ! 342: ; SECTION: AddValueList ! 343: ; ! 344: ; PURPOSE: Given a nested list of value items, add each to the given ! 345: ; key. Key is left open. ! 346: ; ! 347: ; ARGUMENTS: $0 Registry key handle ! 348: ; $1 List of value items; for example: ! 349: ; { {ValueName1,0,$(!REG_VT_SZ),$(ValueData1)}, + ! 350: ; {ValueName2,0,$(!REG_VT_SZ),$(ValueData2)} } ! 351: ; ! 352: ; RETURNS: $R0 Registry error code. ! 353: ; ! 354: ; ! 355: ; REFERENCES: Nothing ! 356: ; ! 357: ; MODIFIES: Nothing ! 358: ; ! 359: ;************************************************************************* ! 360: [AddValueList] ! 361: set RegistryErrorIndex = NO_ERROR ! 362: ! 363: ForListDo $($1) ! 364: SetRegValue $($0) $($) ! 365: ifint $(RegLastError) != 0 ! 366: Debug-Output "UTILITY.INF: Value write fail data: "$($) ! 367: Debug-Output "UTILITY.INF: Value write fail key: "$($0) ! 368: return UNABLE_WRITE_REGISTRY ! 369: endif ! 370: EndForListDo ! 371: ! 372: return $(RegistryErrorIndex) ! 373: ! 374: ;************************************************************************* ! 375: ; end of section AddValueList ! 376: ;************************************************************************* ! 377: ! 378: ;************************************************************************* ! 379: ; ! 380: ; SECTION: DeleteSoftwareProduct ! 381: ; ! 382: ; PURPOSE: Delete the given product from the Registry entirely ! 383: ; ! 384: ; ARGUMENTS: $0 Product Key Handle ! 385: ; ! 386: ; RETURNS: $R0 Registry error code ! 387: ; $R1 ! 388: ; ! 389: ; REFERENCES: Nothing ! 390: ; ! 391: ; MODIFIES: Nothing ! 392: ; ! 393: ;************************************************************************* ! 394: [DeleteSoftwareProduct] ! 395: ! 396: set RegistryErrorIndex = NO_ERROR ! 397: ! 398: Debug-Output "UTILITY.INF: DeleteRegTree Software Product" ! 399: DeleteRegTree $($0) "" ! 400: ! 401: return $(RegistryErrorIndex) ! 402: ! 403: ;************************************************************************* ! 404: ; end of section DeleteSoftwareProduct ! 405: ;************************************************************************* ! 406: ! 407: ;************************************************************************* ! 408: ; ! 409: ; SECTION: VerExistedDlg ! 410: ; ! 411: ; PURPOSE: Popup a dialog and tell the user that the same ver of ! 412: ; the software already exists in the registery tree. ! 413: ; Ask the user whether he want to continue or not ! 414: ; ! 415: ; ARGUMENTS: $0 Product Name ! 416: ; $0 Product version ! 417: ; ! 418: ; RETURNS: $R0 Registry error code ! 419: ; $R1 either "continue" or "exit" ! 420: ; ! 421: ; REFERENCES: Nothing ! 422: ; ! 423: ; MODIFIES: Nothing ! 424: ; ! 425: ;************************************************************************* ! 426: ! 427: [VerExistedDlg] ! 428: ! 429: set RegistryErrorIndex = NO_ERROR ! 430: ! 431: set-subst LF = "\n" ! 432: read-syms VerExisted$(!STF_LANGUAGE) ! 433: ! 434: set DlgText = $($0)+ ! 435: $(ver)+ ! 436: $($1)+ ! 437: $(Text) ! 438: Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "NONFATAL" $(DlgText) ! 439: ! 440: ifint $($ShellCode) != $(!SHELL_CODE_OK) ! 441: set RegistryErrorIndex = ERROR ! 442: endif ! 443: ! 444: return $(RegistryErrorIndex), $($R1) ! 445: ! 446: ;************************************************************************* ! 447: ; end of section VerExistedDialog ! 448: ;************************************************************************* ! 449: ! 450: ;************************************************************************* ! 451: ; ! 452: ; SECTION: CardExistedDlg ! 453: ; ! 454: ; PURPOSE: Popup a dialog and tell the user that the network card ! 455: ; is lready installed and ask them whether theyr want to ! 456: ; continue. ! 457: ; ! 458: ; ARGUMENTS: NONE ! 459: ; ! 460: ; RETURNS: $R0 Registry error code ! 461: ; $R1 either "continue" or "exit" ! 462: ; ! 463: ; REFERENCES: Nothing ! 464: ; ! 465: ; MODIFIES: Nothing ! 466: ; ! 467: ;************************************************************************* ! 468: ! 469: [CardExistedDlg] ! 470: ! 471: set RegistryErrorIndex = NO_ERROR ! 472: ! 473: set-subst LF = "\n" ! 474: read-syms CardExisted$(!STF_LANGUAGE) ! 475: ! 476: set DlgText = $(Text) ! 477: ! 478: Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(DlgText) ! 479: ! 480: ifint $($ShellCode) != $(!SHELL_CODE_OK) ! 481: set RegistryErrorIndex = ERROR ! 482: endif ! 483: ! 484: return $(RegistryErrorIndex), $($R1) ! 485: ! 486: ;************************************************************************* ! 487: ; end of section CardExistedDialog ! 488: ;************************************************************************* ! 489: ! 490: ;************************************************************************* ! 491: ; ! 492: ; SECTION: CreateService ! 493: ; ! 494: ; PURPOSE: Create the Services area entry for a new product ! 495: ; ! 496: ; ARGUMENTS: $0 Name of the service (no imbedded blanks, etc.) ! 497: ; $1 Display Name of service ! 498: ; $2 image path string ! 499: ; $3 type of service: ! 500: ; system ! 501: ; adapter ! 502: ; driver ! 503: ; transport ! 504: ; service ! 505: ; serviceshare ! 506: ; $4 group, if any or "" ! 507: ; $5 dependency **list**, if any or {} ! 508: ; $6 ObjectName, usually "" ! 509: ; $7 EventMessageFile [Optional] ! 510: ; $8 TypeSupported [Optional] ! 511: ; $9 EventLog Location[Optional] ! 512: ; $10 Error control value [Optional] ! 513: ; $11 Event Source name [Optional] ! 514: ; ! 515: ; ! 516: ; RETURNS: $R0 Registry error code ! 517: ; $R1 Service area key handle ! 518: ; $R2 Parameters key handle ! 519: ; $R3 Linkage key handle ! 520: ; ! 521: ; REFERENCES: <list of global or parent variables referenced> ! 522: ; ! 523: ; MODIFIES: <list of global or parent variables modified> ! 524: ; ! 525: ; NOTES: If $(!NTN_ScUseRegistry) is != "", then direct Registry ! 526: ; access is used in lieu of the Service Controller API ! 527: ; wrapper. The Registry is automatically used if the ! 528: ; service type is "adapter". ! 529: ; ! 530: ; The image path format varies for drivers and other ! 531: ; services. For drivers of any kind, it's an NT name space ! 532: ; name. For services, it's a REG_EXPAND_SZ format Win32 name. ! 533: ; ! 534: ; ! 535: ; CHANGES: DavidHov: 6/11/92. "Groups" is REG_SZ, not REG_EXPAND_SZ ! 536: ; Adapters are type=4, start=4. ! 537: ; Only services get "ObjectName" value ! 538: ; ! 539: ; ! 540: ; ! 541: ; ! 542: ;************************************************************************* ! 543: [CreateService] ! 544: read-syms InitBaseVars ! 545: ! 546: set CS_NameOfService = $($0) ! 547: set CS_DisplayName = $($1) ! 548: set CS_ImagePath = $($2) ! 549: set CS_TypeOfService = $($3) ! 550: set CS_Group = $($4) ! 551: set CS_Dependencies = $($5) ! 552: set CS_ObjectName = $($6) ! 553: set CS_EventFile = $($7) ! 554: set CS_TypeSupported = $($8) ! 555: ifstr(i) $(CS_TypeSupported) == "" ! 556: set CS_TypeSupported = 7 ! 557: endif ! 558: ; Set event log location ! 559: set CS_EventLogLocation = $($9) ! 560: ifstr(i) $(CS_EventLogLocation) == "" ! 561: set CS_EventLogLocation = "System" ! 562: endif ! 563: set CS_ErrorControl = $($10) ! 564: ifstr(i) $(CS_ErrorControl) == "" ! 565: set CS_ErrorControl = 1 ! 566: endif ! 567: set CS_EventSourceName = $($11) ! 568: ifstr(i) $(CS_EventSourceName) == "" ! 569: set CS_EventSourceName = $(CS_NameOfService) ! 570: endif ! 571: ! 572: set CS_KeyServices = "" ! 573: set CS_KeyTempSvc = "" ! 574: set CS_KeySvcManager = "" ! 575: set CS_KeyParameters = "" ! 576: set CS_KeyLinkage = "" ! 577: set CS_UseRegistry = $(!NTN_ScUseRegistry) ! 578: ! 579: Debug-Output "UTILITY.INF: [CreateService] entered for "$(CS_NameOfService) ! 580: ! 581: Ifstr(i) $(CS_UseRegistry) != "YES" ! 582: Ifstr(i) $(CS_UseRegistry) != "NO" ! 583: Set CS_UseRegistry = "NO" ! 584: Endif ! 585: Endif ! 586: ! 587: Ifstr(i) $(CS_Dependencies) == "" ! 588: Set CS_Dependencies = {} ! 589: Endif ! 590: ! 591: ; ! 592: ; Get the base key handle for the services area ! 593: ; ! 594: Shell "", BaseServiceKey ! 595: set RegistryErrorIndex = $($R0) ! 596: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 597: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 598: goto C_S_Return ! 599: endif ! 600: ! 601: set CS_KeyServices = $($R1) ! 602: ! 603: ifstr(i) $(CS_TypeOfService) == "system" ! 604: set TypeValue = 2 ! 605: set StartValue = 3 ! 606: else-ifstr(i) $(CS_TypeOfService) == "systemstart" ! 607: set TypeValue = 2 ! 608: set StartValue = 1 ! 609: else-ifstr(i) $(CS_TypeOfService) == "systemauto" ! 610: set TypeValue = 2 ! 611: set StartValue = 2 ! 612: else-ifstr(i) $(CS_TypeOfService) == "adapter" ! 613: set TypeValue = 4 ! 614: set StartValue = 3 ! 615: Set CS_UseRegistry = "YES" ! 616: else-ifstr(i) $(CS_TypeOfService) == "kernelauto" ! 617: set TypeValue = 1 ! 618: set StartValue = 1 ! 619: else-ifstr(i) $(CS_TypeOfService) == "autoserviceshare" ! 620: set TypeValue = 32 ! 621: set StartValue = 2 ! 622: else-ifstr(i) $(CS_TypeOfService) == "transport" ! 623: set TypeValue = 2 ! 624: set StartValue = 3 ! 625: else-ifstr(i) $(CS_TypeOfService) == "kernel" ! 626: set TypeValue = 1 ! 627: set StartValue = 3 ! 628: else-ifstr(i) $(CS_TypeOfService) == "kernelautostart" ! 629: set TypeValue = 1 ! 630: set StartValue = 2 ! 631: else-ifstr(i) $(CS_TypeOfService) == "kerneldisable" ! 632: set TypeValue = 1 ! 633: set StartValue = 4 ! 634: else-ifstr(i) $(CS_TypeOfService) == "service" ! 635: set TypeValue = 16 ! 636: set StartValue = 3 ! 637: else-ifstr(i) $(CS_TypeOfService) == "serviceauto" ! 638: set TypeValue = 16 ! 639: set StartValue = 2 ! 640: else-ifstr(i) $(CS_TypeOfService) == "serviceshare" ! 641: set TypeValue = 32 ! 642: set StartValue = 3 ! 643: else ! 644: Set CS_UseRegistry = "YES" ! 645: Debug-Output "UTILITY.INF: [CreateService] Unrecognized TypeOfService parameter" ! 646: set TypeValue = 4 ! 647: set StartValue = 3 ! 648: endif ! 649: ! 650: Ifint $(TypeValue) > 4 ! 651: Ifstr(i) $(CS_ObjectName) == "" ! 652: set CS_ObjectName = "LocalSystem" ! 653: Endif ! 654: Endif ! 655: ! 656: OpenRegKey $(CS_KeyServices) "" $(CS_NameOfService) $(MAXIMUM_ALLOWED) + ! 657: CS_KeyTempSvc ! 658: ifstr $(CS_KeyTempSvc) != $(KeyNull) ! 659: ; wait a minute.. somebody already installed the driver ! 660: ; go to open other keys ! 661: ! 662: ; check whether it is marked for deletion ! 663: GetRegValue $(CS_KeyTempSvc),"DeleteFlag", DeleteFlagInfo ! 664: set DeleteFlag = *($(DeleteFlagInfo), 4) ! 665: ifint $(DeleteFlag) == 1 ! 666: Set RegistryErrorIndex = REBOOT_MACHINE_BEFORE_ADD_ADAPTER ! 667: goto C_S_Return ! 668: endif ! 669: ; ! 670: ; Device section of the registry already exist. ! 671: ; Let the code below to handle it. It will popup a dialog ! 672: ; and returns error code. ! 673: ; ! 674: endif ! 675: ! 676: ifstr(i) $(CS_UseRegistry) == "YES" ! 677: ; ! 678: Debug-Output "UTILITY.INF: [CreateService] "$(CS_NameOfService)" using Registry" ! 679: ; ! 680: ; Create our own service ! 681: ; ! 682: OpenRegKey $(CS_KeyServices) "" $(CS_NameOfService) $(MAXIMUM_ALLOWED) + ! 683: CS_KeyTempSvc ! 684: ifstr $(CS_KeyTempSvc) == $(KeyNull) ! 685: CreateRegKey $(CS_KeyServices) {$(CS_NameOfService),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyTempSvc ! 686: else ! 687: Debug-Output "UTILITY.INF: service key "$(CS_NameOfService)" already existed" ! 688: Set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE ! 689: CloseRegKey $(CS_KeyTempSvc) ! 690: CloseRegKey $(CS_KeyServices) ! 691: Goto C_S_Return ! 692: endif ! 693: ! 694: Ifstr(i) $(CS_KeyTempSvc) == $(KeyNull) ! 695: ! 696: Debug-Output "UTILITY.INF: could not create service key "$(CS_NameOfService) ! 697: Set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE ! 698: CloseRegKey $(CS_KeyTempSvc) ! 699: CloseRegKey $(CS_KeyServices) ! 700: Goto C_S_Return ! 701: ! 702: else ! 703: ! 704: set NewValueList = {+ ! 705: {Type,$(NoTitle),$(!REG_VT_DWORD),$(TypeValue)},+ ! 706: {Start,$(NoTitle),$(!REG_VT_DWORD),$(StartValue)},+ ! 707: {ErrorControl,$(NoTitle),$(!REG_VT_DWORD),$(CS_ErrorControl)}+ ! 708: } ! 709: ! 710: Ifint $(TypeValue) > 4 ! 711: Set NewValueList = >($(NewValueList), + ! 712: {ObjectName,$(NoTitle),$(!REG_VT_SZ),$(CS_ObjectName)}) ! 713: Endif ! 714: ! 715: ifstr(i) $(CS_Group) != "" ! 716: set NewValueList = >($(NewValueList), + ! 717: {Group,$(NoTitle),$(!REG_VT_SZ),$(CS_Group)}) ! 718: endif ! 719: ! 720: ifstr(i) $(CS_ImagePath) != "" ! 721: set NewValueList = >($(NewValueList), + ! 722: {ImagePath,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(CS_ImagePath)}) ! 723: endif ! 724: ! 725: ifstr(i) $(CS_Dependencies) != "" ! 726: ifstr(i) $(CS_Dependencies) != {} ! 727: set NewValueList = >($(NewValueList), + ! 728: {Dependencies,$(NoTitle),$(!REG_VT_MULTI_SZ),$(CS_Dependencies)}) ! 729: endif ! 730: endif ! 731: ! 732: Shell "", AddValueList, $(CS_KeyTempSvc), $(NewValueList) ! 733: ! 734: set RegistryErrorIndex = $($R0) ! 735: ! 736: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 737: Debug-Output "Registry error: Add value list" ! 738: endif ! 739: ! 740: endif ! 741: else ! 742: Debug-Output "UTILITY.INF: [CreateService] "$(CS_NameOfService)" using CreateService() wrapper" ! 743: ; ! 744: ; Call NCPA to create service key. ! 745: ; ! 746: Set FLibraryErrCtl = 1 ! 747: LibraryProcedure CS_CreateResult $(!NCPA_HANDLE), CPlSetup, $(!STF_HWND), CREATESVC,+ ! 748: $(CS_NameOfService), $(CS_DisplayName), $(StartValue), $(TypeValue), $(CS_ErrorControl),+ ! 749: $(CS_ImagePath), $(CS_Group),$(CS_Dependencies),$(CS_ObjectName) ! 750: Set FLibraryErrCtl = 0 ! 751: ; ! 752: ; Check the return code ! 753: ; ! 754: Set CS_CreateError = *($(CS_CreateResult),1) ! 755: Ifint $(CS_CreateError) != 0 ! 756: Debug-Output "UTILITY.INF: CreateService wrapper failed, error: "$(CS_CreateResult) ! 757: ; ! 758: ; See if the error is special ! 759: ; ! 760: Ifint $(CS_CreateResult) == 1073 ! 761: Set RegistryErrorIndex = SERVICE_ALREADY_EXISTS ! 762: Else-ifint $(CS_CreateResult) == 1072 ! 763: Set RegistryErrorIndex = SERVICE_MARKED_FOR_DELETE ! 764: Else ! 765: Set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE ! 766: Endif ! 767: CloseRegKey $(CS_KeyTempSvc) ! 768: CloseRegKey $(CS_KeyServices) ! 769: Goto C_S_Return ! 770: Endif ! 771: ; ! 772: ; Now open the key which should have been created by the service controller ! 773: ; ! 774: OpenRegKey $(CS_KeyServices) "" $(CS_NameOfService) $(MAXIMUM_ALLOWED) CS_KeyTempSvc ! 775: ifstr $(CS_KeyTempSvc) == $(KeyNull) ! 776: Debug-Output "UTILITY.INF: unable to open new service key" ! 777: set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE ! 778: CloseRegKey $(CS_KeyTempSvc) ! 779: CloseRegKey $(CS_KeyServices) ! 780: Goto C_S_Return ! 781: endif ! 782: endif ! 783: ! 784: ; ! 785: ; Open or Create the Parameters subkey ! 786: ; ! 787: OpenRegKey $(CS_KeyTempSvc) "" "Parameters" $(MAXIMUM_ALLOWED) + ! 788: CS_KeyParameters ! 789: ifstr $(CS_KeyParameters) == $(KeyNull) ! 790: CreateRegKey $(CS_KeyTempSvc) {"Parameters",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyParameters ! 791: endif ! 792: ! 793: Ifstr $(CS_KeyParameters) == $(KeyNull) ! 794: set RegistryErrorIndex = UNABLE_CREATE_SERVICE_SUBKEY ! 795: CloseRegKey $(CS_KeyTempSvc) ! 796: CloseRegKey $(CS_KeyServices) ! 797: goto C_S_Return ! 798: endif ! 799: ! 800: set RegistryErrorIndex = NO_ERROR ! 801: ; ! 802: ; Open or Create the Linkage subkey ! 803: ; ! 804: OpenRegKey $(CS_KeyTempSvc) "" "Linkage" $(MAXIMUM_ALLOWED) CS_KeyLinkage ! 805: Ifstr $(CS_KeyLinkage) == $(KeyNull) ! 806: CreateRegKey $(CS_KeyTempSvc) {"Linkage",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyLinkage ! 807: Endif ! 808: ! 809: Ifstr $(CS_KeyLinkage) == $(KeyNull) ! 810: set RegistryErrorIndex = UNABLE_CREATE_SERVICE_SUBKEY ! 811: CloseRegKey $(CS_KeyTempSvc) ! 812: CloseRegKey $(CS_KeyServices) ! 813: goto C_S_Return ! 814: endif ! 815: ; ! 816: ; Open or Create the Linkage\Disabled subkey ! 817: ; ! 818: OpenRegKey $(CS_KeyLinkage) "" "Disabled" $(MAXIMUM_ALLOWED) CS_KeyDisabled ! 819: Ifstr $(CS_KeyDisabled) == $(KeyNull) ! 820: CreateRegKey $(CS_KeyLinkage) {"Disabled",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyDisabled ! 821: Endif ! 822: ! 823: Ifstr $(CS_KeyDisabled) == $(KeyNull) ! 824: set RegistryErrorIndex = UNABLE_CREATE_SERVICE_SUBKEY ! 825: CloseRegKey $(CS_KeyTempSvc) ! 826: CloseRegKey $(CS_KeyServices) ! 827: CloseRegKey $(CS_KeyLinkage) ! 828: goto C_S_Return ! 829: endif ! 830: CloseRegKey $(CS_KeyDisabled) ! 831: ! 832: ! 833: ; ! 834: ; Create Eventlog information ! 835: ; ! 836: ifstr(i) $(CS_EventFile) != "" ! 837: OpenRegKey $(!REG_H_LOCAL) "" "SYSTEM\CurrentControlSet\Services\EventLog\"$(CS_EventLogLocation) $(MAXIMUM_ALLOWED) CS_KeyEventLog ! 838: Ifstr $(CS_KeyEventLog) == $(KeyNull) ! 839: ; cannot open eventlog ! 840: debug-output "Cannot open eventlog key" ! 841: set RegistryErrorIndex = UNABLE_OPEN_EVENTLOG_SUBKEY ! 842: CloseRegKey $(CS_KeyTempSvc) ! 843: CloseRegKey $(CS_KeyServices) ! 844: CloseRegKey $(CS_KeyParameters) ! 845: CloseRegKey $(CS_KeyLinkage) ! 846: goto C_S_Return ! 847: else ! 848: ; set up the service key ! 849: OpenRegKey $(CS_KeyEventLog) "" $(CS_EventSourceName) $(MAXIMUM_ALLOWED) CS_KeyService ! 850: ifstr(i) $(CS_KeyService) == "" ! 851: CreateRegKey $(CS_KeyEventLog) {$(CS_EventSourceName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyService ! 852: endif ! 853: ! 854: Ifstr $(CS_KeyService) != $(KeyNull) ! 855: ; create the EventMessageFile and TypeSupported fields ! 856: SetRegValue $(CS_KeyService) {EventMessageFile,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(CS_EventFile)} ! 857: SetRegValue $(CS_KeyService) {TypesSupported,$(NoTitle),$(!REG_VT_DWORD),$(CS_TypeSupported)} ! 858: CloseRegKey $(CS_KeyService) ! 859: endif ! 860: Endif ! 861: endif ! 862: ! 863: ; ! 864: ; Return the keys and error codes ! 865: ; ! 866: C_S_Return = + ! 867: Ifstr $(CS_KeyServices) != $(KeyNull) ! 868: CloseRegKey $(CS_KeyServices) ! 869: endif ! 870: return $(RegistryErrorIndex), $(CS_KeyTempSvc), $(CS_KeyParameters), $(CS_KeyLinkage) ! 871: ! 872: ;************************************************************************* ! 873: ; end of section CreateService ! 874: ;************************************************************************* ! 875: ! 876: ! 877: ;************************************************************************* ! 878: ; ! 879: ; SECTION: AssignAdapterNumber ! 880: ; ! 881: ; PURPOSE: Enumerate the netcards, and return a numeric value which ! 882: ; is unused. ! 883: ; ! 884: ; ARGUMENTS: None. ! 885: ; ! 886: ; RETURNS: $R0 Regisitry Error Code ! 887: ; $R1 Numeric value to be use for new adapter; ! 888: ; (1,2,3..) ! 889: ; ! 890: ; REFERENCES: Nothing ! 891: ; ! 892: ; MODIFIES: Nothing ! 893: ; ! 894: ; ! 895: ;************************************************************************* ! 896: [AssignAdapterNumber] ! 897: read-syms InitBaseVars ! 898: ! 899: set AA_AdapterNumber = 1 ! 900: set AA_KeyNetcards = "" ! 901: set AA_KeyTemp = "" ! 902: set RegistryErrorIndex = NO_ERROR ! 903: ! 904: OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardKeyName) $(MAXIMUM_ALLOWED) AA_KeyNetcards ! 905: ! 906: Ifstr $(AA_KeyNetcards) == $(KeyNull) ! 907: set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION ! 908: goto A_A_Return ! 909: endif ! 910: ; ! 911: ; Loop to find an unused adapter number ! 912: ; ! 913: A_A_TryAgain = + ! 914: Ifint $(AA_AdapterNumber) > 100 ! 915: Set AA_AdapterNumber = 0 ! 916: Set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION ! 917: Goto A_A_Found ! 918: Endif ! 919: ! 920: ifint $(AA_AdapterNumber) < 10 ! 921: set Tmp_AA_AdapterNumber = "0"$(AA_AdapterNumber) ! 922: else ! 923: set Tmp_AA_AdapterNumber = $(AA_AdapterNumber) ! 924: endif ! 925: ! 926: OpenRegKey $(AA_KeyNetcards) "" $(Tmp_AA_AdapterNumber) $(MAXIMUM_ALLOWED) AA_KeyTemp ! 927: ! 928: Ifstr $(AA_KeyTemp) == $(KeyNull) ! 929: Goto A_A_Found ! 930: Endif ! 931: ! 932: CloseRegKey $(AA_KeyTemp) ! 933: Set AA_KeyTemp = $(KeyNull) ! 934: Set-add AA_AdapterNumber = $(AA_AdapterNumber),1 ! 935: Goto A_A_TryAgain ! 936: ! 937: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! 938: ;;BUGBUG: The code below should work ! 939: ;; ! 940: ; EnumRegKey $(AA_KeyNetcards) AA_KeyNameList ! 941: ; ! 942: ; ForListDo $(AA_KeyNameList) ! 943: ; set AA_KeyName = *($($),1) ! 944: ; Ifint $(AA_AdapterNumber) != $(AA_KeyName) ! 945: ; goto A_A_Found ! 946: ; endif ! 947: ; set-add AA_AdapterNumber = $(AA_AdapterNumber),1 ! 948: ; EndForListDo ! 949: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! 950: ! 951: A_A_Found =+ ! 952: IfInt $(AA_AdapterNumber) <= 9 ! 953: set AA_AdapterNumber = "0"$(AA_AdapterNumber) ! 954: endif ! 955: CloseRegKey $(AA_KeyNetcards) ! 956: ! 957: A_A_Return = + ! 958: return $(RegistryErrorIndex) $(AA_AdapterNumber) ! 959: ! 960: ;************************************************************************* ! 961: ; end of section AssignAdapterNumber ! 962: ;************************************************************************* ! 963: ! 964: ;************************************************************************* ! 965: ; ! 966: ; SECTION: InstallNetcard ! 967: ; ! 968: ; PURPOSE: Create a new HARDWARE\Netcard\(n) area in the Registry ! 969: ; ! 970: ; ARGUMENTS: $0 Name if the INF file ! 971: ; ! 972: ; RETURNS: $R0 Registry error code ! 973: ; $R1 Netcard\(n) key handle ! 974: ; $R2 numeric index of netcard (n) ! 975: ; $R3 NetRules key handle ! 976: ; ! 977: ; REFERENCES: Nothing ! 978: ; ! 979: ; MODIFIES: Nothing ! 980: ; ! 981: ; ! 982: ;************************************************************************* ! 983: [InstallNetcard] ! 984: read-syms InitBaseVars ! 985: ! 986: set IN_Infname = $($0) ! 987: set IN_CardNumber = 0 ! 988: set IN_KeyNetcard = "" ! 989: set IN_KeyNetRules = "" ! 990: ; ! 991: ; Assign a number to this network card and create its key ! 992: ; ! 993: Shell "" AssignAdapterNumber ! 994: ! 995: set RegistryErrorIndex = $($R0) ! 996: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 997: goto I_N_Return ! 998: endif ! 999: ! 1000: set IN_CardNumber = $($R1) ! 1001: ! 1002: CreateRegKey $(!REG_H_LOCAL) {$(NetworkCardKeyName)\$(IN_CardNumber),$(NoTitle),GenericClass} + ! 1003: "" $(MAXIMUM_ALLOWED) "" IN_KeyNetcard ! 1004: ! 1005: Ifstr $(IN_KeyNetcard) == $(KeyNull) ! 1006: set RegistryErrorIndex = UNABLE_CREATE_NETCARD_CONFIGURATION ! 1007: goto I_N_Return ! 1008: endif ! 1009: ; ! 1010: ; Create the NetRules key ! 1011: ; ! 1012: CreateRegKey $(IN_KeyNetcard) {NetRules,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IN_KeyNetRules ! 1013: Ifstr $(IN_KeyNetRules) == $(KeyNull) ! 1014: set RegistryErrorIndex = UNABLE_CREATE_NETRULES_KEY ! 1015: goto I_N_Return ! 1016: endif ! 1017: ; ! 1018: ; Set the "Infname" value if non-null; reduce it if it's in %SystemRoot% ! 1019: ; ! 1020: Ifstr $(IN_Infname) != "" ! 1021: Shell "", ReduceInfPath, $(IN_Infname) ! 1022: SetRegValue $(IN_KeyNetRules) {InfName,$(NoTitle),$(!REG_VT_SZ),$($R0)} ! 1023: endif ! 1024: ! 1025: set RegistryErrorIndex = NO_ERROR ! 1026: ! 1027: I_N_Return = + ! 1028: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1029: Debug-Output "UTILITY.INF: [InstallNetcard]: "$(RegistryErrorIndex) ! 1030: Ifstr $(IN_KeyNetRules) != $(KeyNull) ! 1031: CloseRegKey $(IN_KeyNetRules) ! 1032: set IN_KeyNetrules = '' ! 1033: endif ! 1034: ;BUGBUG DeleteRegTree $(IN_KeyNetcard) ! 1035: set IN_KeyNetcard = "" ! 1036: endif ! 1037: return $(RegistryErrorIndex), $(IN_KeyNetcard), $(IN_CardNumber), $(IN_KeyNetRules) ! 1038: ! 1039: ;************************************************************************* ! 1040: ; end of section InstallNetcard ! 1041: ;************************************************************************* ! 1042: ! 1043: ;************************************************************************* ! 1044: ; ! 1045: ; SECTION: LinkToService ! 1046: ; ! 1047: ; PURPOSE: Link a software or hardware component to its ! 1048: ; corresponding service area entry ! 1049: ; ! 1050: ; ARGUMENTS: $0 Registry key handle to primary component key ! 1051: ; $1 Name of service (no imbedded blanks, etc.) ! 1052: ; ! 1053: ; RETURNS: $R0 Registry error code ! 1054: ; ! 1055: ; REFERENCES: Nothing ! 1056: ; ! 1057: ; MODIFIES: Nothing ! 1058: ; ! 1059: ; ! 1060: ;************************************************************************* ! 1061: [LinkToService] ! 1062: ! 1063: read-syms InitBaseVars ! 1064: ! 1065: SetRegValue $($0) {ServiceName,$(NoTitle),$(!REG_VT_SZ),$($1)} ! 1066: ! 1067: L_S_Return = + ! 1068: return $(RegistryErrorIndex) ! 1069: ! 1070: ;************************************************************************* ! 1071: ; end of section LinkToService ! 1072: ;************************************************************************* ! 1073: ! 1074: ;************************************************************************* ! 1075: ; ! 1076: ; SECTION: IncrementRefCount ! 1077: ; ! 1078: ; PURPOSE: Increment the reference counter in the registry ! 1079: ; ! 1080: ; ARGUMENTS: $0 Registry key name ! 1081: ; ! 1082: ; RETURNS: $R0 Registry error code ! 1083: ; ! 1084: ; REFERENCES: Nothing ! 1085: ; ! 1086: ; MODIFIES: Nothing ! 1087: ; ! 1088: ; ! 1089: ;************************************************************************* ! 1090: [IncrementRefCount] ! 1091: read-syms InitBaseVars ! 1092: ! 1093: OpenRegKey $(!REG_H_LOCAL) "" $($0) $(MAXIMUM_ALLOWED) SoftwareKey ! 1094: ! 1095: Ifstr $(SoftwareKey) == $(KeyNull) ! 1096: Debug-Output "UTILITY.INF: could not open Software base key" ! 1097: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 1098: goto IncrementRefCount_Return ! 1099: endif ! 1100: ! 1101: GetRegValue $(SoftwareKey),"RefCount", RefCountInfo ! 1102: set RefCount = *($(RefCountInfo), 4) ! 1103: Set-add RefCount = $(RefCount),1 ! 1104: SetRegValue $(SoftwareKey) {RefCount,$(NoTitle),$(!REG_VT_DWORD),$(RefCount)} ! 1105: CloseRegKey $(SoftwareKey) ! 1106: ! 1107: IncrementRefCount_Return = + ! 1108: return $(RegistryErrorIndex) ! 1109: ! 1110: ;************************************************************************* ! 1111: ; end of section IncrementRefCount ! 1112: ;************************************************************************* ! 1113: ! 1114: ;************************************************************************* ! 1115: ; ! 1116: ; SECTION: DecrementRefCount ! 1117: ; ! 1118: ; PURPOSE: Decrement the reference counter in the registry ! 1119: ; ! 1120: ; ARGUMENTS: $0 Registry key name ! 1121: ; ! 1122: ; RETURNS: $R0 Registry error code ! 1123: ; ! 1124: ; REFERENCES: Nothing ! 1125: ; ! 1126: ; MODIFIES: Nothing ! 1127: ; ! 1128: ; ! 1129: ;************************************************************************* ! 1130: [DecrementRefCount] ! 1131: read-syms InitBaseVars ! 1132: ! 1133: OpenRegKey $(!REG_H_LOCAL) "" $($0) $(MAXIMUM_ALLOWED) SoftwareKey ! 1134: ! 1135: Ifstr $(SoftwareKey) == $(KeyNull) ! 1136: Debug-Output "UTILITY.INF: could not open Software base key" ! 1137: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 1138: goto DecrementRefCount_Return ! 1139: endif ! 1140: ! 1141: GetRegValue $(SoftwareKey),"RefCount", RefCountInfo ! 1142: set RefCount = *($(RefCountInfo), 4) ! 1143: ifint $(RefCount) == 0 ! 1144: ; something wrong ! 1145: goto DecrementRefCount_Return ! 1146: endif ! 1147: Set-sub RefCount = $(RefCount),1 ! 1148: SetRegValue $(SoftwareKey) {RefCount,$(NoTitle),$(!REG_VT_DWORD),$(RefCount)} ! 1149: CloseRegKey $(SoftwareKey) ! 1150: ! 1151: DecrementRefCount_Return = + ! 1152: return $(RegistryErrorIndex) ! 1153: ! 1154: ;************************************************************************* ! 1155: ; end of section DecrementRefCount ! 1156: ;************************************************************************* ! 1157: ! 1158: ;************************************************************************* ! 1159: ; ! 1160: ; SECTION: IsRefCountEqual0 ! 1161: ; ! 1162: ; PURPOSE: check the reference counter in the registry is equal to 0 or ! 1163: ; not ! 1164: ; ! 1165: ; ARGUMENTS: $0 Registry key name ! 1166: ; ! 1167: ; RETURNS: $R0 Registry error code ! 1168: ; $R1 0 - if ref count != 0 ! 1169: ; 1 - if ref count = 0 ! 1170: ; ! 1171: ; REFERENCES: Nothing ! 1172: ; ! 1173: ; MODIFIES: Nothing ! 1174: ; ! 1175: ; ! 1176: ;************************************************************************* ! 1177: [IsRefCountEqualZero] ! 1178: read-syms InitBaseVars ! 1179: ! 1180: OpenRegKey $(!REG_H_LOCAL) "" $($0) $(MAXIMUM_ALLOWED) SoftwareKey ! 1181: ! 1182: Ifstr $(SoftwareKey) == $(KeyNull) ! 1183: Debug-Output "UTILITY.INF: could not open Software base key" ! 1184: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 1185: goto IsRefCountEqualZero_Return ! 1186: endif ! 1187: ! 1188: GetRegValue $(SoftwareKey),"RefCount", RefCountInfo ! 1189: set RefCount = *($(RefCountInfo), 4) ! 1190: Ifint $(RefCount) == 0 ! 1191: set RefCountEqualZero = 1 ! 1192: else ! 1193: set RefCountEqualZero = 0 ! 1194: endif ! 1195: CloseRegKey $(SoftwareKey) ! 1196: ! 1197: IsRefCountEqualZero_Return = + ! 1198: return $(RegistryErrorIndex) $(RefCountEqualZero) ! 1199: ! 1200: ! 1201: ;************************************************************************* ! 1202: ; ! 1203: ; SECTION: FindService ! 1204: ; ! 1205: ; PURPOSE: Given a hardware or software component key handle, ! 1206: ; return a key handle to the corresponding Service entry ! 1207: ; ! 1208: ; ARGUMENTS: $0 Registry key handle to primary component ! 1209: ; $1 type of component (adapter, etc.) ! 1210: ; ! 1211: ; RETURNS: $R0 Registry error code ! 1212: ; $R1 Registry key handle for Service area ! 1213: ; $R2 Registry key handle for Parameters subkey ! 1214: ; ! 1215: ; REFERENCES: Nothing ! 1216: ; ! 1217: ; MODIFIES: Nothing ! 1218: ; ! 1219: ; ! 1220: ;************************************************************************* ! 1221: [FindService] ! 1222: read-syms InitBaseVars ! 1223: ! 1224: set FS_KeyThisService = "" ! 1225: set FS_KeyParameters = "" ! 1226: set FS_KeyComponent = $($0) ! 1227: set FS_TypeComponent = $($1) ! 1228: ! 1229: Shell "", BaseServiceKey ! 1230: ! 1231: set FS_KeyServices = $($R1) ! 1232: set RegistryErrorIndex = $($R0) ! 1233: ! 1234: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1235: goto F_S_Return ! 1236: endif ! 1237: ; ! 1238: ; Obtain the all the values for the component key. ! 1239: ; ! 1240: EnumRegValue $(FS_KeyComponent) FS_ValueList ! 1241: ! 1242: ; BUGBUG: Check RegLastError ! 1243: ! 1244: set FS_SvcName = "" ! 1245: ! 1246: ForListDo $(FS_ValueList) ! 1247: set FS_ValueName = *($($),1) ! 1248: Ifstr(i) $(FS_ValueName) == ServiceName ! 1249: set FS_SvcName = *($($),4) ! 1250: goto F_S_Break1 ! 1251: endif ! 1252: EndForListDo ! 1253: F_S_Break1 = + ! 1254: ! 1255: Ifstr $(FS_SvcName) == $(KeyNull) ! 1256: set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE ! 1257: goto F_S_Return ! 1258: endif ! 1259: ! 1260: OpenRegKey $(FS_KeyServices) "" $(FS_SvcName) $(MAXIMUM_ALLOWED) FS_KeyThisService ! 1261: Ifstr $(FS_KeyThisService) == $(KeyNull) ! 1262: set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE ! 1263: goto F_S_Return ! 1264: endif ! 1265: ! 1266: OpenRegKey $(FS_KeyThisService) "" "Parameters" $(MAXIMUM_ALLOWED) FS_KeyParameters ! 1267: Ifstr $(FS_KeyParameters) == $(KeyNull) ! 1268: set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE ! 1269: goto F_S_Return ! 1270: endif ! 1271: ! 1272: F_S_Return = + ! 1273: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1274: Ifstr $(FS_KeyParameters) != $(KeyNull) ! 1275: CloseRegKey $(FS_KeyParameters) ! 1276: endif ! 1277: Ifstr $(FS_KeyThisService) != $(KeyNull) ! 1278: CloseRegKey $(FS_KeyThisService) ! 1279: endif ! 1280: endif ! 1281: return $(RegistryErrorIndex), $(FS_KeyThisService) $(FS_KeyParameters) ! 1282: ! 1283: ;************************************************************************* ! 1284: ; end of section FindService ! 1285: ;************************************************************************* ! 1286: ;************************************************************************* ! 1287: ; ! 1288: ; SECTION: GetServiceParameters ! 1289: ; ! 1290: ; PURPOSE: Given a component key and type, return a list of ! 1291: ; all its current parameters ! 1292: ; ! 1293: ; ARGUMENTS: $0 Registry key handle to primary component ! 1294: ; $1 type of component (adapter, etc.) ! 1295: ; ! 1296: ; RETURNS: $R0 Registry error code ! 1297: ; $R1 Registry key handle for Service area ! 1298: ; $R2 Registry key handle for Parameters subkey ! 1299: ; $R3 Value list of all values under Parameters subkey ! 1300: ; ! 1301: ; REFERENCES: Nothing ! 1302: ; ! 1303: ; MODIFIES: Nothing ! 1304: ; ! 1305: ;************************************************************************* ! 1306: [GetServiceParameters] ! 1307: read-syms InitBaseVars ! 1308: set GP_KeyComponent = $($0) ! 1309: set GP_KeyService = "" ! 1310: set GP_KeyParameters = "" ! 1311: set GP_ValueList = {} ! 1312: ! 1313: FindService $(GP_KeyComponent) $($1) ! 1314: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1315: goto G_P_Return ! 1316: endif ! 1317: ! 1318: set GP_KeyService = $($R1) ! 1319: set GP_KeyParameters = $($R2) ! 1320: ! 1321: EnumRegValue $(GP_KeyParameters) GP_ValueList ! 1322: ! 1323: G_P_Return = + ! 1324: return $(RegistryErrorIndex) $(GP_KeyService) $(GP_KeyParameters) $(GP_ValueList) ! 1325: ! 1326: ;************************************************************************* ! 1327: ; end of section sectionname ! 1328: ;************************************************************************* ! 1329: ! 1330: ;************************************************************************* ! 1331: ; ! 1332: ; SECTION: AddSoftwareComponent ! 1333: ; ! 1334: ; PURPOSE: Adds all the Registry information necessary for ! 1335: ; a new software component. This involves creating ! 1336: ; the SOFTWARE area and the SERVICE area. ! 1337: ; ! 1338: ; ARGUMENTS: $0 name of Manufacturer ! 1339: ; $1 name of Product ! 1340: ; $2 service name to use (no imbedded blanks, etc.) ! 1341: ; $3 Display Name for service ! 1342: ; $4 full path name to the INF file for configuration ! 1343: ; $5 ImagePath ! 1344: ; $6 type of the software, ! 1345: ; see [CreateService] for complete list ! 1346: ; $7 service order group, if any or "" ! 1347: ; $8 dependency **list**, if any or {} ! 1348: ; $9 ObjectName. if "", it will set to "LocalSystem" ! 1349: ; $10 EventMessageFile [optional] ! 1350: ; $11 TypeSupported [optional] ! 1351: ; $12 event log location [optional] ! 1352: ; $13 error control value [optional] ! 1353: ; $14 event log source [optional] ! 1354: ; ! 1355: ; RETURNS: $R0 error code or zero if no error ! 1356: ; $R1 Registry key variable for ! 1357: ; SOFTWARE\Manufacturer\Product\Version key ! 1358: ; $R2 Registry key variable for ! 1359: ; SOFTWARE\...\NetRules ! 1360: ; $R3 Registry key handle for Services key ! 1361: ; $R4 "Parameters" key handle for Services area ! 1362: ; $R5 "Linkage" key handle for Services area ! 1363: ; ! 1364: ; REFERENCES: Nothing ! 1365: ; ! 1366: ; MODIFIES: Nothing ! 1367: ; ! 1368: ;************************************************************************* ! 1369: [AddSoftwareComponent] ! 1370: read-syms InitBaseVars ! 1371: ! 1372: set AS_MfgName = $($0) ! 1373: set AS_ProdName = $($1) ! 1374: set AS_SvcName = $($2) ! 1375: set AS_DisplayName = $($3) ! 1376: set AS_Infname = $($4) ! 1377: set AS_ImagePath = $($5) ! 1378: set AS_ServiceType = $($6) ! 1379: set AS_Group = $($7) ! 1380: set AS_Dependencies = $($8) ! 1381: set AS_ObjectName = $($9) ! 1382: set AS_EventFile = $($10) ! 1383: set AS_TypeSupported = $($11) ! 1384: set AS_EventLocation = $($12) ! 1385: set AS_ErrorCtlValue = $($13) ! 1386: set AS_EventSource = $($14) ! 1387: set AS_KeyVersion = "" ! 1388: set AS_KeyNetRules = "" ! 1389: set AS_KeyService = "" ! 1390: set AS_KeyParameters = "" ! 1391: set AS_KeyLinkage = "" ! 1392: ! 1393: ; ! 1394: ; Create the Service entry for this product ! 1395: ; ! 1396: Shell "", CreateService,$(AS_SvcName),$(AS_DisplayName),$(AS_ImagePath),+ ! 1397: $(AS_ServiceType),$(AS_Group),$(AS_Dependencies),$(AS_ObjectName),+ ! 1398: $(AS_EventFile),$(AS_TypeSupported),+ ! 1399: $(AS_EventLocation),$(AS_ErrorCtlValue),$(AS_EventSource) ! 1400: ! 1401: set RegistryErrorIndex = $($R0) ! 1402: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1403: goto A_S_Return ! 1404: endif ! 1405: ! 1406: set AS_KeyService = $($R1) ! 1407: set AS_KeyParameters = $($R2) ! 1408: set AS_KeyLinkage = $($R3) ! 1409: ; ! 1410: ; Service area is created. Create the software area and link them ! 1411: ; ! 1412: Shell "", InstallSoftwareProduct, $(AS_MfgName), $(AS_ProdName), $(AS_Infname) ! 1413: ! 1414: set RegistryErrorIndex = $($R0) ! 1415: Ifstr(i) $(RegistryErrorIndex) == NO_ERROR ! 1416: set AS_KeyVersion = $($R1) ! 1417: set AS_KeyNetRules = $($R2) ! 1418: Shell "", LinkToService, $(AS_KeyVersion), $(AS_SvcName), service ! 1419: ! 1420: set RegistryErrorIndex = $($R0) ! 1421: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1422: goto A_S_Return ! 1423: endif ! 1424: ! 1425: ; ! 1426: ; Add Reference Counter ! 1427: ; ! 1428: GetRegValue $(AS_KeyVersion),"RefCount", RefCountInfo ! 1429: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 1430: ; no RefCount variable ! 1431: SetRegValue $(AS_KeyVersion) {RefCount,$(NoTitle),$(!REG_VT_DWORD),0} ! 1432: endif ! 1433: ! 1434: endif ! 1435: ! 1436: A_S_Return = + ! 1437: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1438: Ifstr $(AS_KeyNetRules) != $(KeyNull) ! 1439: CloseRegKey $(AS_KeyNetRules) ! 1440: endif ! 1441: Ifstr $(AS_KeyParameters) != $(KeyNull) ! 1442: CloseRegKey $(AS_KeyParameters) ! 1443: endif ! 1444: Ifstr $(AS_KeyLinkage) != $(KeyNull) ! 1445: CloseRegKey $(AS_KeyLinkage) ! 1446: endif ! 1447: Ifstr $(AS_KeyVersion) != $(KeyNull) ! 1448: CloseRegKey $(AS_KeyVersion) ! 1449: Set AS_ProdKeyName = $(!NTN_SoftwareBase)"\"$(AS_MfgName)"\"$(AS_ProdName) ! 1450: OpenRegKey $(!REG_H_LOCAL) "" $(AS_ProdKeyName) $(MAXIMUM_ALLOWED) AS_KeyProduct ! 1451: Ifstr(i) $(AS_KeyProduct) != $(KeyNull) ! 1452: DeleteRegKey $(AS_KeyProduct) "CurrentVersion" ! 1453: CloseRegKey $(AS_KeyProduct) ! 1454: Endif ! 1455: Endif ! 1456: Ifstr $(AS_KeyService) != $(KeyNull) ! 1457: Debug-Output "UTILITY.INF: DeleteRegTree Service Key" ! 1458: ;DeleteRegTree $(AS_KeyService) "" ! 1459: endif ! 1460: ! 1461: set AS_KeyVersion = "" ! 1462: set AS_KeyNetRules = "" ! 1463: set AS_KeyService = "" ! 1464: set AS_KeyParameters = "" ! 1465: set AS_KeyLinkage = "" ! 1466: ! 1467: endif ! 1468: return $(RegistryErrorIndex), $(AS_KeyVersion), $(AS_KeyNetRules), $(AS_KeyService),+ ! 1469: $(AS_KeyParameters), $(AS_KeyLinkage) ! 1470: ! 1471: ;************************************************************************* ! 1472: ; end of section AddSoftwareComponent ! 1473: ;************************************************************************* ! 1474: ! 1475: ;************************************************************************* ! 1476: ; ! 1477: ; SECTION: AddHardwareComponent ! 1478: ; ! 1479: ; PURPOSE: Adds all the Registry information necessary for ! 1480: ; a new network adapater card ! 1481: ; ! 1482: ; ARGUMENTS: $0 service name to use (no imbedded blanks, etc.). ! 1483: ; This name will have the numeric value from ! 1484: ; InstallNetCard appended to it for uniqueness. ! 1485: ; $1 INF name for this adapter ! 1486: ; $2 Driver name in software section ! 1487: ; ! 1488: ; ! 1489: ; RETURNS: $R0 Registry error code or zero if no error ! 1490: ; $R1 Registry key variable for HARDWARE\Netcard\(n) ! 1491: ; $R2 Registry key variable for HARDWARE\Netcard\(n)\\NetRules ! 1492: ; $R3 Registry key handle for <service>\Parameters key ! 1493: ; $R4 Adapter number assigned to adapter ! 1494: ; $R5 Service name generated by combining svc name with ! 1495: ; adapter number ! 1496: ; ! 1497: ; REFERENCES: Nothing ! 1498: ; ! 1499: ; MODIFIES: Nothing ! 1500: ; ! 1501: ;************************************************************************* ! 1502: [AddHardwareComponent] ! 1503: ! 1504: read-syms InitBaseVars ! 1505: ! 1506: set AH_SvcName = $($0) ! 1507: set AH_Infname = $($1) ! 1508: set AH_SoftwareName = $($2) ! 1509: set AH_KeyNetcard = "" ! 1510: set AH_KeyNetRules = "" ! 1511: set AH_KeyService = "" ! 1512: set AH_KeyParameters = "" ! 1513: set AH_AdapNum = -1 ! 1514: ; ! 1515: ; Create the HARDWARE\Netcard entry for this adapter ! 1516: ; ! 1517: Shell "", InstallNetcard, $(AH_Infname) ! 1518: ! 1519: set RegistryErrorIndex = $($R0) ! 1520: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1521: Debug-Output "UTILITY.INF: [AddHardwareComponent] InstallNetcard returned: "$(RegistryErrorIndex) ! 1522: goto A_H_Return ! 1523: endif ! 1524: ! 1525: set AH_KeyNetcard = $($R1) ! 1526: set AH_AdapNum = $($R2) ! 1527: set AH_SvcName = $(AH_SvcName)$(AH_AdapNum) ! 1528: set AH_KeyNetRules = $($R3) ! 1529: ; ! 1530: ; Create the SERVICES entry for this adapter; no binary path, no group, ! 1531: ; no dependencies. ! 1532: ; ! 1533: Shell "", CreateService, $(AH_SvcName), "", "", "adapter","",{} ! 1534: ! 1535: set RegistryErrorIndex = $($R0) ! 1536: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1537: Debug-Output "UTILITY.INF: CreateService returned "$(RegistryErrorIndex) ! 1538: goto A_H_Return ! 1539: endif ! 1540: ! 1541: CloseRegKey $($R1) ! 1542: set AH_KeyParameters = $($R2) ! 1543: CloseRegKey $($R3) ! 1544: ! 1545: ; ! 1546: ; Link the Netcard entry to the Service created ! 1547: ; ! 1548: Shell "", LinkToService, $(AH_KeyNetcard), $(AH_SvcName) ! 1549: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1550: Debug-Output "UTILITY.INF: [AddHardwareComponent] LinkToService returned "$(RegistryErrorIndex) ! 1551: goto A_H_Return ! 1552: endif ! 1553: ! 1554: ; ! 1555: ; Add the reference counter in the driver section ! 1556: ; ! 1557: Shell "", IncrementRefCount, $(AH_SoftwareName) ! 1558: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1559: Debug-Output "UTILITY.INF: [AddHardwareComponent] IncrementRefCount returned "$(RegistryErrorIndex) ! 1560: goto A_H_Return ! 1561: endif ! 1562: ! 1563: A_H_Return = + ! 1564: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 1565: Debug-Output "UTILITY.INF: [AddHardwareComponent] returning error: "$(RegistryErrorIndex) ! 1566: Ifstr(i) $(AH_KeyNetRules) != $(KeyNull) ! 1567: CloseRegKey $(AH_KeyNetRules) ! 1568: Endif ! 1569: Ifstr(i) $(AH_KeyNetcard) != $(KeyNull) ! 1570: ; Let the RemoveHardware handle it ! 1571: ;DeleteRegTree $(AH_KeyNetcard) "" ! 1572: Endif ! 1573: set AH_KeyNetRules = "" ! 1574: set AH_KeyNetcard = "" ! 1575: endif ! 1576: ! 1577: return $(RegistryErrorIndex), $(AH_KeyNetcard), $(AH_KeyNetRules), $(AH_KeyParameters),+ ! 1578: $(AH_AdapNum), $(AH_SvcName) ! 1579: ! 1580: ;************************************************************************* ! 1581: ; end of section AddHardwareComponent ! 1582: ;************************************************************************* ! 1583: ! 1584: ;************************************************************************* ! 1585: ; ! 1586: ; SECTION: MCAFindBus ! 1587: ; ! 1588: ; PURPOSE: Find adpater(s) location ! 1589: ; ! 1590: ; ARGUMENTS: $0 The least signifiance byte of the device ID ! 1591: ; $1 The most signifiance byte of the device ID ! 1592: ; ! 1593: ; ! 1594: ; RETURNS: $R0 Registry error code or zero if no error ! 1595: ; $R1 The list of adapter location ! 1596: ; {{bus0,slot0},{bus1,slot1},{bus2,slot2}...{busk,slotk}} ! 1597: ; ! 1598: ; REFERENCES: Nothing ! 1599: ; ! 1600: ; MODIFIES: Nothing ! 1601: ; ! 1602: ;************************************************************************* ! 1603: ! 1604: [MCAFindBus] ! 1605: read-syms InitBaseVars ! 1606: set RegistryErrorIndex = NO_ERROR ! 1607: ! 1608: set MultifunctionAdapter = "HARDWARE\Description\System\MultifunctionAdapter" ! 1609: set InfoList = {} ! 1610: ! 1611: OpenRegKey $(!REG_H_LOCAL) "" $(MultifunctionAdapter) $(MAXIMUM_ALLOWED) KeyMultiAdapter ! 1612: ! 1613: Ifstr $(KeyMultiAdapter) == $(KeyNull) ! 1614: goto MCAFindBus_return ! 1615: endif ! 1616: ! 1617: EnumRegKey $(KeyMultiAdapter) BusList ! 1618: ! 1619: Debug-Output "Buslist" ! 1620: Debug-Output $(BusList) ! 1621: ! 1622: ForListDo $(BusList) ! 1623: set BusNum = *($($),1) ! 1624: set RegName = $(MultifunctionAdapter)"\"$(BusNum) ! 1625: Debug-Output "BusNum" ! 1626: Debug-Output $(BusNum) ! 1627: OpenRegKey $(!REG_H_LOCAL) "" $(RegName) $(MAXIMUM_ALLOWED) KeyBus ! 1628: ! 1629: ifstr $(KeyBus) != $(KeyNull) ! 1630: GetRegValue $(KeyBus),"Configuration Data",ConfigData ! 1631: ifstr $(ConfigData) != $(KeyNull) ! 1632: set CardInfo = *($(ConfigData), 4 ) ! 1633: ; ! 1634: ; Skip the header and jump to data position 33 ! 1635: ; ! 1636: set Position = 33 ! 1637: set SlotNum = 1 ! 1638: QueryListSize ListSize $(CardInfo) ! 1639: Loop1 =+ ! 1640: ifint $(Position) < $(ListSize) ! 1641: set-add NextByte = $(Position), 1 ! 1642: ifint *($(CardInfo), $(Position)) == $($0) ! 1643: ifint *($(CardInfo), $(NextByte)) == $($1) ! 1644: ; ! 1645: ; Set up the hardware ! 1646: ; ! 1647: Debug-Output $(BusNum) ! 1648: Debug-Output $(SlotNum) ! 1649: set-mul mcaid = $($1), 256 ! 1650: set-add mcaid = $(mcaid), $($0) ! 1651: set InfoList = >($(InfoList),{$(BusNum),$(SlotNum),$(mcaid)}) ! 1652: endif ! 1653: endif ! 1654: set-add Position = $(Position), 6 ! 1655: set-add SlotNum = $(SlotNum), 1 ! 1656: goto Loop1 ! 1657: endif ! 1658: endif ! 1659: CloseRegKey $(KeyBus) ! 1660: endif ! 1661: EndForListDo ! 1662: ! 1663: CloseRegKey $(KeyMultiAdapter) ! 1664: ! 1665: MCAFindBus_return = + ! 1666: ! 1667: return $(RegistryErrorIndex) $(InfoList) ! 1668: ! 1669: ;************************************************************************* ! 1670: ; end of section MCAFindBus ! 1671: ;************************************************************************* ! 1672: ! 1673: ;************************************************************************* ! 1674: ; ! 1675: ; SECTION: EISAFindBus ! 1676: ; ! 1677: ; PURPOSE: Find adpater(s) location ! 1678: ; ! 1679: ; ARGUMENTS: $0 The compress ID of the EISA card ! 1680: ; $1 EISA Compressed ID mask ! 1681: ; ! 1682: ; ! 1683: ; RETURNS: $R0 Registry error code or zero if no error ! 1684: ; $R1 The list of adapter location ! 1685: ; {{bus0,slot0},{bus1,slot1},{bus2,slot2}...{busk,slotk}} ! 1686: ; ! 1687: ; REFERENCES: Nothing ! 1688: ; ! 1689: ; MODIFIES: Nothing ! 1690: ; ! 1691: ;************************************************************************* ! 1692: ! 1693: [EISAFindBus] ! 1694: read-syms InitBaseVars ! 1695: set MaskNum = $($1) ! 1696: ifstr(i) $($1) == "" ! 1697: set MaskNum = 16777215 ; 0xffffff ! 1698: endif ! 1699: ! 1700: set RegistryErrorIndex = NO_ERROR ! 1701: ! 1702: set EISAAdapter = "HARDWARE\Description\System\EISAAdapter" ! 1703: set InfoList = {} ! 1704: ! 1705: OpenRegKey $(!REG_H_LOCAL) "" $(EISAAdapter) $(MAXIMUM_ALLOWED) KeyEISAAdapter ! 1706: ! 1707: Ifstr $(KeyEISAAdapter) == $(KeyNull) ! 1708: goto EISAFindBus_return ! 1709: endif ! 1710: ! 1711: EnumRegKey $(KeyEISAAdapter) BusList ! 1712: ! 1713: Debug-Output "Buslist" ! 1714: Debug-Output $(BusList) ! 1715: ! 1716: ForListDo $(BusList) ! 1717: set BusNum = *($($),1) ! 1718: OpenRegKey $(!REG_H_LOCAL) "" $(EISAAdapter)"\"$(BusNum) $(MAXIMUM_ALLOWED) KeyEISAAdapterBus ! 1719: LibraryProcedure SlotList, $(!LIBHANDLE), GetEisaSlotInformation, $(KeyEISAAdapterBus), "Configuration Data", $($0), $(MaskNum) ! 1720: ifstr(i) $(SlotList) != {} ! 1721: ForListDo $(SlotList) ! 1722: set SlotNum = $($) ! 1723: ifstr(i) $(SlotNum) != "ERROR" ! 1724: Debug-Output $(BusNum) ! 1725: Debug-Output $(SlotNum) ! 1726: set InfoList = >($(InfoList),{$(BusNum),$(SlotNum),$($0)}) ! 1727: endif ! 1728: EndForListDo ! 1729: endif ! 1730: EndForListDo ! 1731: ! 1732: CloseRegKey $(KeyEISAAdapter) ! 1733: ! 1734: EISAFindBus_return = + ! 1735: ! 1736: return $(RegistryErrorIndex) $(InfoList) ! 1737: ! 1738: ;************************************************************************* ! 1739: ; end of section EISAFindBus ! 1740: ;************************************************************************* ! 1741: ! 1742: ;************************************************************************* ! 1743: ; ! 1744: ; SECTION: AddNetworkProvider ! 1745: ; ! 1746: ; PURPOSE: Add a network provider entry into the registry ! 1747: ; ! 1748: ; ARGUMENTS: $0 network provider id. i.e., lanmanredirector ! 1749: ; $1 network provder location. i.e, c:\nt\windows\system\ntlanman.dll ! 1750: ; $2 English name of the provider. i.e, NT Lan Manager ! 1751: ; $3 network provider device name, if different from network ! 1752: ; provider ! 1753: ; ! 1754: ; ! 1755: ; RETURNS: $R0 Registry error code or zero if no error ! 1756: ; ! 1757: ; REFERENCES: Nothing ! 1758: ; ! 1759: ; MODIFIES: Nothing ! 1760: ; ! 1761: ;************************************************************************* ! 1762: ! 1763: [AddNetworkProvider] ! 1764: read-syms InitBaseVars ! 1765: ! 1766: set RegistryErrorIndex = NO_ERROR ! 1767: ! 1768: set ProviderDeviceName = $($3) ! 1769: ifstr(i) $(ProviderDeviceName) == "" ! 1770: set ProviderDeviceName = $($0) ! 1771: endif ! 1772: ! 1773: ; OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\NetworkProvider\Active\"$($0) $(MAXIMUM_ALLOWED) ActiveKey ! 1774: ; ifstr(i) $(OrderKey) == $(KeyNull) ! 1775: ; CreateRegKey $(!REG_H_LOCAL) {$(CurrentControlSet)"\control\NetworkProvider\Active\"$($0),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" ActiveKey ! 1776: ; endif ! 1777: ! 1778: OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\NetworkProvider\order" $(MAXIMUM_ALLOWED) OrderKey ! 1779: ifstr(i) $(OrderKey) == $(KeyNull) ! 1780: CreateRegKey $(!REG_H_LOCAL) {$(CurrentControlSet)"\control\NetworkProvider\order",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" OrderKey ! 1781: endif ! 1782: ! 1783: GetRegValue $(OrderKey) "ProviderOrder" OrderValue ! 1784: set Order = *($(OrderValue), 4 ) ! 1785: ifstr(i) $(OrderValue) == $(KeyNull) ! 1786: goto AddFirstProvider ! 1787: else-ifstr(i) $(Order) == $(KeyNull) ! 1788: goto AddFirstProvider ! 1789: else ! 1790: goto AddProvider ! 1791: endif ! 1792: ! 1793: AddFirstProvider = + ! 1794: SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_SZ),$($0)} ! 1795: goto WriteProviderInfo ! 1796: ! 1797: AddProvider = + ! 1798: Split-String $(Order) "," OrderList ! 1799: ifContains(i) $($0) in $(OrderList) ! 1800: ; Enable if we cannot have the same provider ! 1801: ; ! 1802: ;set RegistryErrorIndex = PROVIDER_ALREADY_EXISTED ! 1803: ;goto AddnetworkProvider_return ! 1804: else ! 1805: set Order = $(Order)","$($0) ! 1806: SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_SZ),$(Order)} ! 1807: endif ! 1808: ! 1809: goto WriteProviderInfo ! 1810: ! 1811: WriteProviderInfo = + ! 1812: ! 1813: CloseRegKey $(OrderKey) ! 1814: ! 1815: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\"$($0)"\networkprovider" $(MAXIMUM_ALLOWED) ProviderKey ! 1816: ! 1817: Ifstr(i) $(ProviderKey) == $(KeyNull) ! 1818: CreateRegKey $(!REG_H_LOCAL) {$(ServicesBaseName)"\"$($0)"\networkprovider",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" ProviderKey ! 1819: endif ! 1820: ! 1821: set NewValueList = {{Devicename,$(NoTitle),$(!REG_VT_SZ),"\device\"$(ProviderDeviceName)},+ ! 1822: {ProviderPath, $(NoTitle), $(!REG_VT_EXPAND_SZ), $($1)},+ ! 1823: {Name, $(NoTitle), $(!REG_VT_SZ), $($2)}} ! 1824: ! 1825: Shell "" AddValueList $(ProviderKey) $(NewValueList) ! 1826: ! 1827: CloseRegKey $(ProviderKey) ! 1828: ! 1829: AddNetworkProvider_return = + ! 1830: ! 1831: return $(RegistryErrorIndex) ! 1832: ! 1833: ;************************************************************************* ! 1834: ; end of section AddNetworkProvider ! 1835: ;************************************************************************* ! 1836: ! 1837: ;************************************************************************* ! 1838: ; ! 1839: ; SECTION: RemoveNetworkProvider ! 1840: ; ! 1841: ; PURPOSE: Remove network provider entry ! 1842: ; ! 1843: ; ARGUMENTS: $0 provider name ! 1844: ; ! 1845: ; RETURNS: $R0 Registry error code or zero if no error ! 1846: ; ! 1847: ; REFERENCES: Nothing ! 1848: ; ! 1849: ; MODIFIES: Nothing ! 1850: ; ! 1851: ;************************************************************************* ! 1852: ! 1853: [RemoveNetworkProvider] ! 1854: read-syms InitBaseVars ! 1855: ! 1856: set RegistryErrorIndex = NO_ERROR ! 1857: ! 1858: OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\NetworkProvider\order" $(MAXIMUM_ALLOWED) OrderKey ! 1859: ifstr(i) $(OrderKey) == $(KeyNull) ! 1860: set RegistryErrorIndex = PROVIDER_ORDER_DOES_NOT_EXIST ! 1861: goto RemoveNetworkProvider_return ! 1862: endif ! 1863: ! 1864: GetRegValue $(OrderKey) "ProviderOrder" OrderValue ! 1865: set Order = *($(OrderValue), 4 ) ! 1866: ! 1867: Split-String $(Order) "," OrderList ! 1868: set NewOrderList = {} ! 1869: set FirstTime = TRUE ! 1870: set Found = FALSE ! 1871: ForListDo $(OrderList) ! 1872: ifstr(i) $($) != "," ! 1873: ifstr(i) $($) != $($0) ! 1874: ifstr(i) $(FirstTime) == TRUE ! 1875: set FirstTime = FALSE ! 1876: set NewOrderList = $($) ! 1877: else ! 1878: set NewOrderList = $(NewOrderList)","$($) ! 1879: endif ! 1880: else ! 1881: set Found = TRUE ! 1882: endif ! 1883: endif ! 1884: EndForListDo ! 1885: ! 1886: ifstr(i) $(Found) == FALSE ! 1887: set RegistryErrorIndex = PROVIDER_ORDER_DOES_NOT_EXIST ! 1888: goto RemoveNetworkProvider_return ! 1889: else ! 1890: ifstr(i) $(NewOrderList) == {} ! 1891: set NewOrderList = "" ! 1892: endif ! 1893: SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_SZ),$(NewOrderList)} ! 1894: endif ! 1895: ! 1896: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName) $(MAXIMUM_ALLOWED) ProviderKey ! 1897: ! 1898: ifstr $(ProviderKey) != $(KeyNull) ! 1899: DeleteRegTree $(ProviderKey) $($0) ! 1900: endif ! 1901: ! 1902: RemoveNetworkProvider_return = + ! 1903: return $(RegistryErrorIndex) ! 1904: ! 1905: ;************************************************************************* ! 1906: ; ! 1907: ; SECTION: PrepareToCopy ! 1908: ; ! 1909: ; PURPOSE: Establish the variables required to perform ! 1910: ; "CopyFilesInCopyList" ! 1911: ; ! 1912: ; ARGUMENTS: none ! 1913: ; ! 1914: ; RETURNS: $R0 STATUS_SUCCESSFUL ! 1915: ; ! 1916: ; REFERENCES: nothing ! 1917: ; ! 1918: ; MODIFIES: see [ProgressCopyEng] above for list of variables ! 1919: ; modified/created in parent context. ! 1920: ; ! 1921: ; NOTES: Read NOTES commentary for section [DoAskSource] ! 1922: ; ! 1923: ;************************************************************************* ! 1924: [PrepareToCopy] ! 1925: ; ! 1926: ; Read the progress copy symbols. ! 1927: ; ! 1928: Read-syms ProgressCopy$(!STF_LANGUAGE) ! 1929: ! 1930: Return STATUS_SUCCESSFUL ! 1931: ! 1932: ;************************************************************************* ! 1933: ; end of section PrepareToCopy ! 1934: ;************************************************************************* ! 1935: ! 1936: ! 1937: ;************************************************************************* ! 1938: ; ! 1939: ; SECTION: DoAskSource ! 1940: ; ! 1941: ; PURPOSE: Determine or ask to location of the network binaries ! 1942: ; ! 1943: ; ARGUMENTS: $0 current value of STF_CWDDIR ! 1944: ; $1 current value of STF_SRCDIR ! 1945: ; $2 "YES" if part of NT base product (i.e., not OEM) ! 1946: ; "NO" otherwise. ! 1947: ; ! 1948: ; RETURNS: $R0: STATUS: STATUS_SUCCESSFUL | ! 1949: ; STATUS_USERCANCEL | ! 1950: ; STATUS_FAILED ! 1951: ; $R1 path to sources ! 1952: ; ! 1953: ; REFERENCES: Nothing ! 1954: ; ! 1955: ; MODIFIES: !STF_SRCDIR_USED changed to point to the user's ! 1956: ; keyed location ! 1957: ; !STF_SRCDIR_KEYED ! 1958: ; ! 1959: ; NOTES: The SETUP copy operations read the symbol table the old way; ! 1960: ; this means that they will only utilize local symbols for ! 1961: ; the necessary progress variables. This section/function assumes ! 1962: ; that it's being called by an INF at THE EXACT SAME CONTEXT LEVEL ! 1963: ; AT WHICH THE INSTALL FUNCTION WILL BE INVOKED! It stores the ! 1964: ; values specifically into the parent context so the progress dialog ! 1965: ; function can see them. ! 1966: ; ! 1967: ;************************************************************************* ! 1968: [DoAskSource] ! 1969: Set DAS_CWDDIR = $($0) ! 1970: Set DAS_SRCDIR = $($1) ! 1971: Set DAS_BUILTIN = $($2) ! 1972: Set DAS_Result = STATUS_FAILED ! 1973: ; ! 1974: ; If !STF_SRCDIR_OVERRIDE is not empty, use it instead. ! 1975: ; ! 1976: Ifstr(i) $(!STF_SRCDIR_OVERRIDE) != "" ! 1977: Set DAS_SRCDIR = $(!STF_SRCDIR_OVERRIDE) ! 1978: Set DAS_Result = STATUS_SUCCESSFUL ! 1979: Goto DAS_exit ! 1980: Endif ! 1981: ; ! 1982: ; If this is a built-in component during primary installation, ! 1983: ; use the given source path automatically unless !SFT_SRCDIR_WINNT ! 1984: ; is set. This is for the WINNT case, where Setup's SourcePath lies. ! 1985: ; ! 1986: Ifstr(i) $(DAS_BUILTIN) == YES ! 1987: Ifstr(i) $(!NTN_InstallPhase) == primary ! 1988: Ifstr(i) $(!STF_SRCDIR_WINNT) != "" ! 1989: Set DAS_SRCDIR = $(!STF_SRCDIR_WINNT) ! 1990: Endif ! 1991: Set DAS_Result = STATUS_SUCCESSFUL ! 1992: Goto DAS_exit ! 1993: Endif ! 1994: Endif ! 1995: ! 1996: Debug-Output "UTILITY.INF: [DoAskSource] STF_CWDDIR = "$(DAS_CWDDIR)" STF_SRCDIR = "$(DAS_SRCDIR) ! 1997: ; ! 1998: ; Set default to drive A: if necessary ! 1999: ; ! 2000: Ifstr(i) $(DAS_SRCDIR) == "" ! 2001: Set DAS_SRCDIR = "A:\" ! 2002: Endif ! 2003: ; ! 2004: ; If this is the same SRCDIR as last time, replace it with the string ! 2005: ; actually keyed by the user. This causes UNC names to reappear in their ! 2006: ; original form; the name of the automatically "used" remote drive should ! 2007: ; never be shown. ! 2008: ; ! 2009: Ifstr(i) $(DAS_SRCDIR) == $(!STF_SRCDIR_USED) ! 2010: Set DAS_SRCDIR = $(!STF_SRCDIR_KEYED) ! 2011: Endif ! 2012: ; ! 2013: ; Ask for the setup sources ! 2014: ; ! 2015: Shell "subroutn.inf" DoAskSource $(DAS_SRCDIR) ! 2016: ! 2017: ifint $($ShellCode) != $(!SHELL_CODE_OK) ! 2018: Debug-Output "UTILITY.INF: shelling SUBROUTN.INF [DoAskSource] failed" ! 2019: goto DAS_exit ! 2020: endif ! 2021: ! 2022: Set DAS_Result = $($R0) ! 2023: ! 2024: Ifstr(i) $(DAS_Result) == STATUS_USERCANCEL ! 2025: ; ! 2026: ; BUGBUG: All the INFs should change to handle this correctly. ! 2027: ; ! 2028: Set !p:CommonStatus = STATUS_USERCANCEL ! 2029: goto DAS_exit ! 2030: Endif ! 2031: ! 2032: Set DAS_SRCDIR = $($R1) ! 2033: ; ! 2034: ; Save the actual and converted SRCDIRs ! 2035: ; ! 2036: Set !STF_SRCDIR_USED = $($R1) ! 2037: Set !STF_SRCDIR_KEYED = $($R3) ! 2038: ! 2039: DAS_exit =+ ! 2040: ; ! 2041: ; Read the progress copy symbols. ! 2042: ; ! 2043: Read-syms ProgressCopy$(!STF_LANGUAGE) ! 2044: ! 2045: Return $(DAS_Result) $(DAS_SRCDIR) ! 2046: ! 2047: ;************************************************************************* ! 2048: ; end of section DoAskSource ! 2049: ;************************************************************************* ! 2050: ! 2051: ;************************************************************************* ! 2052: ; ! 2053: ; SECTION: RemoveSoftwareComponent ! 2054: ; ! 2055: ; PURPOSE: Remove the specified software component from the ! 2056: ; registry. It will remove the entry in the software ! 2057: ; section of the registry first. Then it will remove ! 2058: ; the entry in the service section of the registry. ! 2059: ; ! 2060: ; ARGUMENTS: $0 Manufacturer Name ! 2061: ; $1 Product Name ! 2062: ; $2 Boolean flag for zero reference count checking ! 2063: ; ( optional. If it is defined, skip checking ) ! 2064: ; ! 2065: ; ! 2066: ; RETURNS: $R0 Registry error code or zero if no error ! 2067: ; ! 2068: ; REFERENCES: Nothing ! 2069: ; ! 2070: ; MODIFIES: Nothing ! 2071: ; ! 2072: ;************************************************************************* ! 2073: ! 2074: [RemoveSoftwareComponent] ! 2075: Debug-Output "Remove Software Component..." ! 2076: ! 2077: read-syms InitBaseVars ! 2078: ! 2079: set RS_Manufacturer = $($0) ! 2080: set RS_ProductName = $($1) ! 2081: set RS_CheckRefCount = $($2) ! 2082: set RS_VersionNum = "CurrentVersion" ! 2083: set RS_ManufacturerKey = $(!NTN_SoftwareBase)"\"$(RS_Manufacturer) ! 2084: set RS_ProductKey = $(!NTN_SoftwareBase)"\"$(RS_Manufacturer)"\"$(RS_ProductName) ! 2085: set RS_ProductVerKey = $(!NTN_SoftwareBase)"\"$(RS_Manufacturer)"\"$(RS_ProductName)"\"$(RS_VersionNum) ! 2086: ! 2087: set RegistryErrorIndex = NO_ERROR ! 2088: ! 2089: ; ! 2090: ; Check the reference counter first ! 2091: ; ! 2092: ifstr(i) $(RS_CheckRefCount) != FALSE ! 2093: ! 2094: Shell "", IsRefCountEqualZero, $(RS_ProductVerKey) ! 2095: ! 2096: Ifstr(i) $($R0) != NO_ERROR ! 2097: Debug-Output "UTILITY.INF: [RemoveSoftwareComponent] IsRefCountEqualZero returned "$($R0) ! 2098: goto RemoveSoftwareComponent_Return ! 2099: endif ! 2100: ! 2101: Ifint $($R1) == 0 ! 2102: set RegistryErrorIndex = REF_COUNT_NOT_ZERO ! 2103: goto RemoveSoftwareComponent_Return ! 2104: endif ! 2105: ! 2106: endif ! 2107: ! 2108: ; ! 2109: ; Remove the software first ! 2110: ; ! 2111: ! 2112: OpenRegKey $(!REG_H_LOCAL) "" $(RS_ManufacturerKey) $(MAXIMUM_ALLOWED) ProductKey ! 2113: ! 2114: Ifstr $(ProductKey) == $(KeyNull) ! 2115: Debug-Output "UTILITY.INF: could not open Software product key" ! 2116: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2117: goto RemoveSoftwareComponent_Return ! 2118: endif ! 2119: ! 2120: DeleteRegTree $(ProductKey) $(RS_ProductName) ! 2121: ! 2122: CloseRegKey $(ProductKey) ! 2123: ! 2124: ; ! 2125: ; Remove the service ! 2126: ; ! 2127: Shell "" RemoveService, $(RS_ProductName), "YES" ! 2128: ! 2129: Set RS_RemoveError = $($R0) ! 2130: Ifint $(RS_RemoveError) != 0 ! 2131: Debug-Output "UTILITY.INF: RemoveService wrapper failed, error: "$(RS_RemoveResult) ! 2132: Set RegistryErrorIndex = UNABLE_REMOVE_CONFIGURE_SERVICE ! 2133: Goto RemoveSoftwareComponent_Return ! 2134: Endif ! 2135: ! 2136: RemoveSoftwareComponent_Return = + ! 2137: ! 2138: Return $(RegistryErrorIndex) ! 2139: ! 2140: ;************************************************************************* ! 2141: ; end of section RemoveSoftwareComponent ! 2142: ;************************************************************************* ! 2143: ! 2144: ;************************************************************************* ! 2145: ; ! 2146: ; SECTION: RemoveHardwareComponent ! 2147: ; ! 2148: ; PURPOSE: Remove the adapter entry from the registry. First ! 2149: ; remove the adapter entry under Networkcards. Then it ! 2150: ; will remove the service entry under SYSTEM. ! 2151: ; ! 2152: ; ARGUMENTS: $0 Manufacturer Name (i.e., 3Com) ! 2153: ; $1 Product Name (i.e., Elnk) ! 2154: ; $2 Net Card Name (i.e., Elnkii05) ! 2155: ; ! 2156: ; ! 2157: ; RETURNS: $R0 Registry error code or zero if no error ! 2158: ; ! 2159: ; REFERENCES: Nothing ! 2160: ; ! 2161: ; MODIFIES: Nothing ! 2162: ; ! 2163: ;************************************************************************* ! 2164: ! 2165: [RemoveHardwareComponent] ! 2166: Debug-Output "Remove Hardware Component..." ! 2167: read-syms InitBaseVars ! 2168: ! 2169: set RH_Manufacturer = $($0) ! 2170: set RH_ProductName = $($1) ! 2171: set RH_VersionNum = "CurrentVersion" ! 2172: set RH_ProductKey = $(!NTN_SoftwareBase)"\"$($0)"\"$($1)"\"$(RH_VersionNum) ! 2173: set RH_NetCardName = $($2) ! 2174: Split-String $(RH_NetCardName), "\", CardInfo ! 2175: set RH_NetCardNum = *($(CardInfo),11) ! 2176: set RH_NetCardBase = *($(CardInfo),1)*($(CardInfo),2)*($(CardInfo),3)*($(CardInfo),4)*($(CardInfo),5)*($(CardInfo),6)*($(CardInfo),7)*($(CardInfo),8)*($(CardInfo),9) ! 2177: ! 2178: set RegistryErrorIndex = NO_ERROR ! 2179: ! 2180: ; ! 2181: ; decrement the reference counter first ! 2182: ; ! 2183: ! 2184: Shell "", DecrementRefCount, $(RH_ProductKey) ! 2185: ! 2186: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 2187: Debug-Output "UTILITY.INF: [AddHardwareComponent] IncrementRefCount returned "$(RegistryErrorIndex) ! 2188: goto RemoveHardwareComponent_Return ! 2189: endif ! 2190: ! 2191: ; ! 2192: ; Remove the Net card first ! 2193: ; ! 2194: ! 2195: OpenRegKey $(!REG_H_LOCAL) "" $(RH_NetCardBase) $(MAXIMUM_ALLOWED) NetCardKey ! 2196: ! 2197: Ifstr $(NetCardKey) == $(KeyNull) ! 2198: Debug-Output "UTILITY.INF: could not open NetworkCards key" ! 2199: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2200: goto RemoveHardwareComponent_Return ! 2201: endif ! 2202: ! 2203: OpenRegKey $(NetCardKey) "" $(RH_NetCardNum) $(MAXIMUM_ALLOWED) NetCardNumKey ! 2204: ! 2205: Ifstr $(NetCardNumKey) == $(KeyNull) ! 2206: Debug-Output "UTILITY.INF: could not open NetworkCards Number key" ! 2207: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2208: goto RemoveHardwareComponent_Return ! 2209: endif ! 2210: ! 2211: GetRegValue $(NetCardNumKey),"ServiceName", RH_ServiceNameInfo ! 2212: set RH_ServiceName = *($(RH_ServiceNameInfo), 4) ! 2213: ! 2214: ifstr(i) $(RH_ServiceName) == "" ! 2215: ; if we cannot get the service name, make a guess ! 2216: set RH_ServiceName = $(RH_ProductName)$(RH_NetCardNum) ! 2217: endif ! 2218: ! 2219: CloseRegKey $(NetCardNumKey) ! 2220: ! 2221: DeleteRegTree $(NetCardKey) $(RH_NetCardNum) ! 2222: ! 2223: CloseRegKey $(NetCardKey) ! 2224: ! 2225: Shell "", RemoveService, $(RH_ServiceName), "NO" ! 2226: ! 2227: Set RS_RemoveError = $($R0) ! 2228: Ifint $(RS_RemoveError) != 0 ! 2229: Debug-Output "UTILITY.INF: RemoveService wrapper failed, error: "$(RS_RemoveResult) ! 2230: Set RegistryErrorIndex = UNABLE_REMOVE_CONFIGURE_SERVICE ! 2231: Goto RemoveHardwareComponent_Return ! 2232: Endif ! 2233: ! 2234: ! 2235: ; ! 2236: ; If driver reference count is equal to 0, remove it. ! 2237: ; ! 2238: ! 2239: Shell "", IsRefCountEqualZero, $(RH_ProductKey) ! 2240: ! 2241: Ifstr(i) $($R0) != NO_ERROR ! 2242: Debug-Output "UTILITY.INF: [RemoveHardwareComponent] IsRefCountEqualZero returned "$($R0) ! 2243: goto RemoveHardwareComponent_Return ! 2244: endif ! 2245: ! 2246: Ifint $($R1) == 1 ! 2247: Debug-Output "Remove software component..." ! 2248: Shell "" RemoveSoftwareComponent, $(RH_Manufacturer), $(RH_ProductName) ! 2249: set RegistryErrorIndex = $($R0) ! 2250: endif ! 2251: ! 2252: debug-output "remove netbios information..." ! 2253: LibraryProcedure Result, $(!NCPA_HANDLE), RemoveRouteFromNETBIOS, $(RH_ServiceName) ! 2254: ! 2255: RemoveHardwareComponent_Return = + ! 2256: ! 2257: Return $(RegistryErrorIndex) ! 2258: ! 2259: ;************************************************************************* ! 2260: ; end of section RemoveHardwareComponent ! 2261: ;************************************************************************* ! 2262: ! 2263: ;************************************************************************* ! 2264: ; ! 2265: ; SECTION: RemoveService ! 2266: ; ! 2267: ; PURPOSE: Remove a specified service from the registry. It is ! 2268: ; called by RemoveSoftwareComponent and ! 2269: ; RemoveHardwareComponent. Or, if the service is ! 2270: ; created by calling "CreateService", we will ! 2271: ; need to use this subroutine to remove it. ! 2272: ; ! 2273: ; ARGUMENTS: $0 Service Name ! 2274: ; $1 "YES" - we use DeleteService to remove the service ! 2275: ; "NO" - we use DeleteRegTree to remove the ! 2276: ; registry tree ! 2277: ; ! 2278: ; RETURNS: $R0 Registry error code or zero if no error ! 2279: ; ! 2280: ; REFERENCES: Nothing ! 2281: ; ! 2282: ; MODIFIES: Nothing ! 2283: ; ! 2284: ;************************************************************************* ! 2285: ! 2286: [RemoveService] ! 2287: read-syms InitBaseVars ! 2288: Set RS_SvcName = $($0) ! 2289: Set RS_UseDelSvc = $($1) ! 2290: ! 2291: ; Make sure the service key exists first. ! 2292: ! 2293: OpenRegKey $(!REG_H_LOCAL) "" "SYSTEM\CurrentControlSet\Services\"$(RS_SvcName) + ! 2294: $(MAXIMUM_ALLOWED) ServiceKey ! 2295: ! 2296: Ifstr $(ServiceKey) == $(KeyNull) ! 2297: Debug-Output "UTILITY.INF: could not open SYSTEM Service key "$(RS_SvcName) ! 2298: goto RemoveService_Return ! 2299: endif ! 2300: ! 2301: ; Remove the NbProvider value if it exists ! 2302: ! 2303: OpenRegKey $(ServiceKey) "" "Parameters" $(MAXIMUM_ALLOWED) ParameterKey ! 2304: ! 2305: Ifstr $(ParameterKey) != $(KeyNull) ! 2306: DeleteRegValue $(ParameterKey) "NbProvider" ! 2307: CloseRegKey $(ParameterKey) ! 2308: Endif ! 2309: ! 2310: CloseRegKey $(ServiceKey) ! 2311: ! 2312: ifstr(i) $(RS_UseDelSvc) == "YES" ! 2313: ! 2314: ; Remove the service ! 2315: ! 2316: Set FLibraryErrCtl = 1 ! 2317: LibraryProcedure RS_RemoveResult $(!NCPA_HANDLE), CPlSetup, + ! 2318: $(!STF_HWND), DELETESVC, $(RS_SvcName) ! 2319: Set FLibraryErrCtl = 0 ! 2320: ! 2321: ; Check the return code ! 2322: ! 2323: Set RS_RemoveError = *($(RS_RemoveResult),1) ! 2324: Ifint $(RS_RemoveError) != 0 ! 2325: Debug-Output "UTILITY.INF: RemoveService wrapper failed, error: "$(RS_RemoveResult) ! 2326: Set RegistryErrorIndex = UNABLE_REMOVE_CONFIGURE_SERVICE ! 2327: Goto RemoveService_Return ! 2328: Endif ! 2329: ! 2330: else ! 2331: ! 2332: OpenRegKey $(!REG_H_LOCAL) "" "SYSTEM\CurrentControlSet\Services" + ! 2333: $(MAXIMUM_ALLOWED) ServiceKey ! 2334: ! 2335: Ifstr $(ServiceKey) == $(KeyNull) ! 2336: Debug-Output "UTILITY.INF: could not open SYSTEM Service key "$(RS_SvcName) ! 2337: set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2338: goto RemoveService_Return ! 2339: endif ! 2340: ! 2341: DeleteRegTree $(ServiceKey) $(RS_SvcName) ! 2342: ! 2343: CloseRegKey $(ServiceKey) ! 2344: ! 2345: endif ! 2346: ! 2347: RemoveService_Return = + ! 2348: return $(RegistryErrorIndex) ! 2349: ! 2350: ;************************************************************************* ! 2351: ; end of section RemoveService ! 2352: ;************************************************************************* ! 2353: ! 2354: ;************************************************************************* ! 2355: ; ! 2356: ; SECTION: IsNetCardAlreadyInstalled ! 2357: ; ! 2358: ; PURPOSE: This subroutine is called by EISA and MCA net card ! 2359: ; setup. Given the bus number and slot number, it will ! 2360: ; return a boolean to idicate whether the card is ! 2361: ; already installed or not. ! 2362: ; ! 2363: ; ARGUMENTS: $0 Bus Number ! 2364: ; $1 Slot Number ! 2365: ; $2 Product Description ! 2366: ; $3 Product Name ! 2367: ; ! 2368: ; RETURNS: $R0 Registry error code or zero if no error ! 2369: ; $R1 "YES" - if the net card already installed ! 2370: ; "NO" - if the net card is not in the registry ! 2371: ; ! 2372: ; REFERENCES: Nothing ! 2373: ; ! 2374: ; MODIFIES: Nothing ! 2375: ; ! 2376: ;************************************************************************* ! 2377: ! 2378: [IsNetCardAlreadyInstalled] ! 2379: read-syms InitBaseVars ! 2380: ! 2381: set AlreadyExisted = "NO" ! 2382: ! 2383: set BusNum = $($0) ! 2384: set SlotNum = $($1) ! 2385: set Description = $($2) ! 2386: set Product = $($3) ! 2387: ! 2388: OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardKeyName) $(MAXIMUM_ALLOWED) IE_KeyNetcards ! 2389: ! 2390: Ifstr $(IE_KeyNetcards) == $(KeyNull) ! 2391: set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION ! 2392: goto IE_Return ! 2393: endif ! 2394: ! 2395: EnumRegKey $(IE_KeyNetcards) IE_KeyNameList ! 2396: ! 2397: ; ! 2398: ; Compare all the NetworkCards entry and see whether they have the ! 2399: ; same title and productname. ! 2400: ; ! 2401: ForListDo $(IE_KeyNameList) ! 2402: set IE_KeyName = *($($),1) ! 2403: OpenRegKey $(IE_KeyNetcards) "" $(IE_KeyName) $(MAXIMUM_ALLOWED) IE_Card ! 2404: ! 2405: Ifstr $(IE_Card) == $(KeyNull) ! 2406: set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION ! 2407: goto IE_Return ! 2408: endif ! 2409: ! 2410: GetRegValue $(IE_Card),"Description", DescriptionInfo ! 2411: GetRegValue $(IE_Card),"ProductName", ProductNameInfo ! 2412: set CardDescription = *($(DescriptionInfo), 4) ! 2413: set CardProductName = *($(ProductNameInfo), 4) ! 2414: ! 2415: ifstr(i) $(CardDescription) == $(Description) ! 2416: ifstr(i) $(CardProductName) == $(Product) ! 2417: ! 2418: ; ! 2419: ; We find the same product type. make sure that it ! 2420: ; does not have the same bus number and slot number ! 2421: ; ! 2422: ! 2423: GetRegValue $(IE_Card), "ServiceName", ServiceNameInfo ! 2424: set ServiceName = *($(ServiceNameInfo), 4) ! 2425: ! 2426: OpenRegKey $(!REG_H_LOCAL) "" + ! 2427: $(ServicesBaseName)"\"$(ServiceName)"\Parameters" + ! 2428: $(MAXIMUM_ALLOWED) IE_KeyService ! 2429: ! 2430: Ifstr $(IE_KeyService) == $(KeyNull) ! 2431: set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION ! 2432: goto IE_Return ! 2433: endif ! 2434: ! 2435: GetRegValue $(IE_KeyService), "BusNumber", BusInfo ! 2436: GetRegValue $(IE_KeyService), "SlotNumber", SlotInfo ! 2437: set CardBusNum = *($(BusInfo), 4) ! 2438: set CardSlotNum = *($(SlotInfo), 4) ! 2439: ! 2440: ifint $(CardBusNum) == $(BusNum) ! 2441: ifint $(CardSlotNum) == $(SlotNum) ! 2442: ; ! 2443: ; Don't install this card. It is already installed ! 2444: ; ! 2445: set AlreadyExisted = "YES" ! 2446: endif ! 2447: endif ! 2448: ! 2449: endif ! 2450: endif ! 2451: EndForListDo ! 2452: ! 2453: IE_Return = + ! 2454: return $(RegistryErrorIndex) $(AlreadyExisted) ! 2455: ! 2456: ;************************************************************************* ! 2457: ; end of section IsNetCardAlreadyInstalled ! 2458: ;************************************************************************* ! 2459: ! 2460: ;************************************************************************* ! 2461: ; ! 2462: ; SECTION: UpdateWinsockService ! 2463: ; ! 2464: ; PURPOSE: This section creates, if necessary, the WinSock ! 2465: ; service data object. This Registry key is a placeholder ! 2466: ; for all WinSock mapping information. In particular, ! 2467: ; it contains a value called Transports, which contains ! 2468: ; a REG_MULTI_SZ listing the names of all transports ! 2469: ; which export a sockets interface (through a DLL). ! 2470: ; ! 2471: ; Then, we either add or remove the name of this transport ! 2472: ; from the list. ! 2473: ; ! 2474: ; ARGUMENTS: $0 Name of Transport Service supporting WinSock ! 2475: ; $1 TRUE if adding data; FALSE if removing data ! 2476: ; ! 2477: ; RETURNS: $R0 Registry error code or zero if no error ! 2478: ; ! 2479: ; REFERENCES: none ! 2480: ; ! 2481: ; MODIFIES: none ! 2482: ; ! 2483: ; ! 2484: ;************************************************************************* ! 2485: [UpdateWinsockService] ! 2486: read-syms InitBaseVars ! 2487: ; ! 2488: ; Get the base key handle for the services area ! 2489: ; ! 2490: Set UW_NameOfService = $($0) ! 2491: Set UW_Adding = $($1) ! 2492: Set UW_KeyServices = $(KeyNull) ! 2493: Set UW_KeyParameters = $(KeyNull) ! 2494: ! 2495: Shell "", BaseServiceKey ! 2496: Set RegistryErrorIndex = $($R0) ! 2497: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 2498: Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2499: Goto U_W_Return ! 2500: endif ! 2501: Set UW_KeyServices = $($R1) ! 2502: ! 2503: OpenRegKey $(UW_KeyServices) "" "WinSock\Parameters" $(MAXIMUM_ALLOWED) UW_KeyParameters ! 2504: ! 2505: Ifstr(i) $(UW_KeyParameters) == $(KeyNull) ! 2506: Debug-Output "UTILITY.INF: Create WinSock Service" ! 2507: Shell "", CreateService, "WinSock", "", "", "adapter", "", {} ! 2508: Set RegistryErrorIndex = $($R0) ! 2509: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 2510: Debug-Output "UTILITY.INF: CreateService for WinSock returned "$(RegistryErrorIndex) ! 2511: Goto U_W_Return ! 2512: Endif ! 2513: CloseRegKey $($R1) ! 2514: Set UW_KeyParameters = $($R2) ! 2515: CloseRegKey $($R3) ! 2516: Else ! 2517: Debug-Output "UTILITY.INF: Open WinSock Service" ! 2518: Endif ! 2519: ! 2520: Ifstr(i) $(UW_KeyParameters) == $(KeyNull) ! 2521: Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2522: Goto U_W_Return ! 2523: Endif ! 2524: ; ! 2525: ; Get the old REG_MULTI_SZ containing the list of supported transports; ! 2526: ; add the new transport service name to the list or remove it. ! 2527: ; ! 2528: GetRegValue $(UW_KeyParameters) "Transports" UW_TransportsValue ! 2529: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 2530: Set UW_TransportsList = *($(UW_TransportsValue), 4) ! 2531: Else ! 2532: Set UW_TransportsList = {} ! 2533: Endif ! 2534: ! 2535: Ifstr(i) $(UW_TransportsList) == "" ! 2536: Set UW_TransportsList = {} ! 2537: Endif ! 2538: ; ! 2539: ; If we're removing the transport, do so; else, append it to the ! 2540: ; end of the list. ! 2541: ; ! 2542: Ifstr(i) $(UW_Adding) == "TRUE" ! 2543: Set UW_TransportsList = >($(UW_TransportsList), $(UW_NameOfService)) ! 2544: Else ! 2545: Set UW_NewList = {} ! 2546: ForListDo $(UW_TransportsList) ! 2547: Ifstr(i) $($) != $(UW_NameOfService) ! 2548: Set UW_NewList = >($(UW_NewList), $($)) ! 2549: Endif ! 2550: EndForListDo ! 2551: Set UW_TransportsList = $(UW_NewList) ! 2552: Endif ! 2553: ! 2554: SetRegValue $(UW_KeyParameters) {Transports, $(NoTitle), $(!REG_VT_MULTI_SZ), $(UW_TransportsList)} ! 2555: ! 2556: Debug-Output "UTILITY.INF: WinSock transport info added/deleted for "$(UW_NameOfService) ! 2557: ! 2558: U_W_Return = + ! 2559: Ifstr $(UW_KeyParameters) != $(KeyNull) ! 2560: CloseRegKey $(UW_KeyParameters) ! 2561: Endif ! 2562: Ifstr $(UW_KeyServices) != $(KeyNull) ! 2563: CloseRegKey $(UW_KeyServices) ! 2564: Endif ! 2565: ! 2566: Return $(RegistryErrorIndex) ! 2567: ! 2568: ;************************************************************************* ! 2569: ; end of section UpdateWinsockService ! 2570: ;************************************************************************* ! 2571: ! 2572: ;************************************************************************* ! 2573: ; ! 2574: ; SECTION: AddWinsockInfo ! 2575: ; ! 2576: ; PURPOSE: This function adds WinSock sockets provider info ! 2577: ; to a transport. ! 2578: ; ! 2579: ; ARGUMENTS: $0 Service name of transport driver ! 2580: ; $1 DLL name for WinSock interface to transport ! 2581: ; $2 integer value for MaxSockAddrLength ! 2582: ; $3 integer value for MinSockAddrLength ! 2583: ; ! 2584: ; RETURNS: $R0 Registry error code or zero if no error ! 2585: ; $R1 Key handle to <service>\Parameters\Winsock ! 2586: ; ! 2587: ; REFERENCES: none ! 2588: ; ! 2589: ; MODIFIES: none ! 2590: ; ! 2591: ; ! 2592: ; NOTES: This function/section calls the NCPA function CPlSetup ! 2593: ; to bind to the DLL in question and add the value of the ! 2594: ; export function WSHWinSockMapping() to the Registry under ! 2595: ; the "<service>\Parameters\Winsock:Mapping" value. To do ! 2596: ; this, the Registry key handle in SETUP form is passed ! 2597: ; to the NCPA export. ! 2598: ; ! 2599: ; ! 2600: ;************************************************************************* ! 2601: [AddWinsockInfo] ! 2602: read-syms InitBaseVars ! 2603: ; ! 2604: ; Get the base key handle for the services area ! 2605: ; ! 2606: Set AW_NameOfService = $($0) ! 2607: Set AW_DLLName = $($1) ! 2608: Set AW_MaxAddrLgt = $($2) ! 2609: Set AW_MinAddrLgt = $($3) ! 2610: ! 2611: Set AW_KeyServices = $(KeyNull) ! 2612: Set AW_KeyParameters = $(KeyNull) ! 2613: Set AW_KeySockets = $(KeyNull) ! 2614: ! 2615: Shell "", AddAFD ! 2616: Set RegistryErrorIndex = $($R0) ! 2617: ! 2618: Ifstr(i) $(RegistryErrorIndex) == NO_ERROR ! 2619: Shell "", BaseServiceKey ! 2620: Set RegistryErrorIndex = $($R0) ! 2621: Endif ! 2622: ! 2623: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 2624: Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2625: Goto A_W_Return ! 2626: endif ! 2627: Set AW_KeyServices = $($R1) ! 2628: ! 2629: OpenRegKey $(AW_KeyServices) "" $(AW_NameOfService)"\Parameters" $(MAXIMUM_ALLOWED) AW_KeyParameters ! 2630: Ifstr(i) $(AW_KeyParameters) == $(KeyNull) ! 2631: Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2632: Goto A_W_Return ! 2633: Endif ! 2634: ! 2635: OpenRegKey $(AW_KeyParameters) "" "Winsock" $(MAXIMUM_ALLOWED) AW_KeySockets ! 2636: Ifstr(i) $(AW_KeySockets) == $(KeyNull) ! 2637: CreateRegKey $(AW_KeyParameters) {Winsock,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" AW_KeySockets ! 2638: Endif ! 2639: ! 2640: Ifstr(i) $(AW_KeySockets) == $(KeyNull) ! 2641: Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2642: Goto A_W_Return ! 2643: Endif ! 2644: ! 2645: Set AW_ValueList = {{HelperDllName ,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(AW_DLLName)},+ ! 2646: {MaxSockAddrLength,$(NoTitle),$(!REG_VT_DWORD),$(AW_MaxAddrLgt)},+ ! 2647: {MinSockAddrLength,$(NoTitle),$(!REG_VT_DWORD),$(AW_MinAddrLgt)}} ! 2648: ! 2649: Shell "", AddValueList, $(AW_KeySockets), $(AW_ValueList) ! 2650: ! 2651: Set RegistryErrorIndex = $($R0) ! 2652: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 2653: Debug-Output "UTILITY.INF: [AddWinsockInfo] Registry error: Add value list" ! 2654: Endif ! 2655: ; ! 2656: ; Extract the WinSock mapping information from the DLL ! 2657: ; ! 2658: Set FLibraryErrCtl = 1 ! 2659: LibraryProcedure AW_MapResult $(!NCPA_HANDLE), CPlSetup, $(!STF_HWND), WINSOCKMAP, $(AW_DLLName), $(AW_KeySockets) ! 2660: Set FLibraryErrCtl = 0 ! 2661: ! 2662: Set AW_MapError = *($(AW_MapResult),1) ! 2663: Ifint $(AW_MapError) != 0 ! 2664: Debug-Output "UTILITY.INF: [AddWinsockInfo] WINSOCKMAP returned "$(AW_MapError) ! 2665: Set RegistryErrorIndex = UNABLE_ACCESS_WINSOCK_MAP_INFO ! 2666: Goto A_W_Return ! 2667: Endif ! 2668: ; ! 2669: ; Add this service to the WinSock transports list. ! 2670: ; ! 2671: Shell "" UpdateWinsockService $(AW_NameOfService) TRUE ! 2672: Set RegistryErrorIndex = $($R0) ! 2673: ! 2674: A_W_Return = + ! 2675: Ifstr $(AW_KeySockets) != $(KeyNull) ! 2676: CloseRegKey $(AW_KeySockets) ! 2677: Endif ! 2678: Ifstr $(AW_KeyParameters) != $(KeyNull) ! 2679: CloseRegKey $(AW_KeyParameters) ! 2680: Endif ! 2681: Ifstr $(AW_KeyServices) != $(KeyNull) ! 2682: CloseRegKey $(AW_KeyServices) ! 2683: Endif ! 2684: ! 2685: Return $(RegistryErrorIndex) ! 2686: ! 2687: ;************************************************************************* ! 2688: ; end of section AddWinsockInfo ! 2689: ;************************************************************************* ! 2690: ! 2691: ;************************************************************************* ! 2692: ; ! 2693: ; SECTION: RemoveWinsockInfo ! 2694: ; ! 2695: ; PURPOSE: This function removes WinSock sockets provider ! 2696: ; information from a transport ! 2697: ; ! 2698: ; ARGUMENTS: $0 Service name of transport driver ! 2699: ; ! 2700: ; RETURNS: $R0 Registry error code or zero if no error ! 2701: ; ! 2702: ; REFERENCES: none ! 2703: ; ! 2704: ; MODIFIES: none ! 2705: ; ! 2706: ; ! 2707: ;************************************************************************* ! 2708: [RemoveWinsockInfo] ! 2709: read-syms InitBaseVars ! 2710: ; ! 2711: ; Get the base key handle for the services area ! 2712: ; ! 2713: Set RW_NameOfService = $($0) ! 2714: ! 2715: Set RW_KeyServices = $(KeyNull) ! 2716: Set RW_KeySockets = $(KeyNull) ! 2717: ! 2718: Shell "", BaseServiceKey ! 2719: Set RegistryErrorIndex = $($R0) ! 2720: ! 2721: Ifstr(i) $(RegistryErrorIndex) != NO_ERROR ! 2722: Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE ! 2723: Goto R_W_Return ! 2724: endif ! 2725: ! 2726: Set RW_KeyServices = $($R1) ! 2727: ! 2728: OpenRegKey $(RW_KeyServices) "" $(RW_NameOfService)"\Parameters" $(MAXIMUM_ALLOWED) RW_KeySockets ! 2729: Ifstr(i) $(RW_KeySockets) == $(KeyNull) ! 2730: Set RegistryErrorIndex = NO_ERROR ! 2731: Goto R_W_Return ! 2732: Endif ! 2733: ; ! 2734: ; Delete the \Parameters\Winsock key. Ignore errors, since the service ! 2735: ; is almost certainly being deinstalled. ! 2736: ; ! 2737: DeleteRegTree $(RW_KeySockets) "Winsock" ! 2738: ; ! 2739: ; Remove this service from the WinSock transports list. ! 2740: ; ! 2741: Shell "" UpdateWinsockService $(RW_NameOfService) FALSE ! 2742: Set RegistryErrorIndex = $($R0) ! 2743: ! 2744: R_W_Return = + ! 2745: Ifstr $(RW_KeySockets) != $(KeyNull) ! 2746: CloseRegKey $(RW_KeySockets) ! 2747: Endif ! 2748: Ifstr $(RW_KeyServices) != $(KeyNull) ! 2749: CloseRegKey $(RW_KeyServices) ! 2750: Endif ! 2751: ! 2752: Return $(RegistryErrorIndex) ! 2753: ! 2754: ;************************************************************************* ! 2755: ; end of section RemoveWinsockInfo ! 2756: ;************************************************************************* ! 2757: ! 2758: ;************************************************************************* ! 2759: ; ! 2760: ; SECTION: GetBindingInfo ! 2761: ; ! 2762: ; PURPOSE: This function returns the bindable rules for the given ! 2763: ; manufacturer. ! 2764: ; ! 2765: ; ARGUMENTS: $0 manufacturer name ! 2766: ; ! 2767: ; RETURNS: $R0 Registry error code or zero if no error ! 2768: ; $R1 Bindable rule ! 2769: ; ! 2770: ; REFERENCES: none ! 2771: ; ! 2772: ; MODIFIES: none ! 2773: ; ! 2774: ; ! 2775: ;************************************************************************* ! 2776: ! 2777: [BindingInfo-DEC] ! 2778: BindingInfo = {+ ! 2779: "lanceDriver dec100Adapter non exclusive 100",+ ! 2780: "lanceDriver dec101Adapter non exclusive 100",+ ! 2781: "lanceDriver decetherworksturboAdapter non exclusive 100",+ ! 2782: "lanceDriver dec422Adapter non exclusive 100",+ ! 2783: "lanceDriver decpcAdapter non exclusive 100",+ ! 2784: "lanceDriver decstatAdapter non exclusive 100"+ ! 2785: } ! 2786: ! 2787: [BindingInfo-WD] ! 2788: BindingInfo = {+ ! 2789: "smc8000nDriver smcisaAdapter non exclusive 100",+ ! 2790: "smc8000nDriver wd8003eaAdapter non exclusive 100",+ ! 2791: "smc8000nDriver wd8003waAdapter non exclusive 100",+ ! 2792: "smc8000nDriver wd8013epaAdapter non exclusive 100",+ ! 2793: "smc8000nDriver wd8013wpaAdapter non exclusive 100"+ ! 2794: } ! 2795: [BindingInfo-PROTEON] ! 2796: BindingInfo = {+ ! 2797: "proteonDriver p1990Adapter non exclusive 100",+ ! 2798: "proteonDriver p1390Adapter non exclusive 100"+ ! 2799: } ! 2800: ! 2801: [BindingInfo-IBM] ! 2802: BindingInfo = {"ibmtokDriver ibmtokAdapter non exclusive 100",+ ! 2803: "ibmtokDriver ibmtokmcAdapter non exclusive 100"} ! 2804: ! 2805: [GetBindingInfo] ! 2806: set BindingInfo = {} ! 2807: read-syms BindingInfo-$($0) ! 2808: return "NO_ERROR", $(BindingInfo) ! 2809: ! 2810: ;************************************************************************* ! 2811: ; end of section GetBindingInfo ! 2812: ;************************************************************************* ! 2813: ! 2814: ;************************************************************************* ! 2815: ; ! 2816: ; SECTION: AddStreams ! 2817: ; ! 2818: ; PURPOSE: Add Streams component ! 2819: ; ! 2820: ; ARGUMENTS: nothing ! 2821: ; ! 2822: ; RETURNS: $R0 error code ! 2823: ; ! 2824: ; MODIFIES: Nothing ! 2825: ; ! 2826: ;************************************************************************* ! 2827: ! 2828: [AddStreams] ! 2829: read-syms InitBaseVars ! 2830: ! 2831: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\streams" $(MAXIMUM_ALLOWED) BS_KeyServices ! 2832: ! 2833: Ifstr $(BS_KeyServices) == $(KeyNull) ! 2834: ! 2835: set OldOption = $(!NTN_InfOption) ! 2836: set !NTN_InfOption = STREAMS ! 2837: Shell "oemnxpst.inf" InstallOption $(!STF_LANGUAGE) "STREAMS" $(!STF_SRCDIR) $(!NtLmAddCopy) $(!NtLmDoCopy) $(!NtLmDoConfig) ! 2838: set !NTN_InfOption = $(OldOption) ! 2839: else ! 2840: CloseRegKey $(BS_KeyServices) ! 2841: Debug-Output "UTILITY.INF: streams already installed" ! 2842: endif ! 2843: ; ! 2844: ; Increase the reference counter ! 2845: ; ! 2846: Shell "", IncrementRefCount, "Software\Microsoft\streams\CurrentVersion" ! 2847: ! 2848: AddStreamsReturn = + ! 2849: return NO_ERROR ! 2850: ! 2851: ;************************************************************************* ! 2852: ; ! 2853: ; SECTION: RemoveStreams ! 2854: ; ! 2855: ; PURPOSE: Remove Streams component ! 2856: ; ! 2857: ; ARGUMENTS: nothing ! 2858: ; ! 2859: ; RETURNS: $R0 error code ! 2860: ; ! 2861: ; MODIFIES: Nothing ! 2862: ; ! 2863: ;************************************************************************* ! 2864: ! 2865: [RemoveStreams] ! 2866: read-syms InitBaseVars ! 2867: ! 2868: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\streams" $(MAXIMUM_ALLOWED) BS_KeyServices ! 2869: ! 2870: Ifstr $(BS_KeyServices) != $(KeyNull) ! 2871: CloseRegKey $(BS_KeyServices) ! 2872: Shell "", DecrementRefCount, "Software\Microsoft\streams\CurrentVersion" ! 2873: Shell "", IsRefCountEqualZero, "Software\Microsoft\streams\CurrentVersion" ! 2874: Ifstr(i) $($R0) != NO_ERROR ! 2875: Debug-Output "UTILITY.INF: [RemoveSoftwareComponent] IsRefCountEqualZero returned "$($R0) ! 2876: goto RemoveStreamsReturn ! 2877: endif ! 2878: ! 2879: Ifint $($R1) != 1 ! 2880: ; if not zero, remove it next time ! 2881: goto RemoveStreamsReturn ! 2882: endif ! 2883: ! 2884: set OldOption = $(!NTN_InfOption) ! 2885: set OldInstallMode = $(!NTN_InstallMode) ! 2886: set !NTN_InfOption = STREAMS ! 2887: set !NTN_InstallMode = deinstall ! 2888: Shell "oemnxpst.inf" InstallOption $(!STF_LANGUAGE) "STREAMS" $(!STF_SRCDIR) $(!NtLmAddCopy) $(!NtLmDoCopy) $(!NtLmDoConfig) ! 2889: set !NTN_InfOption = $(OldOption) ! 2890: set !NTN_InstallMode = $(OldInstallMode) ! 2891: endif ! 2892: ! 2893: RemoveStreamsReturn = + ! 2894: return NO_ERROR ! 2895: ! 2896: ;************************************************************************* ! 2897: ; ! 2898: ; SECTION: AddAFD ! 2899: ; ! 2900: ; PURPOSE: Add AFD component ! 2901: ; ! 2902: ; ARGUMENTS: nothing ! 2903: ; ! 2904: ; RETURNS: $R0 error code ! 2905: ; ! 2906: ; MODIFIES: Nothing ! 2907: ; ! 2908: ;************************************************************************* ! 2909: ! 2910: [AFDVars] ! 2911: ; ! 2912: ; AFD Software data ! 2913: ; ! 2914: ProductAFDName = "Afd" ! 2915: ProductAFDTitle = "AFD Networking Support Environment" ! 2916: ProductAFDImagePath = "\SystemRoot\System32\drivers\afd.sys" ! 2917: ProductAFDSvcType = "kernelautostart" ! 2918: ! 2919: [AddAFD] ! 2920: read-syms InitBaseVars ! 2921: read-syms AFDVars ! 2922: Set Result = NO_ERROR ! 2923: ! 2924: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\AFD" $(MAXIMUM_ALLOWED) BS_KeyServices ! 2925: ! 2926: Ifstr $(BS_KeyServices) == $(KeyNull) ! 2927: ! 2928: Shell "", CreateService, $(ProductAFDName),+ ! 2929: $(ProductAFDTitle),+ ! 2930: $(ProductAFDImagePath),+ ! 2931: $(ProductAFDSvcType), "", {"+TDI"}, "",+ ! 2932: "%SystemRoot%\System32\IoLogMsg.dll" ! 2933: Set Result = $($R0) ! 2934: else ! 2935: CloseRegKey $(BS_KeyServices) ! 2936: endif ! 2937: ! 2938: AddAFDReturn = + ! 2939: return $(Result) ! 2940: ! 2941: ;************************************************************************* ! 2942: ; ! 2943: ; SECTION: GetBusTypeNum ! 2944: ; ! 2945: ; PURPOSE: return the Bus Type Number ! 2946: ; ! 2947: ; ARGUMENTS: nothing ! 2948: ; ! 2949: ; RETURNS: $R0 error code ! 2950: ; $R1 bus number ! 2951: ; ! 2952: ; MODIFIES: Nothing ! 2953: ; ! 2954: ;************************************************************************* ! 2955: ! 2956: [GetBusTypeNum] ! 2957: read-syms InitBaseVars ! 2958: set DetCard = $(!p:DetectedCard) ! 2959: ifstr(i) $(DetCard) == "" ! 2960: set DetCard = FALSE ! 2961: endif ! 2962: ifstr(i) $(DetCard) == FALSE ! 2963: ; Assume it is an ISA Bus ! 2964: set BusType = 1 ! 2965: ifstr(i) $(!STF_BUSTYPE) == "ISA" ! 2966: set BusType = 1 ! 2967: else-ifstr(i) $(!STF_BUSTYPE) == "EISA" ! 2968: set BusType = 2 ! 2969: else-ifstr(i) $(!STF_BUSTYPE) == "Jazz-Internal Bus" ! 2970: set BusType = 0 ! 2971: else-ifstr(i) $(!STF_BUSTYPE) == "MCA" ! 2972: set BusType = 3 ! 2973: else-ifstr(i) $(!STF_BUSTYPE) == "TCChannel" ! 2974: set BusType = 4 ! 2975: else ! 2976: debug-output "Utility.inf: Unknown bus type" ! 2977: endif ! 2978: else ! 2979: set BusType = *($(!STF_NCDETINFO),5) ! 2980: endif ! 2981: return NO_ERROR, $(BusType) ! 2982: ! 2983: ;************************************************************************* ! 2984: ; ! 2985: ; SECTION: AddRpcProtocol ! 2986: ; ! 2987: ; PURPOSE: Update the sections of the SOFTWARE\Microsoft\Rpc keys ! 2988: ; to reflect the presenceof a new protocol in the system. ! 2989: ; ! 2990: ; ARGUMENTS: $0 complete RPC protocol string; e.g., "ncacn_ip_tcp" ! 2991: ; $1 name of client DLL (no path); e.g., "rpcltc5.dll" ! 2992: ; $2 name of server DLL (no path); e.g., "rpclts5.dll" ! 2993: ; ! 2994: ; RETURNS: $R0 STATUS_SUCCESSFUL if ok; error otherwise. ! 2995: ; ! 2996: ; REFERENCES: Nothing ! 2997: ; ! 2998: ; MODIFIES: Nothing ! 2999: ; ! 3000: ; ! 3001: ;************************************************************************* ! 3002: [AddRpcProtocol] ! 3003: Set ARP_Protocol = $($0) ! 3004: Set ARP_ClientDll = $($1) ! 3005: Set ARP_ServerDll = $($2) ! 3006: read-syms InitBaseVars ! 3007: Set ARP_KeyRpc = $(KeyNull) ! 3008: Set ARP_KeyRpcServer = $(KeyNull) ! 3009: Set ARP_KeyRpcClient = $(KeyNull) ! 3010: Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG ! 3011: ! 3012: OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) ARP_KeyRpc ! 3013: ! 3014: Ifstr(i) $(ARP_KeyRpc) == $(KeyNull) ! 3015: Goto ARP_Return ! 3016: Endif ! 3017: ! 3018: OpenRegKey $(ARP_KeyRpc) "" "ClientProtocols" $(MAXIMUM_ALLOWED) ARP_KeyClient ! 3019: Ifstr(i) $(ARP_KeyClient) == $(KeyNull) ! 3020: Goto ARP_Return ! 3021: Endif ! 3022: ! 3023: OpenRegKey $(ARP_KeyRpc) "" "ServerProtocols" $(MAXIMUM_ALLOWED) ARP_KeyServer ! 3024: Ifstr(i) $(ARP_KeyServer) == $(KeyNull) ! 3025: Goto ARP_Return ! 3026: Endif ! 3027: ! 3028: SetRegValue $(ARP_KeyClient) {$(ARP_Protocol),$(NoTitle),$(!REG_VT_SZ),$(ARP_ClientDll)} ! 3029: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3030: Goto ARP_Return ! 3031: Endif ! 3032: ! 3033: SetRegValue $(ARP_KeyServer) {$(ARP_Protocol),$(NoTitle),$(!REG_VT_SZ),$(ARP_ServerDll)} ! 3034: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3035: Goto ARP_Return ! 3036: Endif ! 3037: ! 3038: Set RegistryErrorIndex = NO_ERROR ! 3039: ! 3040: ARP_Return = + ! 3041: Ifstr(i) $(ARP_KeyServer) != $(KeyNull) ! 3042: CloseRegKey $(ARP_KeyServer) ! 3043: Endif ! 3044: Ifstr(i) $(ARP_KeyClient) != $(KeyNull) ! 3045: CloseRegKey $(ARP_KeyClient) ! 3046: Endif ! 3047: Ifstr(i) $(ARP_KeyRpc) != $(KeyNull) ! 3048: CloseRegKey $(ARP_KeyRpc) ! 3049: Endif ! 3050: Return $(RegistryErrorIndex) ! 3051: ! 3052: ;************************************************************************* ! 3053: ; end of section AddRpcProtocol ! 3054: ;************************************************************************* ! 3055: ! 3056: ;************************************************************************* ! 3057: ; ! 3058: ; SECTION: RemoveRpcProtocol ! 3059: ; ! 3060: ; PURPOSE: Remove information about an installed RPC protocol. ! 3061: ; ! 3062: ; ARGUMENTS: $0 complete RPC protocol string (see [AddRpcProtocol]). ! 3063: ; ! 3064: ; RETURNS: $R0 STATUS_SUCCESSFUL if ok; error otherwise. ! 3065: ; ! 3066: ; REFERENCES: Nothing ! 3067: ; ! 3068: ; MODIFIES: Nothing ! 3069: ; ! 3070: ; ! 3071: ;************************************************************************* ! 3072: [RemoveRpcProtocol] ! 3073: Set RRP_Protocol = $($0) ! 3074: read-syms InitBaseVars ! 3075: Set RRP_KeyRpc = $(KeyNull) ! 3076: Set RRP_KeyRpcServer = $(KeyNull) ! 3077: Set RRP_KeyRpcClient = $(KeyNull) ! 3078: Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG ! 3079: ! 3080: OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) RRP_KeyRpc ! 3081: ! 3082: Ifstr(i) $(RRP_KeyRpc) == $(KeyNull) ! 3083: Goto RRP_Return ! 3084: Endif ! 3085: ! 3086: OpenRegKey $(RRP_KeyRpc) "" "ClientProtocols" $(MAXIMUM_ALLOWED) RRP_KeyClient ! 3087: Ifstr(i) $(RRP_KeyClient) == $(KeyNull) ! 3088: Goto RRP_Return ! 3089: Endif ! 3090: ! 3091: OpenRegKey $(RRP_KeyRpc) "" "ServerProtocols" $(MAXIMUM_ALLOWED) RRP_KeyServer ! 3092: Ifstr(i) $(RRP_KeyServer) == $(KeyNull) ! 3093: Goto RRP_Return ! 3094: Endif ! 3095: ! 3096: DeleteRegValue $(RRP_KeyClient) $(RRP_Protocol) ! 3097: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3098: Goto RRP_Return ! 3099: Endif ! 3100: ! 3101: DeleteRegValue $(RRP_KeyServer) $(RRP_Protocol) ! 3102: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3103: Goto RRP_Return ! 3104: Endif ! 3105: ! 3106: Set RegistryErrorIndex = NO_ERROR ! 3107: ! 3108: RRP_Return = + ! 3109: Ifstr(i) $(RRP_KeyServer) != $(KeyNull) ! 3110: CloseRegKey $(RRP_KeyServer) ! 3111: Endif ! 3112: Ifstr(i) $(RRP_KeyClient) != $(KeyNull) ! 3113: CloseRegKey $(RRP_KeyClient) ! 3114: Endif ! 3115: Ifstr(i) $(RRP_KeyRpc) != $(KeyNull) ! 3116: CloseRegKey $(RRP_KeyRpc) ! 3117: Endif ! 3118: Return $(RegistryErrorIndex) ! 3119: ! 3120: ;************************************************************************* ! 3121: ; end of section RemoveRpcProtocl ! 3122: ;************************************************************************* ! 3123: ! 3124: ;************************************************************************* ! 3125: ; ! 3126: ; SECTION: GetInfFileNameFromRegistry ! 3127: ; ! 3128: ; PURPOSE: get the inf file name from the product' NetRules section. ! 3129: ; ! 3130: ; ARGUMENTS: $0 product key handle ! 3131: ; (ie, system\software\Microsoft\Lance\CurrentVersion) ! 3132: ; ! 3133: ; RETURNS: $R0 Inf file name. ! 3134: ; ! 3135: ; REFERENCES: Nothing ! 3136: ; ! 3137: ; MODIFIES: Nothing ! 3138: ; ! 3139: ; ! 3140: ;************************************************************************* ! 3141: ! 3142: [GetInfFileNameFromRegistry] ! 3143: read-syms InitBaseVars ! 3144: set KeyProduct = $($0) ! 3145: set InfName = "" ! 3146: ! 3147: OpenRegKey $(KeyProduct) "" "NetRules" $(!REG_KEY_READ) NetRuleKey ! 3148: Ifstr(i) $(NetRuleKey) != $(KeyNull) ! 3149: GetRegValue $(NetRuleKey) "InfName" NetRuleInfNameList ! 3150: set NetRuleInfName = *($(NetRuleInfNameList), 4) ! 3151: Split-String $(NetRuleInfName), "\", FilenameList ! 3152: QueryListSize ListSize $(FilenameList) ! 3153: set InfName = *($(FilenameList), $(ListSize)) ! 3154: CloseRegKey $(KeyProduct) ! 3155: endif ! 3156: ! 3157: return $(InfName) ! 3158: ! 3159: ;************************************************************************* ! 3160: ; ! 3161: ; SECTION: ToggleBinding ! 3162: ; ! 3163: ; PURPOSE: Take the named binding from the list of "Disabled" ! 3164: ; bindings and merge it with the active bindings. ! 3165: ; ! 3166: ; ARGUMENTS: $0 name of service ! 3167: ; $1 number of binding ! 3168: ; $2 "activate" or "disable" ! 3169: ; ! 3170: ; RETURNS: $R0 NO_ERROR if OK; RegistryError if not. ! 3171: ; ! 3172: ; REFERENCES: None ! 3173: ; ! 3174: ; MODIFIES: None ! 3175: ; ! 3176: ; NOTES: This routine takes either the given inactive binding ! 3177: ; and activates it or the given active binding and ! 3178: ; deactivates it. ! 3179: ; ! 3180: ; ! 3181: ;************************************************************************* ! 3182: [ToggleBinding] ! 3183: Set SvcName = $($0) ! 3184: Set BindNumber = $($1) ! 3185: Set Action = $($2) ! 3186: Set Status = UNABLE_ACCESS_CONFIGURE_SERVICE ! 3187: Set KeySvc = "" ! 3188: Set KeyFrom = "" ! 3189: Set KeyTo = "" ! 3190: ! 3191: read-syms InitBaseVars ! 3192: ! 3193: OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\"$(SvcName) $(MAXIMUM_ALLOWED) KeySvc ! 3194: Ifstr(i) $(KeySvc) == $(KeyNull) ! 3195: Debug-Output "UTILITY.INF: ToggleBinding: service key open FAILED" ! 3196: Goto TB_Return ! 3197: Endif ! 3198: ! 3199: Ifstr(i) $(Action) == activate ! 3200: Set FromKeyName = "Linkage\Disabled" ! 3201: Set ToKeyName = "Linkage" ! 3202: Else ! 3203: Set FromKeyName = "Linkage" ! 3204: Set ToKeyName = "Linkage\Disabled" ! 3205: Endif ! 3206: ! 3207: ; Open the Linkage and Linkage\Disabled subkeys ! 3208: ! 3209: OpenRegKey $(KeySvc) "" $(FromKeyName) $(MAXIMUM_ALLOWED) KeyFrom ! 3210: Ifstr(i) $(KeyFrom) == $(KeyNull) ! 3211: Debug-Output "UTILITY.INF: ToggleBinding: from linkage key open FAILED" ! 3212: Goto TB_Return ! 3213: Endif ! 3214: OpenRegKey $(KeySvc) "" $(ToKeyName) $(MAXIMUM_ALLOWED) KeyTo ! 3215: Ifstr(i) $(KeyTo) == $(KeyNull) ! 3216: Debug-Output "UTILITY.INF: ToggleBinding: to linkage key open FAILED" ! 3217: Goto TB_Return ! 3218: Endif ! 3219: ! 3220: ; Fetch all their values, allowing for complete absence. ! 3221: ; First, from the "From" key ! 3222: ! 3223: Set FromBindList = {} ! 3224: Set FromExportList = {} ! 3225: Set FromRouteList = {} ! 3226: Set ToBindList = {} ! 3227: Set ToExportList = {} ! 3228: Set ToRouteList = {} ! 3229: Set ErrorTotal = 0 ! 3230: ! 3231: Debug-Output "UTILITY.INF: ToggleBinding; fetch all linkage values" ! 3232: ! 3233: GetRegValue $(KeyFrom),"Bind",TempValue ! 3234: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3235: Set FromBindList = *($(TempValue),4) ! 3236: Set-add ErrorTotal = $(ErrorTotal),1 ! 3237: Endif ! 3238: ! 3239: GetRegValue $(KeyFrom),"Export",TempValue ! 3240: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3241: Set FromExportList = *($(TempValue),4) ! 3242: Set-add ErrorTotal = $(ErrorTotal),1 ! 3243: Endif ! 3244: ! 3245: GetRegValue $(KeyFrom),"Route",TempValue ! 3246: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3247: Set FromRouteList = *($(TempValue),4) ! 3248: Set-add ErrorTotal = $(ErrorTotal),1 ! 3249: Endif ! 3250: ! 3251: ; Next, from the "To" key ! 3252: ! 3253: GetRegValue $(KeyTo),"Bind",TempValue ! 3254: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3255: Set ToBindList = *($(TempValue),4) ! 3256: Set-add ErrorTotal = $(ErrorTotal),1 ! 3257: Endif ! 3258: ! 3259: GetRegValue $(KeyTo),"Export",TempValue ! 3260: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3261: Set ToExportList = *($(TempValue),4) ! 3262: Set-add ErrorTotal = $(ErrorTotal),1 ! 3263: Endif ! 3264: ! 3265: GetRegValue $(KeyTo),"Route",TempValue ! 3266: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3267: Set ToRouteList = *($(TempValue),4) ! 3268: Set-add ErrorTotal = $(ErrorTotal),1 ! 3269: Endif ! 3270: ! 3271: ; We have all the data. Do some sanity checking. ! 3272: ; Are the lists the same size? ! 3273: ! 3274: Ifint $(ErrorTotal) != 6 ! 3275: Debug-Output "UTILITY.INF: ToggleBinding; Bind list retreival error, "$(ErrorTotal) ! 3276: Endif ! 3277: ! 3278: Debug-Output "UTILITY.INF: ToggleBinding; sanity check results" ! 3279: ! 3280: QueryListSize sz1 $(FromBindList) ! 3281: QueryListSize sz2 $(FromExportList) ! 3282: QueryListSize sz3 $(FromRouteList) ! 3283: Ifint $(sz1) != $(sz2) ! 3284: Goto TB_Return ! 3285: Endif ! 3286: Ifint $(sz1) != $(sz3) ! 3287: Goto TB_Return ! 3288: Endif ! 3289: ! 3290: QueryListSize sz2 $(ToBindList) ! 3291: QueryListSize sz3 $(ToExportList) ! 3292: QueryListSize sz4 $(ToRouteList) ! 3293: Ifint $(sz2) != $(sz3) ! 3294: Goto TB_Return ! 3295: Endif ! 3296: Ifint $(sz2) != $(sz4) ! 3297: Goto TB_Return ! 3298: Endif ! 3299: ! 3300: ; Does the requested element exist? ! 3301: ! 3302: Debug-Output "UTILITY.INF: ToggleBinding; prepare to move binding" ! 3303: ! 3304: Ifint $(BindNumber) > $(sz1) ! 3305: Debug-Output "UTILITY.INF: ToggleBinding; binding to move was invalid" ! 3306: Set Status = INVALID_DATA_PASSED ! 3307: Endif ! 3308: ! 3309: ; We're ready. Move the data around. ! 3310: ; Extract the element from the "From" lists, append it ! 3311: ; to the "To" lists... ! 3312: ! 3313: Set FromBindItem = *($(FromBindList),$(BindNumber)) ! 3314: Set FromRouteItem = *($(FromRouteList),$(BindNumber)) ! 3315: Set FromExportItem = *($(FromExportList),$(BindNumber)) ! 3316: ! 3317: Set ToBindList = >($(ToBindList),$(FromBindItem)) ! 3318: Set ToRouteList = >($(ToRouteList),$(FromRouteItem)) ! 3319: Set ToExportList = >($(ToExportList),$(FromExportItem)) ! 3320: ! 3321: ; Regenerate the "From" lists by iteration. ! 3322: ! 3323: Set NewBind = {} ! 3324: Set NewExport = {} ! 3325: Set NewRoute = {} ! 3326: Set Index = 0 ! 3327: ForListDo $(FromBindList) ! 3328: Set-add Index = $(Index),1 ! 3329: Ifint $(Index) != $(BindNumber) ! 3330: Set NewBind = >($(NewBind),$($)) ! 3331: Set NewExport = >($(NewExport),*($(FromExportList),$(Index))) ! 3332: Set NewRoute = >($(NewRoute),*($(FromRouteList),$(Index))) ! 3333: Endif ! 3334: EndForListDo ! 3335: ! 3336: ; Replace the old values ! 3337: ! 3338: Set FromBindList = $(NewBind) ! 3339: Set FromExportList = $(NewExport) ! 3340: Set FromRouteList = $(NewRoute) ! 3341: ! 3342: ; Update the registry. ! 3343: ! 3344: Set ErrorTotal = 0 ! 3345: ! 3346: SetRegValue $(KeyFrom) {Bind,$(NoTitle),$(!REG_VT_MULTI_SZ),$(FromBindList)} ! 3347: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3348: Set-add ErrorTotal = $(ErrorTotal),1 ! 3349: Endif ! 3350: SetRegValue $(KeyFrom) {Export,$(NoTitle),$(!REG_VT_MULTI_SZ),$(FromExportList)} ! 3351: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3352: Set-add ErrorTotal = $(ErrorTotal),1 ! 3353: Endif ! 3354: SetRegValue $(KeyFrom) {Route,$(NoTitle),$(!REG_VT_MULTI_SZ),$(FromRouteList)} ! 3355: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3356: Set-add ErrorTotal = $(ErrorTotal),1 ! 3357: Endif ! 3358: ! 3359: SetRegValue $(KeyTo) {Bind,$(NoTitle),$(!REG_VT_MULTI_SZ),$(ToBindList)} ! 3360: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3361: Set-add ErrorTotal = $(ErrorTotal),1 ! 3362: Endif ! 3363: SetRegValue $(KeyTo) {Export,$(NoTitle),$(!REG_VT_MULTI_SZ),$(ToExportList)} ! 3364: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3365: Set-add ErrorTotal = $(ErrorTotal),1 ! 3366: Endif ! 3367: SetRegValue $(KeyTo) {Route,$(NoTitle),$(!REG_VT_MULTI_SZ),$(ToRouteList)} ! 3368: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3369: Set-add ErrorTotal = $(ErrorTotal),1 ! 3370: Endif ! 3371: ! 3372: Debug-Output "UTILITY.INF: ToggleBinding; Registry update error total = "$(ErrorTotal) ! 3373: ! 3374: Ifint $(ErrorTotal) != 0 ! 3375: Set Status = UNABLE_WRITE_REGISTRY ! 3376: Else ! 3377: Set Status = NO_ERROR ! 3378: Endif ! 3379: ! 3380: TB_Return = + ! 3381: Ifstr(i) $(KeyFrom) != $(KeyNull) ! 3382: CloseRegKey $(KeyFrom) ! 3383: Endif ! 3384: Ifstr(i) $(KeyTo) != $(KeyNull) ! 3385: CloseRegKey $(KeyTo) ! 3386: Endif ! 3387: Ifstr(i) $(KeySvc) != $(KeyNull) ! 3388: CloseRegKey $(KeySvc) ! 3389: Endif ! 3390: Return $(Status) ! 3391: ! 3392: ;************************************************************************* ! 3393: ; end of section ToggleBinding ! 3394: ;************************************************************************* ! 3395: ! 3396: ;------------------------------------------------------------------------- ! 3397: ; ! 3398: ; ROUTINE: SortListIndex ! 3399: ; ! 3400: ; DESCRIPTION: Sort a list into sequence, returning an "index" list, which ! 3401: ; indicates the sort position of each of the original list ! 3402: ; elements. ! 3403: ; ! 3404: ; INPUTS: $0: List to be sorted ! 3405: ; $1: TRUE for ascending sort (FALSE otherwise) ! 3406: ; $2: TRUE for case-insensitive sort (FALSE otherwise) ! 3407: ; ! 3408: ; OUTPUTS: $R0: Index list ! 3409: ; ! 3410: ; NOTES: Lists of displayable numeric values will automatically ! 3411: ; be sorted numerically if they are all decimal or hex ! 3412: ; and the sort is case-insensitive (param $2 FALSE). ! 3413: ; ! 3414: ;---------------------------------------------------------------------------- ! 3415: [SortListIndex] ! 3416: Set List = $($0) ! 3417: Set BoolAscend = $($1) ! 3418: Set BoolCaseSens = $($2) ! 3419: ! 3420: LibraryProcedure IndexList, $(!LIBHANDLE), GenerateSortedIndexList, $(List), $(BoolAscend), $(BoolCaseSens) ! 3421: ! 3422: Return $(IndexList) ! 3423: ! 3424: ;------------------------------------------------------------------------- ! 3425: ; ! 3426: ; ROUTINE: SortByIndex ! 3427: ; ! 3428: ; DESCRIPTION: Sort a list into the sequence given by an "index list". ! 3429: ; ! 3430: ; INPUTS: $0: List to be sorted ! 3431: ; $1: Index list ! 3432: ; ! 3433: ; OUTPUTS: $R0: Index list ! 3434: ; ! 3435: ;---------------------------------------------------------------------------- ! 3436: [SortByIndex] ! 3437: Set List = $($0) ! 3438: Set IndexList = $($1) ! 3439: Set NewList = {} ! 3440: ! 3441: ForListDo $(IndexList) ! 3442: Set Index = $($) ! 3443: Set Item = *($(List),$(Index)) ! 3444: Set NewList = >($(NewList),$(Item)) ! 3445: EndForListDo ! 3446: ! 3447: Return $(NewList) ! 3448: ! 3449: ;------------------------------------------------------------------------- ! 3450: ; ! 3451: ; ROUTINE: SortList ! 3452: ; ! 3453: ; DESCRIPTION: Sort a list into sequence, returning a sorted list. ! 3454: ; ! 3455: ; INPUTS: $0: List to be sorted ! 3456: ; $1: TRUE for ascending sort (FALSE otherwise) ! 3457: ; $2: TRUE for case-sensitive sort (FALSE for case-ins) ! 3458: ; ! 3459: ; OUTPUTS: $R0: Sorted list ! 3460: ; ! 3461: ; NOTES: Lists of displayable numeric values will automatically ! 3462: ; be sorted numerically if they are all decimal or hex ! 3463: ; and the sort is case-insensitive (param $2 FALSE). ! 3464: ; ! 3465: ;---------------------------------------------------------------------------- ! 3466: [SortList] ! 3467: Set List = $($0) ! 3468: Shell "" SortListIndex $(List) $($1) $($2) ! 3469: Set IndexList = $($R0) ! 3470: Shell "" SortByIndex $(List) $(IndexList) ! 3471: Set ResultList = $($R0) ! 3472: ! 3473: return $(ResultList) ! 3474: ! 3475: ;************************************************************************* ! 3476: ; end of file UTILITY.INF ! 3477: ;************************************************************************* ! 3478: ! 3479: ;************************************************************************* ! 3480: ; ! 3481: ; SECTION: UpdateDetectionDllNames ! 3482: ; ! 3483: ; PURPOSE: Search for files of the name ???NCDET.DLL. ! 3484: ; Update the Registry accordingly. ! 3485: ; ! 3486: ; ! 3487: ; ARGUMENTS: None ! 3488: ; ! 3489: ; RETURNS: $R0 STATUS_SUCCESSFUL if Registry updated ! 3490: ; STATUS_USERCANCEL if no update was required ! 3491: ; STATUS_FAILED if failed ! 3492: ; ! 3493: ; NOTES: This routine searches for all DLLs named ???NCDET.DLL ! 3494: ; and adds them to a list containing the name of the ! 3495: ; "standard" detection DLL, MSNCDET.DLL. ! 3496: ; ! 3497: ; Netcard detection is stopped and restarted if the ! 3498: ; Registry is updated. ! 3499: ; ! 3500: ; REFERENCES: ! 3501: ; ! 3502: ; MODIFIES: ! 3503: ; ! 3504: ;************************************************************************* ! 3505: [DetectionDllFiles] ! 3506: DetectionDllsFound = {} ? $(!LIBHANDLE) FindFileInstances $(!STF_WINDOWSSYSPATH)"\???ncdet.dll" ! 3507: ! 3508: [UpdateDetectionDllNames] ! 3509: Set Status = STATUS_FAILED ! 3510: read-syms InitBaseVars ! 3511: Detect DetectionDllFiles ! 3512: Set DllValueName = "NetcardDlls" ! 3513: ! 3514: OpenRegKey $(!REG_H_LOCAL) "" "System\Setup" $(MAXIMUM_ALLOWED) KeySetup ! 3515: Ifstr(i) $(KeySetup) == $(KeyNull) ! 3516: Debug-Output "UTILITY.INF: [UpdateDetectionDllNames] cant open System\Setup key" ! 3517: Goto UDDN_Return ! 3518: Endif ! 3519: ! 3520: ; Prefix the list with MSNCDET.DLL ! 3521: ! 3522: Set NewDllList = {"MSNCDET.DLL"} ! 3523: ForListDo $(DetectionDllsFound) ! 3524: Set NewDllList = >($(NewDllList),$($)) ! 3525: EndForListDo ! 3526: ! 3527: ; Get the old list ! 3528: ! 3529: Set UpdateRequired = 1 ! 3530: GetRegValue $(KeySetup) $(DllValueName) DllNamesValue ! 3531: Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS) ! 3532: Set DllNames = *($(DllNamesValue),4) ! 3533: Debug-Output "UTILITY.INF: [UpdateDetectionDllNames] DllNames = "$(DllNames) ! 3534: Set UpdateRequired = 0 ! 3535: ! 3536: ; See if all the names are already present ! 3537: ! 3538: ForListDo $(NewDllList) ! 3539: Set DllIndex = ~($(DllNames),$($)) ! 3540: Ifint $(DllIndex) == 0 ! 3541: Set UpdateRequired = 1 ! 3542: Endif ! 3543: EndForListDo ! 3544: Endif ! 3545: ! 3546: Set Status = STATUS_SUCCESSFUL ! 3547: ! 3548: Ifint $(UpdateRequired) == 1 ! 3549: Debug-Output "UTILITY.INF: [UpdateDetectionDllNames] new DLL names = "$(NewDllList) ! 3550: Set ValueInfo = {$(DllValueName), $(NoTitle), $(!REG_VT_MULTI_SZ), $(NewDllList)} ! 3551: SetRegValue $(KeySetup) $(ValueInfo) ! 3552: Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ! 3553: Set Status = STATUS_FAILED ! 3554: Else ! 3555: Shell "NCPARAM.INF" Param_ControlDetection DTEND ! 3556: Shell "NCPARAM.INF" Param_ControlDetection DTSTART ! 3557: Endif ! 3558: Else ! 3559: Set Status = STATUS_USERCANCEL ! 3560: Endif ! 3561: CloseRegKey $(KeySetup) ! 3562: ! 3563: UDDN_Return = + ! 3564: Return $(Status) ! 3565: ! 3566: ;************************************************************************* ! 3567: ; end of section UpdateDetectionDllNames ! 3568: ;************************************************************************* ! 3569: ! 3570: ;************************************************************************* ! 3571: ; ! 3572: ; SECTION: CheckIfCopyNecessary ! 3573: ; ! 3574: ; PURPOSE: Check a set of files and see if all are present. Used ! 3575: ; to offer the user a "current files" versus "new files" ! 3576: ; choice. ! 3577: ; ! 3578: ; ARGUMENTS: $0 list of path names corresponding to names ! 3579: ; given in next parameter ! 3580: ; $1 nested list of file names; see NOTES below ! 3581: ; ! 3582: ; RETURNS: $R0 STATUS_SUCCESSFUL or ! 3583: ; STATUS_FAILED ! 3584: ; ! 3585: ; REFERENCES: nothing ! 3586: ; ! 3587: ; MODIFIES: nothing ! 3588: ; ! 3589: ; NOTES: Typical values (taken from OEMNSVWK.INF) might be: ! 3590: ; ! 3591: ; $0: {$(!STF_WINDOWSSYSPATH),$(!STF_WINDOWSSYSPATH)\drivers} ! 3592: ; $1: {{"BOWSVC.DLL","WKSSVC.DLL","LMREPL.EXE"},+ ! 3593: ; {"SMBTRSUP.SYS","BROWSER.SYS","RDR.SYS"}} ! 3594: ; ! 3595: ; ! 3596: ;************************************************************************* ! 3597: [CheckIfCopyNecessary] ! 3598: Set Status = STATUS_SUCCESSFUL ! 3599: Set PathList = $($0) ! 3600: Set NamesList = $($1) ! 3601: ! 3602: Set Index = 0 ! 3603: Set Found = 1 ! 3604: ForListDo $(PathList) ! 3605: Set ThisPath = $($) ! 3606: Set-add Index = Index,1 ! 3607: Set NameList = *($(NamesList),$(Index)) ! 3608: ForListDo $(NameList) ! 3609: Set FileToCheck = $(ThisPath)\$($) ! 3610: LibraryProcedure FilePresent,$(!LIBHANDLE), CheckFileExistance $(FileToCheck) ! 3611: Ifstr(i) $(FilePresent) != "YES" ! 3612: Set Found = 0 ! 3613: Endif ! 3614: EndForListDo ! 3615: EndForListDo ! 3616: ! 3617: Ifint $(Found) != 1 ! 3618: Set Status = STATUS_FAILED ! 3619: Endif ! 3620: ! 3621: Return $(Status) ! 3622: ! 3623: ;************************************************************************* ! 3624: ; end of section CheckIfCopyNecessary ! 3625: ;************************************************************************* ! 3626: ! 3627: ;************************************************************************* ! 3628: ; ! 3629: ; SECTION: CetBusTypeDialog ! 3630: ; ! 3631: ; PURPOSE: Call the GetBusDialog function in ncpa.cpl and ! 3632: ; get the location of the network card. ! 3633: ; ! 3634: ; ARGUMENTS: $0 Card name description ! 3635: ; $1 Default bus type ! 3636: ; $2 Default bus number ! 3637: ; ! 3638: ; RETURNS: $R0 NO_ERROR ! 3639: ; $R1 BusType ! 3640: ; $R2 BusNumber ! 3641: ; ! 3642: ; REFERENCES: nothing ! 3643: ; ! 3644: ; MODIFIES: nothing ! 3645: ; ! 3646: ;************************************************************************* ! 3647: ! 3648: [GetBusTypeDialog] ! 3649: set CardName = $($0) ! 3650: set BusInterfaceType = $($1) ! 3651: set BusNumber = $($2) ! 3652: ! 3653: ifstr(i) $(BusInterfaceType) == "" ! 3654: set BusInterfaceType = 1 ; ISA ! 3655: endif ! 3656: ifstr(i) $(BusNumber) == "" ! 3657: set BusNumber = 0 ; Bus 0 ! 3658: endif ! 3659: set FLibraryErrCtl = 1 ! 3660: LibraryProcedure BusInfo $(!NCPA_HANDLE), GetBusTypeDialog, $(!STF_HWND), $(CardName), $(BusInterfaceType), $(BusNumber) ! 3661: set FLibraryErrCtl = 0 ! 3662: ! 3663: ; return values ! 3664: ! 3665: ifint *($(BusInfo),1) == 0 ! 3666: set ReturnValue = NO_ERROR ! 3667: set BusInterfaceType = *($(BusInfo),2) ! 3668: set BusNumber = *($(BusInfo),3) ! 3669: else ! 3670: set ReturnValue = ERROR ! 3671: endif ! 3672: ! 3673: Return $(ReturnValue), $(BusInterfaceType), $(BusNumber) ! 3674: ! 3675: ;************************************************************************* ! 3676: ; end of section GetBusTypeDialog ! 3677: ;************************************************************************* ! 3678: ! 3679:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.