Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

526 lines
14 KiB

/*************************************************************************/
/* DETECT.SPR */
/* */
/* Netcard detection using the SProlog engine and its */
/* extension predicates. */
/*************************************************************************/
// Do the thing.
( (dt_detect)
(getbuses Buslist) // Get list of buses on this machine
(enumncdlls DllNameList) // Get list of available detection DLLs
(dt_detect_all_dlls DllNameList Buslist Dllhandle Id Option Reftoken)
(printall (nl nl
"Card ID: " Id
" Option name: " Option
" Ref token: " Reftoken
nl))
(dt_getconfig Dllhandle Reftoken Cfglist)
(printall (nl "Detectable configuration: " ))
(dt_printcfg Cfglist)
(nl)
(freelibrary Dllhandle)
)
( (dt_detect_all_dlls (Dll|Others) Buslist Dllhandle Id Option Reftoken)
(printif (nl "Verifying " Dll))
(dt_verifydll Dll Dllhandle)
(cut)
(dt_firstcard Dllhandle Buslist Id Option Reftoken)
(cut)
)
// Skip the bogus or failed DLL
( (dt_detect_all_dlls (_|Others) Buslist Dllhandle Id Option Reftoken)
(dt_detect_all_dlls Others Buslist Dllhandle Id Option Reftoken)
)
// Get the first netcard found; search all buses
( (dt_firstcard Dllhandle Buslist Id Option Reftoken)
(printif (nl "First/next entered for " Dll))
(dt_getnetcards Dllhandle 1000 () Netcardlist)
(dt_first_allbuses Dllhandle Buslist Netcardlist Id Option Reftoken)
(cut)
(printif (nl "*** Card found! Option = " Option nl))
)
// Dll didn't find a card; free it and fail.
( (dt_firstcard Dllhandle _ _ _ _)
(freelibrary Dllhandle)
(fail)
)
( (dt_first_allbuses Dllhandle ((Bustype Busindex)|Others) Netcardlist Id Option Reftoken)
(printif (nl "first_allbuses entered for bus " Bustype "/" Busindex))
(dt_firstnext Dllhandle Bustype Busindex Netcardlist Id Option Reftoken)
(cut)
)
( (dt_first_allbuses Dllhandle (_|Others) Netcardlist Id Option Reftoken)
(dt_first_allbuses Dllhandle Others Netcardlist Id Option Reftoken)
)
( (dt_firstnext Dllhandle Bustype Busindex ((Id Option)|Rest) Id Option Reftoken)
(printif (nl "[detect] Trying: " Option))
(ncdtfirstnext Dllhandle Id Bustype Busindex 1 Error Reftoken Confidence)
(failshowerror ncdtfirstnext Error)
(printif (" confidence " Confidence))
(failconfidence Confidence)
(printif (nl "[detect] FOUND: " Option))
)
( (dt_firstnext Dllhandle Bustype Busindex (_|Rest) Id Option Reftoken)
(dt_firstnext Dllhandle Bustype Busindex Rest Id Option Reftoken)
)
/* Verify that a DLL has all its required exports */
( (dt_verifydll Filename Dllhandle)
(loadlibrary Filename Dllhandle)
(dt_verifyexport Filename Dllhandle "NcDetectIdentify" _)
(dt_verifyexport Filename Dllhandle "NcDetectFirstNext" _)
(dt_verifyexport Filename Dllhandle "NcDetectOpenHandle" _)
(dt_verifyexport Filename Dllhandle "NcDetectCreateHandle" _)
(dt_verifyexport Filename Dllhandle "NcDetectCloseHandle" _)
(dt_verifyexport Filename Dllhandle "NcDetectQueryCfg" _)
(dt_verifyexport Filename Dllhandle "NcDetectVerifyCfg" _)
(dt_verifyexport Filename Dllhandle "NcDetectQueryMask" _)
(dt_verifyexport Filename Dllhandle "NcDetectParamRange" _)
/* (dt_verifyexport Filename Dllhandle "NcDetectParameterName" _) */
// (freelibrary Dllhandle)
)
( (dt_verifyexport Dllname Dllhandle Exportfunc Funcaddr)
(getprocaddress Dllhandle Exportfunc Funcaddr)
(cut)
)
( (dt_verifyexport Dllname _ Exportfunc 0)
(printif (nl "Export " Exportfunc
" missing from " Dllname nl))
(fail)
)
// Using the given DLL handle and netcard reference token,
// obtain the card's current configuration information
( (dt_getconfig Dllhandle Reftoken Cfglist)
(ncdtopenhandle Dllhandle Reftoken Error Cardhandle)
(failshowerror ncdtopenhandle Error)
(ncdtquerycfg Dllhandle Cardhandle Error Cfglist)
(failshowerror ncdtquerycfg Error)
(ncdtclosehandle Dllhandle Cardhandle _)
)
// Test predicate: pretty-print MSNCDET.DLL data.
( (dt_test)
(dt_testdll "MSNCDET.DLL" _)
)
/* Reveal all about a netcard detection DLL */
( (dt_testdll Filename Resultlist)
(loadlibrary Filename Dllhandle)
(checktell)
(libraryname Dllhandle Pathname)
(printif (nl "Bound to MSNCDET.DLL [" Pathname "]" nl))
(ncdtidentify Dllhandle 0 Error1 String1)
(failshowerror ncdtidentify Error1)
(printif (nl "Identification string is: " String1 nl))
(ncdtidentify Dllhandle 1 Error2 String2)
(failshowerror ncdtidentify Error2)
(printif (nl "Version string is: " String2 nl))
(dt_getnetcards Dllhandle 1000 () Netcardlist)
(dt_explode Dllhandle Netcardlist)
(checktold)
(freelibrary Dllhandle)
)
( (dt_getnetcards Dllhandle Id List List)
(printif (nl "Trying Id: " Id nl))
(not (ncdtidentify Dllhandle Id 0 _))
(printif (nl "Id: " Id " FAILED!" nl))
(cut)
)
( (dt_getnetcards Dllhandle Id Oldlist List)
(ncdtidentify Dllhandle Id Error Option)
(failerror Error)
(not (dt_showidrange Dllhandle Id))
(iplus Id 100 Nextid)
(dt_getnetcards Dllhandle Nextid ((Id Option)|Oldlist) List)
)
( (dt_showidrange Dllhandle Id)
(ncdtidentify Dllhandle Id Error String)
(failshowerror ncdtidentify Error)
(printif (nl "Id " Id ", String: " String nl))
(iplus Id 1 Nextid)
(dt_showidrange Dllhandle Nextid)
)
/* Given a list with elements of the form (optionname idnumber), */
/* provide all possible information about the cards */
( (dt_explode _ ())
(cut)
)
( (dt_explode Dllhandle ((Id Card)|Rest))
(printif (nl nl "*** Option: " Card ", Id: " Id))
(dt_getparammask Dllhandle Id Paramlist)
(dt_mergeparamrange Dllhandle Id Paramlist Fulllist)
(dt_printparams Fulllist)
(dt_explode Dllhandle Rest)
)
/* Pretty-print a list of elements of the form */
/* (Paramname Softflag Confidence (rangelist) */
( (dt_printparams ())
(cut)
)
( (dt_printparams ((Name Soft Conf Rangelist)|Rest))
(printif (nl " Parameter: " Name ", " Soft ", " Conf
nl " Ranges: "))
(dt_printrange Rangelist)
(nl)
(dt_printparams Rest)
)
( (dt_printrange ())
(cut)
)
( (dt_printrange (Hex|Rest))
(hex_from Hex String)
(printif (String " "))
(dt_printrange Rest)
)
// Pretty-print a list of detected configuration values
// Each element has the form: (Paramname Value)
( (dt_printcfg ())
(cut)
)
( (dt_printcfg ((Param Value)|Rest))
(hex_from Value Hexvalue)
(printif (nl " Parameter " Param " is set to " Hexvalue))
(dt_printcfg Rest)
)
/* return a list of elements of the form: */
/* (Paramname Softflag Confidence) */
( (dt_getparammask Dllhandle Id Paramlist)
(ncdtquerymask Dllhandle Id Error Paramlist)
(failshowerror ncdtquerymask Error)
)
/* Given the parameter list of a netcard option,
* merge the paramter range information into it.
* Each element of the resulting list has the form:
* (Paramname Ctl Confidence Rangelist)
* Each element of 'Rangelist' is numeric.
*/
( (dt_mergeparamrange Dllhandle Id Paramlist Fulllist)
(dt_mergerange Dllhandle Id Paramlist () Fulllist)
)
( (dt_mergerange _ _ () List List)
(cut)
)
( (dt_mergerange Dllhandle Id ((Param Ctl Conf)|Rest) Inlist Outlist)
(ncdtparamrange Dllhandle Id Param Error Rangelist)
(dt_mergerange Dllhandle Id Rest ((Param Ctl Conf Rangelist)|Inlist) Outlist)
)
( (dt_testparamrange Dllhandle Id Paramlist)
(ncdtquerymask Dllhandle Id Error Masklist)
(failshowerror ncdtquerymask Error)
(dt_allparamrange Dllhandle Id Masklist () Paramlist)
)
( (dt_allparamrange _ _ () Paramlist Paramlist)
(printif (nl "end of params" nl))
(cut)
)
( (dt_allparamrange Dllhandle Id ((Param Ctl Conf)|Rest) Inlist Outlist)
(printif (nl "entered dt_allparamrange, param: " Param nl))
(ncdtparamrange Dllhandle Id Param Error Rangelist)
(printif (nl "Parameter " Param ", range: " ))
(display Rangelist)
(printif ("." nl))
(dt_allparamrange Dllhandle Id Rest ((Param Rangelist)|Inlist) Outlist)
)
( (failerror 0)
(cut)
)
( (failerror Error)
(fail)
)
( (failshowerror _ 0)
(cut)
)
( (failshowerror Functionname Error)
(printif (nl "*** API ERROR in " Functionname ": " Error nl))
(fail)
)
/* Fail if Confidence is < 70 */
( (failconfidence Confidence)
(iless 70 Confidence)
)
( (dt_bindtomsncdet Dllhandle)
(loadlibrary "msncdet.dll" Dllhandle)
)
/* Enumerate the values under the NCPA. */
( (enumncpa)
(regopenkey machine "software\microsoft\ncpa\currentversion" Ncpakey)
(not (enumvalues Ncpakey))
(regclosekey Ncpakey)
)
// Return the list of Netcard detection DLLs
( (enumncdlls DllNameList)
(regopenkey machine "System\Setup" Setupkey)
(regquerydefaultvalue Setupkey "NetcardDlls" () DllNameList)
(regclosekey Setupkey)
)
( (regquerydefaultvalue Regkey Valuename Defaultvalue Resultvalue)
(regqueryvalue Regkey Valuename Resultvalue)
(cut)
)
( (regquerydefaultvalue _ _ Value Value)
)
/* Enumerate the keys under <machine>\Software\Microsoft */
( (enummicrosoft)
(regopenkey machine "software\microsoft" Mskey)
(not (enumkeys Mskey))
(regclosekey Mskey)
)
( (enumvalues Key)
(enumallvalues Key 0)
)
( (enumallvalues Key Index)
(regenumvalue Key Index Vname Vdata)
(nl)
(writes "Value name = ")
(writes Vname)
(writes "; data = ")
(display Vdata)
(iplus Index 1 Newindex)
(enumallvalues Key Newindex)
)
( (enumkeys Key)
(enumallkeys Key 0)
)
( (enumallkeys Key Index)
(regenumkey Key Index Keyname)
(nl)
(writes "Subkey name = ")
(writes Keyname)
(nl)
(iplus Index 1 Newindex)
(enumallkeys Key Newindex)
)
/* Test DLL loading and proc addring. */
( (loadcplsetup Addr)
(loadlibrary "ncpa.cpl" Ninstance)
(getprocaddress Ninstance "CPlSetup" Addr)
)
/* Enumerate the busses on this machine.
Returns a list where each element has the form:
(<interface type> <bus number>)
See NTIOAPI.H for enum INTERFACE_TYPE.
*/
( (getbuses Buslist)
(busnamelist Busnames)
(printif (nl "Attempt to open Hardware\system key"))
(regopenkey machine "hardware\description\system" Buskey)
(printif (nl "Hardware\system key open"))
(enumbustypes Buskey Busnames () Buslist)
(printif (nl))
(regclosekey Buskey)
)
( (enumbustypes Buskey () List List)
(cut)
)
( (enumbustypes Buskey ((Bustype Busname)|Others) Inlist Outlist)
(printif (nl "Attempt to open bus type key: " Busname))
(regopenkey Buskey Busname Bustypekey)
(cut)
(enumbusinstances Bustypekey Busname Bustype 0 () Instancelist)
(append Inlist Instancelist Newlist)
(regclosekey Bustypekey)
(enumbustypes Buskey Others Newlist Outlist)
)
// If bus type subkey open failed, just skip it.
( (enumbustypes Buskey ((Bustype Busname)|Others) Inlist Outlist)
(enumbustypes Buskey Others Inlist Outlist)
)
( (enumbusinstances Buskey _ _ Index List List)
(not (regenumkey Buskey Index _))
(printif (nl " Bus key enumeration complete" nl))
(cut)
)
( (enumbusinstances Buskey Busname Bustype Index List Buslist)
(regenumkey Buskey Index Keyname)
(printif (nl " Bus key found: " Keyname))
(int_from Keyname Busindex)
(iplus Index 1 Newindex)
(enumbusinstances Buskey Busname Bustype Newindex ((Bustype Busindex)|List) Buslist)
)
// These key names came from NTOS\CONFIG\CMCONFIG.C
// Interface numbers are from NTIOAPI.H
( (busnamelist List)
(eq List ( (0 "ScsiAdapter")
(1 "MultifunctionAdapter") // ISA
(2 "EisaAdapter")
(3 "DtiAdapter") // MCA ???
(4 "TcAdapter") ))
)
( (showncpacfg)
(regopenkey machine "software\microsoft\ncpa\currentversion" Ncpakey)
(regqueryvalue Ncpakey "Bindfile" Binddata)
(string_concat "(" Binddata Newdata)
(string_concat Newdata ")" Enddata)
(string_to_list Enddata Bindlist)
(enumncpacfg Bindlist)
(regclosekey Ncpakey)
)
( (enumncpacfg ())
(cut)
)
( (enumncpacfg (H|T))
(eq H (Hardkey Servicekey
Rnctype Drivergroups Xportgroups Factsok
Bindings Review Autostart Usetype
Devname Devtype Servicename Groupname Bindlist))
(printif (nl "Component: " Devname nl " services key: " Servicekey nl))
(printif (nl "Bindlist: "))
(display Bindlist)
(printif (nl))
(enumncpacfg T)
)
/* Initialization and setup */
( (regtestinit)
(consult "printif.spr")
(pctl on)
/* (assertz (telltarget "ncdttest.out")) */
)
( (checktell)
(telltarget X)
(tell X)
)
( (checktell) )
( (checktold)
(telltarget X)
(told)
)
( (checktold) )
/* Convert a list to a string which can be used in a SETUP INF */
( (infcvt List String)
(inflist true List "" String)
)
( (inflist _ () String String)
(cut)
)
( (inflist true (H|T) Sin Sout)
(string_concat Sin "{" S1)
(infatom H S1 S2)
(infappendcomma T S2 S3)
(inflist false T S3 S4)
(string_concat S4 "}" Sout)
)
( (inflist false (H|T) Sin Sout)
(infatom H Sin S1)
(infappendcomma T S1 S2)
(inflist false T S2 Sout)
)
( (infatom () String String)
(cut)
)
( (infatom L Sin Sout)
(nonvar L)
(eq L (H|T))
(cut)
(inflist true L Sin Sout)
)
( (infatom X Sin Sout)
(var X)
(cut)
(string_concat Sin "<_var_>" S1)
)
( (infatom X Sin Sout)
(atom X)
(cut)
(string_from X S1)
(string_concat Sin S1 Sout)
)
( (infatom X Sin Sout)
(integer X)
(cut)
(string_from X S1)
(string_concat Sin S1 Sout)
)
( (infatom X Sin Sout)
(string X)
(cut)
(string_concat Sin X Sout)
)
( (infatom X Sin Sout)
(string_concat Sin "???" Sout)
)
( (infappendcomma () String String)
(cut)
)
( (infappendcomma _ Sin Sout)
(string_concat Sin "," Sout)
)
#include "..\default.spr"
//
// End of DETECT.SPR
//