'An alternative Task Manager

$use "version.lib"
$ifndef WIN32
$define WIN32
$endif

$ifdef WIN32
$define WIN32_LEAN_AND_MEAN
$endif
 
$define __winreg_inc__
$include "windowssdk.inc"
$include "Psapi.inc"
$include "TlHelp32.inc"
$include "Registry.inc"

DECLARE IMPORT, _GetLastError ALIAS GetLastError(),INT
DECLARE IMPORT, _FormatMessage ALIAS FormatMessageA(dwFlags AS INT,lpSource AS POINTER,dwMessageId AS INT,dwLanguageId AS INT,lpBuffer AS STRING,nSize AS INT,Arguments AS POINTER),INT
DECLARE IMPORT, _CloseServiceHandle ALIAS CloseServiceHandle(hSCObject AS INT),INT


'====================================================
'                                                   '
' This code to run this program as an Administrator '
'                                                   '
'====================================================

string MyProgram = "taskman4.exe" 'Name of this exe to run as admin.

'string RAS2 = ""
'RAS2 = ltrim$(RegGetValue("HKEY_CURRENT_USER\\Software\\StringMap","RunAsAdminDone"))

'if RAS2 = "1"
'   RegDeleteValue("HKEY_CURRENT_USER\\Software\\StringMap","RunAsAdmin")
'   RegDeleteValue("HKEY_CURRENT_USER\\Software\\StringMap","RunAsAdminDone")
   'RegDeleteKey("HKEY_CURRENT_USER\\Software\\StringMap")
'else
'   RegSetValue("HKEY_CURRENT_USER\\Software\\StringMap",getstartpath + MyProgram,"RunAsAdmin")
'   system getstartpath + "RunAsAdmin.exe" 
'   end 
'endif

'============================
'                           '
' End of Administrator code '
'                           '
'============================

handle hProcess, hTokenSelf, hProcSelf

hProcSelf = OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() )
OpenProcessToken(hProcSelf,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY ,&hTokenSelf)

SetPrivilege(hTokenSelf,"SeDebugPrivilege",true)

type FILETIME
    DEF dwLowDateTime as UINT
    DEF dwHighDateTime as UINT 
ENDTYPE

TYPE WIN32_FILE_ATTRIBUTE_DATA 
    DEF dwFileAttributes as UINT
    DEF ftCreationTime as FILETIME 
    DEF ftLastAccessTime as FILETIME 
    DEF ftLastWriteTime as FILETIME 
    DEF nFileSizeHigh as UINT 
    DEF nFileSizeLow as UINT 
ENDTYPE

WIN32_FILE_ATTRIBUTE_DATA wad

Type File_Ver_Info
	string comments
	string CompanyName
	string FileDescription
	string FileVersion
	string InternalName
	string LegalCopyright
	string LegalTrademarks
	string OriginalFileName
	string PrivateBuild
	string ProductName
	string ProductVersion
	string SpecialBuild
End Type

File_Ver_Info j

TYPE VS_FIXEDFILEINFO
  UINT dwSignature
  UINT dwStrucVersion
  UINT dwFileVersionMS
  UINT dwFileVersionLS
  UINT dwProductVersionMS
  UINT dwProductVersionLS
  UINT dwFileFlagsMask
  UINT dwFileFlags
  UINT dwFileOS
  UINT dwFileType
  UINT dwFileSubtype
  UINT dwFileDateMS
  UINT dwFileDateLS
ENDTYPE

type FFINFO
	string 	filevers
	string	prodvers
	string 	opersys
	string	filetyp
endtype

def service as ENUM_SERVICE_STATUS
def Xbuffer as pointer
Xbuffer = new SERVICE_STATUS_PROCESS

DEF ErMes AS String
DEF nSize,Arguments AS Uint
def hService, Bneeded as int

int hHandle = 0
int retVal = 0

uint dwBytesNeeded = 0
uint dwServicesReturned = 0
uint dwResumedHandle = 0
uint dwServiceType = SERVICE_WIN32 '| SERVICE_DRIVER
def lpServiceStatus AS SERVICE_STATUS

string LServiceName[10000]
string LServiceDisplayName[10000]
int LServiceId[10000]
string LServiceStatus[10000]
string LServiceType[10000]
string StopServiceName,StartServiceName,ServiceNameStart,StartUpType
int CloseService = 0
int StartChange = 0
int RestartServices = 0
int sps = 0
int i = 0
 
DEF dy,dy2,dy3,dy4,dy5,boxwin:window
DEF array[1000]:string
DEF array2[1000]:string
DEF apps[1000]:string 
DEF appsname[1000]:string 
DEF Proc[1000]:string
DEF Proc2[1000]:string
DEF loc[1000]:string
DEF loc2[1000]:string
DEF desc[1000]:string
DEF desc2[1000]:string
DEF count,list,n2,n3,countp:int
DEF vPos:int
DEF hdesk,hnext,style:INT
DEF text,answer$:STRING 
DEF conf,answer,callfromad:int 
DEF initprocs,totalprocs:int 
DEF firstrun:int
DEF repop:int
DEF countup:int
DEF a1,a2,b1,b2,z,length,descfound,ScrollPosIs,zzz:int 
DEF t1,t2,t3,t4,t5,t6,lstr,savedesc,AppSelected:string
DEF position,sort,sort1,sort2,browse:int

string item,PID

CONST button_1 = 1
CONST button_2 = 2
CONST button_3 = 3
CONST button_4 = 4
CONST button_5 = 5
CONST button_6 = 6
CONST button_7 = 7
CONST button_8 = 8

CONST static_1 = 10
CONST static_2 = 11
CONST static_3 = 12
CONST static_4 = 13
CONST static_5 = 14
CONST static_6 = 15
CONST static_7 = 16
CONST static_8 = 17
CONST static_9 = 18
CONST static_10 = 19
CONST static_11 = 20
CONST static_12 = 21
CONST static_13 = 22
CONST static_14 = 23
CONST static_15 = 24
CONST static_16 = 25
CONST static_17 = 26
CONST static_21 = 30

CONST RADIO_1 = 41
CONST RADIO_2 = 42

const vs1 = 51
const vs2 = 52
const vs3 = 53
const vs4 = 54
const vs5 = 55

conf = 0
firstrun = 0
sort = 0
sort2 = 0

'bcr = 43
'bcg = 85
'bcb = 142

bcr = 0
bcg = 0
bcb = 0

mfr = 0
mfg = 0
mfb = 0

mbr = 255
mbg = 255
mbb = 255

LABEL relist
list = 0
count = 0

OPENWINDOW dy,100,100,830,495,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," Alternative Task Manager by Andy.",&hnd	
floodfill dy,1,1,rgb(bcr,bcg,bcb)

CONTROL dy,@LISTBOX,"",10,90,200,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,747	
CONTROL dy,@LISTBOX,"",210,90,80,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,748
CONTROL dy,@LISTBOX,"",290,90,250,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,749 
CONTROL dy,@LISTBOX,"",540,90,250,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,750	

CONTROL dy,@static,"",540,20,200,25,@CTEDITLEFT,801

CONTROL dy,@SCROLLBAR,"",790,90,20,295,0x50000001,16	
CONTROL dy,@BUTTON,"End Process",10,405,110,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1	
CONTROL dy,@BUTTON,"Quit",710,405,100,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_2	

CONTROL dy,@BUTTON,"Sort A-Z",230,15,110,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_5
CONTROL dy,@BUTTON,"Sort by ID",230,15,110,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_7
SHOWWINDOW dy,@SWHIDE,button_7
SHOWWINDOW dy,@SWHIDE,button_5

CONTROL dy,@BUTTON,"Open Location",130,405,160,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_6	
CONTROL dy,@BUTTON,"Get details",300,405,100,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_8
CONTROL dy,@BUTTON,"View Apps",410,405,120,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_3
CONTROL dy,@BUTTON,"View Services",540,405,140,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_4

CONTROL dy,@STATIC,"Processes",10,55,190,25,@CTEDITLEFT, static_1
CONTROL dy,@STATIC,"Proc ID",210,55,80,25,@CTEDITLEFT, static_2
CONTROL dy,@STATIC,"Process Description",290,55,180,25,@CTEDITLEFT, static_3
CONTROL dy,@STATIC,"Process Location",540,55,180,25,@CTEDITLEFT, static_4

BEGINMENU dy
   MENUTITLE "&File"
   MENUITEM "Quit",0,1000

   MENUTITLE "&Process"
   MENUITEM "End process",0,1001

   MENUTITLE "&Location"
   MENUITEM "Open location",0,1002

   MENUTITLE "&Details"
   MENUITEM "Get details",0,1003

   MENUTITLE "&View"
   MENUITEM "View applications",0,1004
   MENUITEM "View services",0,1005
ENDMENU

SETCONTROLCOLOR dy, button_1,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_2,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_3,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_4,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_5,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_6,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_7,rgb(0,0,0), rgb(255,255,255)
SETCONTROLCOLOR dy, button_8,rgb(0,0,0), rgb(255,255,255)

SETCONTROLCOLOR dy, static_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy, static_2,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy, static_3,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy, static_4,RGB(160,138,0),rgb(0,0,0)

SETCONTROLCOLOR dy, 801,RGB(160,138,0),rgb(0,0,0)

SETFONT dy,"Arial",12,500,0			
SETFONT dy,"Arial",12,500,0,static_1
SETFONT dy,"Arial",12,500,0,static_2
SETFONT dy,"Arial",12,500,0,static_3
SETFONT dy,"Arial",12,500,0,static_4
SETFONT dy,"Arial",12,500,0,button_1
SETFONT dy,"Arial",12,500,0,button_2
SETFONT dy,"Arial",12,500,0,button_3
SETFONT dy,"Arial",12,500,0,button_4
SETFONT dy,"Arial",12,500,0,button_5
SETFONT dy,"Arial",12,500,0,button_6
SETFONT dy,"Arial",12,500,0,button_7
SETFONT dy,"Arial",12,500,0,button_8
SETFONT dy,"Arial",12,500,0,747
SETFONT dy,"Arial",12,500,0,748
SETFONT dy,"Arial",12,500,0,749
SETFONT dy,"Arial",12,500,0,750
SETFONT dy,"Arial",12,500,0,801
count = -1

'Sub routine to find and list processes running
retval = FindInitialProcesses("")

'Start checking for changes to the number of processes running
starttimer dy,2000

SETSCROLLRANGE dy,16,0,count
SETCONTROLTEXT dy,static_1, "Processes (" + LTRIM$(STR$(GETSTRINGCOUNT(dy,747))) + ")"

vPos = count

WAITUNTIL dy=0 
END

'Sub routine to find the name of a process
SUB findPIDByName(string fileNameToFindPID),int

LABEL reenumprocs

const TH32CS_SNAPHEAPLIST	=0x00000001
const TH32CS_SNAPPROCESS	=0x00000002
const TH32CS_SNAPTHREAD		=0x00000004
const TH32CS_SNAPMODULE		=0x00000008
const TH32CS_SNAPMODULE32	=0x00000010
const TH32CS_SNAPALL		=(TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
const TH32CS_INHERIT		=0x80000000
const PROCESS_ALL_ACCESS	=0x1F0FFF

type PROCESSENTRY32
	uint dwSize
	uint cntUsage
	uint th32ProcessID
	uint th32DefaultHeapID
	uint th32ModuleID
	uint cntThreads
	uint th32ParentProcessID
	uint pcPriClassBase
	uint dwFlags
	istring szExeFile[259]
endtype

def pe:PROCESSENTRY32

int retval, x
x = 0
count = -1


hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)
pe.dwSize=len(pe)
retval=Process32First(hSnapshot,pe)

do

if LCASE$(pe.szExeFile) = LCASE$(fileNameToFindPID)
	CloseHandle(hSnapshot)
	return pe.th32ProcessID
ENDIF
item = pe.szExeFile
PID = STR$(pe.th32ProcessID)

x++

dwPriorityClass = 0
 
def dwVerHnd:word
dwVerHnd = 0

string lpFilename=space$(255)
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID)
GetModuleFileNameEx(hProcess,0,lpFilename,len(lpFilename))
dwVerInfoSize = GetFileVersionInfoSize(lpFilename, dwVerHnd)

    if hProcess = NULL
      'print error("Open Process Fail findpidbyname ")
    else
    
      dwPriorityClass = GetPriorityClass(hProcess)

      if dwPriorityClass <>0
			
		ELSE
		'	print error("dwPriorityClass")
		endif
	CloseHandle(hProcess)

endif

	pe.dwSize=len(PROCESSENTRY32)
	retval=Process32Next(hSnapshot,pe)


until retval = false

CloseHandle(hSnapshot)

return 0
ENDSUB

'Sub routine to kill off a process
SUB killProcess(int PID)

HANDLE hProc

hProc = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE, FALSE, PID)

          if hProc <>0

               if TerminateProcess(hProc, 0) <>0
               else 
                  CloseHandle(hProc)
			   endif
          else 
		  ENDIF
ENDSUB


SUB SetPrivilege(HANDLE hToken, string lpszPrivilege,INT bEnablePrivilege) 

	def tp:TOKEN_PRIVILEGES
	def luid:LUID

	if LookupPrivilegeValue(NULL,lpszPrivilege,&luid ) = 0
		error("LookupPrivilegeValue error: ")
		return FALSE
	ENDIF

	tp.PrivilegeCount = 1
	tp.Privileges[0].Luid = luid
	
    if bEnablePrivilege = true
		tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
	else
		tp.Privileges[0].Attributes = 0
	ENDIF

	'// Enable the privilege or disable all privileges.

	if AdjustTokenPrivileges(hToken,FALSE, &tp, LEN(TOKEN_PRIVILEGES), 0, 0) =0
			error("AdjustTokenPrivileges error:") 
		  return FALSE 
	ENDIF 

	if GetLastError() = ERROR_NOT_ALL_ASSIGNED

		  'print "The token does not have the specified privilege."
		  return FALSE
	ENDIF

	return TRUE

ENDSUB

SUB error(string errorCall),string  

   INT CodeErrorId, nBufferSize, flag 
   STRING sBuffer,retError  

   nBufferSize = 1024 
   sBuffer = String$(nBufferSize, Chr$(0)) 
   flag=FORMAT_MESSAGE_FROM_SYSTEM 

   CodeErrorId=GetLastError() 

   FormatMessage(flag, NULL,CodeErrorId,LANG_NEUTRAL, sBuffer, nBufferSize ,NULL ) 
	retError = errorCall+" / "+sBuffer+" / ErrorID = "+str$(CodeErrorID)

return retError

endsub

'Processes screen handler
SUB hnd(),int
SELECT @MESSAGE

	case @IDCREATE			
		  CENTERWINDOW dy

	CASE @IDMENUPICK 
        SELECT @MENUNUM
				CASE 1000 'Quit
                 closewindow dy 
                 end
					  
				CASE 1001 'End process
                 goto EndProcessLabel

            case 1002 'Location
                 goto OpenLabel

            case 1003 'Details
                 showwindow dy,@SWHIDE		
					  showdetails()	
                 showwindow dy,@SWRESTORE

            case 1004 'Apps
				     SHOWWINDOW dy,@SWHIDE 
                 list = 0
                 count = -1
                 applications() 
                 SHOWWINDOW dy,@SWSHOW 

            case 1005 'Services
                 showwindow dy,@SWHIDE		
					  hHandle = OpenTheSCManager()
					  EnumAllServices(hHandle)
					  ViewServices()	
                 showwindow dy,@SWRESTORE
					  

        endselect	
	
	case @IDVSCROLL
		select @CONTROLID
			case 16
				select @CODE
					CASE @SBTHUMBTRACK										
					CASE& @SBTHUMBPOS												
						SETSCROLLPOS dy,16,@QUAL								
					CASE @SBLINEUP													
						SETSCROLLPOS dy,16,GETSCROLLPOS(dy,16) - 1		
					CASE @SBLINEDOWN												
						SETSCROLLPOS dy,16,GETSCROLLPOS(dy,16) + 1		
					CASE @SBPAGEUP													
						SETSCROLLPOS dy,16,GETSCROLLPOS(dy,16) - 10		
					CASE @SBPAGEDOWN												
						SETSCROLLPOS dy,16,GETSCROLLPOS(dy,16) + 10		
						
				endselect

		  ENDSELECT
		  SETSELECTED dy,747,GETSCROLLPOS(dy,16)							
		  SETSELECTED dy,748,GETSCROLLPOS(dy,16)							
		  SETSELECTED dy,749,GETSCROLLPOS(dy,16)							
		  SETSELECTED dy,750,GETSCROLLPOS(dy,16)	

	CASE @IDTIMER
      answer = GETSELECTED(dy,747)
      answer$ = GETSTRING(dy,747, GETSELECTED(dy, 747))

    'Check ever 2 seconds for change in the number of processes

    'Sub routine to count processes now
	retval = CountProcesses("")

    'If there is a difference in the number of processes then update the processes screen
	IF countp <> totalprocs

      ScrollPosIs = GETSCROLLPOS(dy,16)
		STOPTIMER dy
		SETCONTROLTEXT dy,801,"updating...."
		sendmessage dy,LB_RESETCONTENT,0,0,747
		sendmessage dy,LB_RESETCONTENT,0,0,748
		sendmessage dy,LB_RESETCONTENT,0,0,749
		sendmessage dy,LB_RESETCONTENT,0,0,750

		FOR zzz = 1 TO countp
			 array[zzz] = ""
			 proc[zzz] = ""
			 desc[zzz] = ""
			 loc[zzz] = "" 

			 array2[zzz] = ""
			 proc2[zzz] = ""
			 desc2[zzz] = ""
			 loc2[zzz] = "" 
		NEXT zzz

		count = -1
		retval = FindInitialProcesses("")
		countp = count
		totalprocs = count + 1

		SETCONTROLTEXT dy,801,""
		STARTTIMER dy,2000
	ENDIF

	SETCONTROLTEXT dy,static_1, "Processes (" + LTRIM$(STR$(GETSTRINGCOUNT(dy,747))) + ")"

   'SETSELECTED dy,747,ScrollPosIs						
   'SETSELECTED dy,748,ScrollPosIs							
   'SETSELECTED dy,749,ScrollPosIs							
   'SETSELECTED dy,750,ScrollPosIs

   CASE @IDCONTROL

		SELECT @CONTROLID						
			case 747								
			case& 748
			case& 750							
			case& 749							
				select @notifycode			
					case @LBNDBLCLK	
                    showwindow dy,@SWHIDE		
						  showdetails()	
                    showwindow dy,@SWRESTORE	
				endselect						
		endselect	

        SELECT @CONTROLID

			CASE 747 'Process
                 SETSCROLLPOS dy,16,GETSELECTED(dy,747)
                 SETSELECTED dy,748,GETSELECTED(dy,747)
                 SETSELECTED dy,749,GETSELECTED(dy,747)
                 SETSELECTED dy,750,GETSELECTED(dy,747)

			CASE 748 'Process ID
                 SETSCROLLPOS dy,16,GETSELECTED(dy,748)
                 SETSELECTED dy,747,GETSELECTED(dy,748)
                 SETSELECTED dy,749,GETSELECTED(dy,748)
                 SETSELECTED dy,750,GETSELECTED(dy,748)

			CASE 749 'Process description
                 SETSCROLLPOS dy,16,GETSELECTED(dy,749)
                 SETSELECTED dy,747,GETSELECTED(dy,749)
                 SETSELECTED dy,748,GETSELECTED(dy,749)
                 SETSELECTED dy,750,GETSELECTED(dy,749)

			CASE 750 'Process location - not displayed - adjust screen size and remove "showwindow dy,@SWHIDE,750
                 SETSCROLLPOS dy,16,GETSELECTED(dy,750)
                 SETSELECTED dy,747,GETSELECTED(dy,750)
                 SETSELECTED dy,748,GETSELECTED(dy,750)
                 SETSELECTED dy,749,GETSELECTED(dy,750)

         CASE BUTTON_6 'Open file location
                  label OpenLabel
					   DEF q$:string 

						q$ = ""
						q$ = loc[GETSELECTED(dy,747)+1]

						n2 = INSTR(LCASE$(loc[GETSELECTED(dy,747)+1]),LCASE$(array[GETSELECTED(dy,747)+1]))
						n3 = LEN(array[GETSELECTED(dy,747)+1])

						REPLACE$(q$,n2-1,n3," ")

                  IF INSTR(q$,":") 

							SHOWWINDOW dy,@SWMINIMIZED
							SYSTEM "explorer.exe",q$
					  
							FOR x = 0 TO GETSTRINGCOUNT(dy,747)
								IF LTRIM$(GETSTRING(dy,747,x)) = LTRIM$(q$)
								   SETSELECTED dy,747,x   
								   SETSELECTED dy,748,x  
								   SETSELECTED dy,749,x  
								ENDIF
							NEXT x

                  ENDIF

                  SETFOCUS dy

            CASE BUTTON_4 'Processes button
                 stoptimer dy         
                 Showwindow dy,@SWHIDE	

					  hHandle = OpenTheSCManager()
					  EnumAllServices(hHandle)

                 label RefreshServices
                 ViewServices()
                 if RestartServices = 1
                    RestartServices = 0
                    goto RefreshServices
                 endif 

                 showwindow dy,@SWSHOW
	              starttimer dy,2000

            CASE BUTTON_5 'Not used as the list is now already sorted
                 sort = 1
                 sort1 = 1
                 sort2 = 0
                 SETCONTROLTEXT dy,button_5,"Sorting..."
                 sortlist()
                 SETCONTROLTEXT dy,button_5,"Sort A - Z"
				     SHOWWINDOW dy,@SWHIDE,button_5
				     SHOWWINDOW dy,@SWSHOW,button_7


            CASE BUTTON_7 'Process ID sort
                 SETCONTROLTEXT dy,button_7,"Sorting..."
                 sort = 1
                 sort1 = 0
                 sort2 = 1
                 sortlist()
                 sleep(500)
                 SETCONTROLTEXT dy,button_7,"Sort by ID"
					  SETCONTROLTEXT dy,static_1, "Processes (" + LTRIM$(STR$(GETSTRINGCOUNT(dy,747))) + ")"
                 DELETESTRING dy,747,0
                 DELETESTRING dy,748,0
                 DELETESTRING dy,749,0
                 DELETESTRING dy,750,0
				     SHOWWINDOW dy,@SWHIDE,button_7
				     SHOWWINDOW dy,@SWSHOW,button_5

            CASE BUTTON_8 'Show file details, e.g. Company name etc
                 showwindow dy,@SWHIDE		
					  showdetails()	
                 showwindow dy,@SWRESTORE

            CASE BUTTON_1 'End process
                 label EndProcessLabel 
                 answer = GETSELECTED(dy, 747)
                 answer$ = GETSTRING(dy, 747, GETSELECTED(dy, 747))

                 IF answer >= 0
          
                     SHOWWINDOW dy,@SWHIDE
					      GOSUB confirmscreen 
 
						  IF conf = 1

								 retval = findPIDByName(answer$)
	 
								IF retval <> 0
									killProcess(retval)
								ENDIF

								retval = CountProcesses("")

								sendmessage dy,LB_RESETCONTENT,0,0,747
								sendmessage dy,LB_RESETCONTENT,0,0,748
								sendmessage dy,LB_RESETCONTENT,0,0,749
								sendmessage dy,LB_RESETCONTENT,0,0,750

								FOR zzz = 1 TO countp
									 array[zzz] = ""
									 proc[zzz] = ""
									 desc[zzz] = ""
									 loc[zzz] = "" 

									 array2[zzz] = ""
									 proc2[zzz] = ""
									 desc2[zzz] = ""
									 loc2[zzz] = "" 
								NEXT zzz

								count = -1
								retval = FindInitialProcesses("")
								countp = count
								totalprocs = count + 1

                        conf = 0
                        SHOWWINDOW dy,@SWSHOW
						ELSE
                        SHOWWINDOW dy,@SWSHOW
                        STARTTIMER dy,2000
						ENDIF
				 ENDIF

			CASE BUTTON_2 'Close program
				  CLOSEWINDOW dy
              dy2 = 0
              END

			CASE BUTTON_3'Show Applications screen
				  SHOWWINDOW dy,@SWHIDE 
              list = 0
              count = -1
              applications() 
              SHOWWINDOW dy,@SWSHOW 

        ENDSELECT

		CASE @IDCLOSEWINDOW
 		     CLOSEWINDOW dy
           dy2 = 0
           END
   
ENDSELECT
RETURN 0
ENDSUB

SUB applications()

OPENWINDOW dy2,100,100,550,500,@CAPTION|@MINBOX|@MAXBOX,0," An Alternative Task Manager - Applications.",&hnd2
floodfill dy2,1,1,rgb(bcr,bcg,bcb)

CONST button_1 = 1
CONST button_2 = 2
CONST button_3 = 3

CONST static_1 = 10
CONST static_2 = 11

CONTROL dy2,@LISTBOX,"",10,75,500,315,@HSCROLL|@CTLISTNOTIFY,747
CONTROL dy2,@SCROLLBAR,"",510,75,20,315,0x50000001,16
CONTROL dy2,@BUTTON,"End Task",10,410,110,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1
CONTROL dy2,@BUTTON,"New Task",130,410,110,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_5
CONTROL dy2,@BUTTON,"Quit",420,410,110,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_2
CONTROL dy2,@BUTTON,"View Processes",250,410,160,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_4

CONTROL dy2,@STATIC,"Applications running",10,25,400,25,@CTEDITLEFT, static_1

SETCONTROLCOLOR dy2, button_1,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy2, button_2,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy2, button_3,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy2, button_4,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy2, button_5,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)

SETCONTROLCOLOR dy2, static_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy2, static_2,RGB(160,138,0),rgb(0,0,0)

SETFONT dy2,"Arial",12,500,0,static_1
SETFONT dy2,"Arial",12,500,0,static_2
SETFONT dy2,"Arial",12,500,0,button_1
SETFONT dy2,"Arial",12,500,0,button_2
SETFONT dy2,"Arial",12,500,0,button_3
SETFONT dy2,"Arial",12,500,0,button_4
SETFONT dy2,"Arial",12,500,0,button_5
SETFONT dy2,"Arial",12,500,0,747
SETFONT dy2,"Arial",12,500,0,748

BEGINMENU dy2
   MENUTITLE "&File"
   MENUITEM "Quit",0,1000

   MENUTITLE "&Task"
   MENUITEM "End task",0,1001
   MENUITEM "New task",0,1002

   MENUTITLE "&Processes"
   MENUITEM "View processes",0,1003
ENDMENU

count = -1

GOSUB enumapps

SETCONTROLTEXT dy2,static_1, "Applications (" + LTRIM$(STR$(GETSTRINGCOUNT(dy2,747))) + ")"
STARTTIMER dy2,1000

WAITUNTIL dy2 = 0
RETURN 0
ENDSUB

SUB hnd2(),int
SELECT @MESSAGE

case @IDCREATE				
	  CENTERWINDOW dy2

CASE @IDMENUPICK 
	  SELECT @MENUNUM
			CASE 1000 'Quit
				  closewindow dy2 
				  end
				  
			CASE 1001 'End task
				  answer = GETSELECTED(dy2, 747)
				  answer$ = STR$(answer)

				  DEF xx:int 
				  xx = VAL(apps[answer])

				  IF answer >= 0
					  SHOWWINDOW dy2,@SWHIDE
					  confirmscreen2() 

					  IF conf = 1
						  SendMessage(xx, WM_CLOSE, 0, 0)
						  DELETESTRING(dy2,747,answer)
						  conf = 0
						  SHOWWINDOW dy2,@SWSHOW
					  ELSE
						  SHOWWINDOW dy2,@SWSHOW
					  ENDIF

				  ENDIF

			case 1002 'New task
				  SHOWWINDOW dy2,@SWHIDE
				  newtaskscreen()

				  IF browse = 1
					  browse = 0
					  SHOWWINDOW dy2,@SWMINIMIZED
				  ELSE
					  SHOWWINDOW dy2,@SWSHOW 
				  ENDIF

         case 1003 'Processes
				  list = 0
				  count = -1
				  CLOSEWINDOW dy2
				  RETURN 0

      endselect

		case @IDVSCROLL
			select @CONTROLID
				case 16
					select @CODE
						case @SBTHUMBTRACK
							SETSCROLLPOS dy2,16,@QUAL
							SETSELECTED dy2,747,GETSCROLLPOS(dy2,16)
							SETSELECTED dy2,748,GETSCROLLPOS(dy2,16)
							
					endselect
			  ENDSELECT

	CASE @IDTIMER

		 FOR z = GETSTRINGCOUNT(dy2,747) to 0 STEP -1
			  apps[z] = ""
			  appsname[z] = ""
			  DELETESTRING dy2,747,z 
		 NEXT z

		 FOR z = GETSTRINGCOUNT(dy2,748) to 0 STEP -1
			  DELETESTRING dy2,748,z 
		 NEXT z

		 list = 0
		 count = -1
		 
		 GOSUB enumapps
		 SETCONTROLTEXT dy2,static_1, "Applications (" + LTRIM$(STR$(GETSTRINGCOUNT(dy2,747))) + ")"

		 SETSCROLLRANGE dy2,16,0,count
		 SETSCROLLPOS dy2,747,GETSCROLLPOS(dy2,16)
		 SETSELECTED dy2,747,GETSCROLLPOS(dy2,16)
		 SETSELECTED dy2,748,GETSCROLLPOS(dy2,16)                      

    CASE @IDCONTROL
        SELECT @CONTROLID

			   CASE 747
                 vPos = GETSELECTED(dy2,747)
                 SETSCROLLPOS dy2,16,vPos
                 SETSELECTED dy2,748,GETSELECTED(dy2,747)

            CASE button_5
                 SHOWWINDOW dy2,@SWHIDE
				     GOSUB newtaskscreen

                 IF browse = 1
                    browse = 0
                    SHOWWINDOW dy2,@SWMINIMIZED
                 ELSE
						  SHOWWINDOW dy2,@SWSHOW 
					  ENDIF

            CASE BUTTON_1
                 answer = GETSELECTED(dy2, 747)
                 answer$ = STR$(answer)

				     DEF xx2:int 
				     xx2 = VAL(apps[answer])

                 IF answer >= 0
                    SHOWWINDOW dy2,@SWHIDE
					     confirmscreen2() 
 
					     IF conf = 1
					        SendMessage(xx2, WM_CLOSE, 0, 0)
						     DELETESTRING(dy2,747,answer)
                       conf = 0
                       SHOWWINDOW dy2,@SWSHOW
					     ELSE
                       SHOWWINDOW dy2,@SWSHOW
					     ENDIF

				     ENDIF

				CASE BUTTON_2
					  CLOSEWINDOW dy2
                 dy2 = 0
                 END

            CASE BUTTON_3
                 SETFOCUS dy,747 

				CASE BUTTON_4
					  list = 0
					  count = -1
					  CLOSEWINDOW dy2
					  RETURN 0

        ENDSELECT

		CASE @IDCLOSEWINDOW
 		     CLOSEWINDOW dy
           dy2 = 0
           END
   
ENDSELECT
RETURN 0
ENDSUB

SUB enumapps()

    count = -1

	hdesk = GetDesktopWindow()

	hnext = GetWindow(hdesk,GW_CHILD)
	if hnext
		GetWindowTextA(hnext,text,255)
		style = GetWindowLongA(hnext,GWL_STYLE) 
		if IsWindowVisible(hnext) & ((style  & @CAPTION) > 0) & (len(text) > 0)
			?text
		endif
		DO
			hnext = GetWindow(hnext,GW_HWNDNEXT )
			if hnext
				GetWindowTextA(hnext,text,255)
				style = GetWindowLongA(hnext,GWL_STYLE)

 
				if IsWindowVisible(hnext) & ((style & @CAPTION) > 0) & (len(text) > 0)

                    count = count + 1
					INSERTSTRING dy2,747,count,LTRIM$(text)

                    apps[count] = STR$(hnext) 
                    appsname[count] = text

				endif
			endif
		UNTIL hnext = 0
	endif

RETURN 0
ENDSUB

'Confirm screen for stopping a process
SUB confirmscreen()
OPENWINDOW dy3,100,100,400,250,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," Please confirm.",&confirmhnd

floodfill dy3,1,1,rgb(bcr,bcg,bcb)

CONST button_1 = 1
CONST button_2 = 2
CONST button_3 = 3
CONST button_4 = 4

CONST static_1 = 10
CONST static_2 = 11
CONST static_3 = 12

CONTROL dy3,@BUTTON,"Yes",120,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1
CONTROL dy3,@BUTTON,"No",210,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_2

CONTROL dy3,@STATIC,"Are you sure you want to stop",0,55,400,25,@CTEDITCENTER, static_1
CONTROL dy3,@STATIC,answer$ + "?",0,85,400,25,@CTEDITCENTER, static_2

SETCONTROLCOLOR dy3, button_1,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy3, button_2,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)

SETCONTROLCOLOR dy3, static_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy3, static_2,RGB(160,138,0),rgb(0,0,0)

SETFONT dy3,"Arial",12,500,0,static_1
SETFONT dy3,"Arial",12,500,0,static_2
SETFONT dy3,"Arial",12,500,0,button_1
SETFONT dy3,"Arial",12,500,0,button_2
SETFONT dy3,"Arial",12,500,0,747
SETFONT dy3,"Arial",12,500,0,748

WAITUNTIL dy3=0 

RETURN 0
ENDSUB

SUB confirmscreen2()
OPENWINDOW dy3,100,100,400,250,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," Please confirm.",&confirmhnd
floodfill dy3,1,1,rgb(bcr,bcg,bcb)

CONST button_1 = 1
CONST button_2 = 2
CONST button_3 = 3
CONST button_4 = 4

CONST static_1 = 10
CONST static_2 = 11
CONST static_3 = 12

CONTROL dy3,@BUTTON,"Yes",120,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1
CONTROL dy3,@BUTTON,"No",210,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_2

CONTROL dy3,@STATIC,"Are you sure you want to stop",0,55,400,25,@CTEDITCENTER, static_1
CONTROL dy3,@STATIC,MID$(appsname[answer],1,50) + "?",0,85,400,25,@CTEDITCENTER, static_2

SETCONTROLCOLOR dy3, button_1,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy3, button_2,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)

SETCONTROLCOLOR dy3, static_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy3, static_2,RGB(160,138,0),rgb(0,0,0)

SETFONT dy3,"Arial",12,500,0,static_1
SETFONT dy3,"Arial",12,500,0,static_2
SETFONT dy3,"Arial",12,500,0,button_1
SETFONT dy3,"Arial",12,500,0,button_2
SETFONT dy3,"Arial",12,500,0,747
SETFONT dy3,"Arial",12,500,0,748

WAITUNTIL dy3=0 

RETURN 0
ENDSUB

'Show details of a process screen
SUB ShowDetails()

string fname

fname = GETSTRING(dy,750,GETSELECTED(dy,747))

IF fname = "" 
	SETFOCUS dy
	RETURN 0
ENDIF

j=GetVarFileInfo(fname)

FFINFO a
fname = GETSTRING(dy,750,GETSELECTED(dy,747))
a=GetFixedFileInfo(fname)

OPENWINDOW dy3,0,0,700,620,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," Available details for process " + GETSTRING(dy,747,GETSELECTED(dy,747)) + ".",&detailshnd
floodfill dy3,1,1,rgb(bcr,bcg,bcb)

CONST button_1 = 1
CONST button_2 = 2
CONST button_3 = 3
CONST button_4 = 4

BEGINMENU dy3
   MENUTITLE "&File"
   MENUITEM "Close screen",0,1000
ENDMENU

int down = 10

CONTROL dy3,@BUTTON,"OK",310,530,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1

int comlength = LEN(j.comments)
IF comlength > 70
	IF j.comments <> ""
	CONTROL dy3,@STATIC,"Comments: " + MID$(j.comments,1,70),10,down,980,25,@CTEDITLEFT, static_1
	down += 20
	CONTROL dy3,@STATIC,"                     " + MID$(j.comments,71,comlength),10,down,980,25,@CTEDITLEFT, static_21
	down += 30
	ENDIF
ELSE
	IF j.comments <> ""
		CONTROL dy3,@STATIC,"Comments: " + j.comments,10,down,980,25,@CTEDITLEFT, static_1
		down += 30
    ENDIF
ENDIF


IF j.CompanyName <> ""
CONTROL dy3,@STATIC,"Company name: " + j.CompanyName,10,down,980,25,@CTEDITLEFT, static_2
down += 30
ENDIF

IF j.FileDescription <> ""
CONTROL dy3,@STATIC,"File description: " + j.FileDescription,10,down,980,25,@CTEDITLEFT, static_3
down += 30
ENDIF

CONTROL dy3,@STATIC,"File location: " + GETSTRING(dy,750,GETSELECTED(dy,747)),10,down,980,25,@CTEDITLEFT, static_4
down += 30

GetFileAttributesExA(fname,0,wad)
string temp$ = str$((wad.nFileSizeHigh << 32) | wad.nFileSizeLow)
double tempsize = VAL(temp$) / 1024
CONTROL dy3,@STATIC,"File Size: " + STR$(tempsize) + " KB (" + Using(LTRIM$(temp$),",") + " bytes) on disk",10,down,980,25,@CTEDITLEFT, static_5
down += 30

IF j.FileVersion <> ""
CONTROL dy3,@STATIC,"File version: " + j.FileVersion,10,down,980,25,@CTEDITLEFT, static_6
down += 30
ENDIF

IF j.InternalName <> ""
CONTROL dy3,@STATIC,"Internal name: " + j.InternalName,10,down,980,25,@CTEDITLEFT, static_7
down += 30
ENDIF

IF j.LegalCopyright <> ""
CONTROL dy3,@STATIC,"Legal Copyrights: " + j.LegalCopyright,10,down,980,25,@CTEDITLEFT, static_8
down += 30
ENDIF

IF j.LegalTrademarks <> ""
CONTROL dy3,@STATIC,"Legal Trademarks: " + j.LegalTrademarks,10,down,980,25,@CTEDITLEFT, static_9
down += 30
ENDIF

IF a.opersys <> ""
CONTROL dy3,@STATIC,"Operating system build: " + a.opersys,10,down,980,25,@CTEDITLEFT, static_10
down += 30
ENDIF

IF j.OriginalFileName <> ""
CONTROL dy3,@STATIC,"Original File name: " + j.OriginalFileName,10,down,980,25,@CTEDITLEFT, static_11
down += 30
ENDIF

IF j.PrivateBuild <> ""
CONTROL dy3,@STATIC,"Private Build: " + j.PrivateBuild,10,down,980,25,@CTEDITLEFT, static_12
down += 30
ENDIF

IF GETSTRING(dy,747,GETSELECTED(dy,747)) <> ""
CONTROL dy3,@STATIC,"Process name: " + GETSTRING(dy,747,GETSELECTED(dy,747)),10,down,980,25,@CTEDITLEFT, static_13
down += 30
ENDIF

IF j.ProductName <> ""
CONTROL dy3,@STATIC,"Product Name: " + j.ProductName,10,down,980,25,@CTEDITLEFT, static_14
down += 30
ENDIF

IF j.ProductVersion <> ""
CONTROL dy3,@STATIC,"Product Version: " + j.ProductVersion,10,down,980,25,@CTEDITLEFT, static_15
down += 30
ENDIF

IF j.SpecialBuild <> ""
CONTROL dy3,@STATIC,"Special Build: " + j.SpecialBuild,10,down,980,25,@CTEDITLEFT, static_16
down += 30
ENDIF

IF a.filetyp <> ""
CONTROL dy3,@STATIC,"Type: " + a.filetyp,10,down,980,25,@CTEDITLEFT, static_17
ENDIF

SETCONTROLCOLOR dy3, button_1,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy3, button_2,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)

SETCONTROLCOLOR dy3, static_1,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_2,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_3,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_4,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_5,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_6,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_7,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_8,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_9,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_10,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_11,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_12,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_13,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_14,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_15,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_16,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_17,rgb(255,255,255), rgb(0,0,0)
SETCONTROLCOLOR dy3, static_21,rgb(255,255,255), rgb(0,0,0)

SETFONT dy3,"Arial",12,500,0,static_1
SETFONT dy3,"Arial",12,500,0,static_2
SETFONT dy3,"Arial",12,500,0,static_3
SETFONT dy3,"Arial",12,500,0,static_4
SETFONT dy3,"Arial",12,500,0,static_5
SETFONT dy3,"Arial",12,500,0,static_6
SETFONT dy3,"Arial",12,500,0,static_7
SETFONT dy3,"Arial",12,500,0,static_8
SETFONT dy3,"Arial",12,500,0,static_9
SETFONT dy3,"Arial",12,500,0,static_10
SETFONT dy3,"Arial",12,500,0,static_11
SETFONT dy3,"Arial",12,500,0,static_12
SETFONT dy3,"Arial",12,500,0,static_13
SETFONT dy3,"Arial",12,500,0,static_14
SETFONT dy3,"Arial",12,500,0,static_15
SETFONT dy3,"Arial",12,500,0,static_16
SETFONT dy3,"Arial",12,500,0,static_17
SETFONT dy3,"Arial",12,500,0,static_21

SETFONT dy3,"Arial",12,500,0,button_1
SETFONT dy3,"Arial",12,500,0,747
SETFONT dy3,"Arial",12,500,0,748

WAITUNTIL dy3=0 

RETURN 0
ENDSUB

SUB detailshnd(),int
SELECT @MESSAGE
	case @IDCREATE				
		CENTERWINDOW dy3	

	CASE @IDMENUPICK 
        SELECT @MENUNUM
				CASE 1000 'Quit
                 conf = 1
                 CLOSEWINDOW dy3
                 RETURN 0
        endselect

    CASE @IDCONTROL
        SELECT @CONTROLID

            CASE BUTTON_1 'ok
                 conf = 1
                 CLOSEWINDOW dy3
                 RETURN 0

        ENDSELECT


		CASE @IDCLOSEWINDOW
                 confirm = 0
                 CLOSEWINDOW dy3
                 RETURN 0
   
ENDSELECT
RETURN 0
ENDSUB

SUB confirmhnd(),int
SELECT @MESSAGE
	case @IDCREATE				
		CENTERWINDOW dy3
	
    CASE @IDCONTROL
        SELECT @CONTROLID

            CASE BUTTON_1 'Yes kill off
                 conf = 1
                 CLOSEWINDOW dy3
                 RETURN 0

			CASE BUTTON_2
                 conf = 0
                 CLOSEWINDOW dy3
                 RETURN 0


        ENDSELECT


		CASE @IDCLOSEWINDOW
                 confirm = 0
                 CLOSEWINDOW dy3
                 RETURN 0
   
ENDSELECT
RETURN 0
ENDSUB

'Start a new task screen
SUB newtaskscreen(),int
OPENWINDOW dy3,100,100,500,250,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," New task.",&newtaskhnd
floodfill dy3,1,1,rgb(bcr,bcg,bcb)

CONST button_1 = 1
CONST button_2 = 2
CONST button_3 = 3
CONST button_4 = 4

CONST static_1 = 10
CONST static_2 = 11
CONST static_3 = 12
CONST edit_1 = 100

CONTROL dy3,@BUTTON,"OK",180,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1
CONTROL dy3,@BUTTON,"Cancel",270,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_2
CONTROL dy3,@BUTTON,"Browse",360,140,80,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_3

CONTROL dy3,@STATIC,"Enter the new task and click 'OK'",40,55,400,25,@CTEDITLEFT, static_1
CONTROL dy3,@EDIT,"",40,85,400,25,@CTEDITLEFT, edit_1

SETCONTROLCOLOR dy3, button_1,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy3, button_2,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)
SETCONTROLCOLOR dy3, button_3,rgb(mfr,mfg,mfb), rgb(mbr,mbg,mbb)

SETCONTROLCOLOR dy3, static_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy3, static_2,RGB(160,138,0),rgb(0,0,0)

SETFONT dy3,"Arial",12,500,0,static_1
SETFONT dy3,"Arial",12,500,0,static_2
SETFONT dy3,"Arial",12,500,0,button_1
SETFONT dy3,"Arial",12,500,0,button_2
SETFONT dy3,"Arial",12,500,0,button_3

SETFONT dy3,"Arial",12,500,0,edit_1
SETFONT dy3,"Arial",12,500,0,747
SETFONT dy3,"Arial",12,500,0,748

SETFOCUS dy3,edit_1
SETCONTROLNOTIFY(dy3,edit_1,1,1)

WAITUNTIL dy3=0 

RETURN 0
ENDSUB

SUB newtaskhnd(),int
SELECT @MESSAGE

	case @IDCREATE				
		CENTERWINDOW dy3	

    CASE @IDCONTROL
        SELECT @CONTROLID

			if @NOTIFYCODE = @ENENTERKEY 
				select @CONTROLID

					CASE edit_1
                    END
                ENDSELECT
            ENDIF

            CASE BUTTON_1 

                 IF GETCONTROLTEXT (dy3,edit_1) <> ""
					SYSTEM GETCONTROLTEXT (dy3,edit_1)
					CLOSEWINDOW dy3
					RETURN 0
                 ELSE
                    SETFOCUS dy3,edit_1
                 ENDIF

			CASE BUTTON_2
                 CLOSEWINDOW dy3
                 RETURN 0

            CASE button_3
                 GOSUB newtaskbrowse 

        ENDSELECT


		CASE @IDCLOSEWINDOW
                 confirm = 0
                 CLOSEWINDOW dy3
                 RETURN 0
   
ENDSELECT
RETURN 0
ENDSUB

SUB newtaskbrowse(),int

SHOWWINDOW dy3,@SWHIDE

filter = "All files (*.*)|*.*|All files (*.*)|*.*||"
filenames = filerequest("Browse for file",0,1,filter,"",@MULTISELECT)


do

    pos = instr(filenames,"|")

    if(pos)

        filetemp = left$(filenames,pos-1)
        filenames = mid$(filenames,pos+1)

        browse = 1
        SETCONTROLTEXT dy3,edit_1,filetemp

    endif

until pos = 0 

SHOWWINDOW dy3,@SWSHOW

RETURN 0
ENDSUB

'Sort list routine
SUB SortList(),INT

STOPTIMER dy

repop = GETSTRINGCOUNT(dy,747)

IF sort1 = 1
   array[repop+1] = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
ENDIF

IF sort2 = 1
   proc[repop+1] = "9999999999999999999"
ENDIF


FOR z = GETSTRINGCOUNT(dy,747) to 0 STEP -1
	     DELETESTRING dy,747,z 
	     DELETESTRING dy,748,z 
	     DELETESTRING dy,749,z 
	     DELETESTRING dy,750,z 
NEXT z

countup = repop

x = INSTR(array[0],"[")

IF x > 0
    REPLACE$(array[0],x,1," ")
    array[0] = LTRIM$(array[0])
ENDIF

x = INSTR(array[0],"]")

IF x > 0
    REPLACE$(array[0],x,1," ")
    array[0] = LTRIM$(array[0])
ENDIF

IF sort1 = 1 THEN GOSUB sortbyName
IF sort2 = 1 THEN GOSUB sortbyID


IF sort2 = 1
'DELETESTRING dy,747,0
'DELETESTRING dy,748,0
'DELETESTRING dy,749,0
'DELETESTRING dy,750,0

FOR x = 0 TO GETSTRINGCOUNT(dy,747)
IF INSTR(GETSTRING(dy,748,x) ,"99999")
    DELETESTRING dy,747,x
    DELETESTRING dy,748,x
    DELETESTRING dy,749,x
    DELETESTRING dy,750,x
ENDIF

string zzz$
zzz$ = GETSTRING(dy,748,x)
zzz = VAL(zzz$)

IF zzz < 0
    DELETESTRING dy,747,x
    DELETESTRING dy,748,x
    DELETESTRING dy,749,x
    DELETESTRING dy,750,x
ENDIF

NEXT x

ELSE
	DELETESTRING dy,747,0
	DELETESTRING dy,748,0
	DELETESTRING dy,749,0
	DELETESTRING dy,750,0
ENDIF


FOR x = 0 TO GETSTRINGCOUNT(dy,747)
IF INSTR(GETSTRING(dy,748,x) ,"99999")
    DELETESTRING dy,747,x
    DELETESTRING dy,748,x
    DELETESTRING dy,749,x
    DELETESTRING dy,750,x
ENDIF
NEXT x

starttimer dy,2000

SETSCROLLRANGE dy,16,0,GETSTRINGCOUNT(dy,747)
SETFOCUS dy
RETURN 0
ENDSUB
 
SUB getval1

a1 = 0
a2 = 0
b1 = 0
b2 = 0

FOR g = 1 TO length

a1 = ASC(LCASE$(MID$(array[z],g,1)))
b1 = b1 + a1 

a2 = ASC(LCASE$(MID$(array[z+1],g,1)))
b2 = b2 + a2

NEXT g

RETURN
ENDSUB

SUB getval2

a1 = 0
a2 = 0
b1 = 0
b2 = 0

a1 = VAL(proc[z])
b1 = b1 + a1 

a2 = VAL(proc[z+1])
b2 = b2 + a2

RETURN
ENDSUB

SUB checkltr()

	IF b1 > b2
	   t1 = array[z]
	   t2 = array[z+1]
	   t3 = proc[z]
	   t4 = proc[z+1]
      t5 = desc[z]
      t6 = desc[z+1]
      t7 = loc[z]
      t8 = loc[z+1]
        
	   array[z] = t2
	   array[z+1] = t1
	   proc[z] = t4
	   proc[z+1] = t3
      desc[z] = t6
      desc[z+1] = t5 
      loc[z] = t8
      loc[z+1] = t7 
	ENDIF 

RETURN
ENDSUB

SUB checknum()

	IF b1 > b2
	   t1 = array[z]
	   t2 = array[z+1]
	   t3 = proc[z]
	   t4 = proc[z+1]
      t5 = desc[z]
      t6 = desc[z+1]
      t7 = loc[z]
      t8 = loc[z+1]
        
	   array[z] = t2
	   array[z+1] = t1
	   proc[z] = t4
	   proc[z+1] = t3
      desc[z] = t6
      desc[z+1] = t5 
      loc[z] = t8
      loc[z+1] = t7 
	ENDIF 

RETURN 
ENDSUB

'Add process description to the process screen
SUB adddesc(),int

STOPTIMER dy
descfound = 0
savedesc = ""

STRING fname

IF INSTR(array[count],"[")
	ADDSTRING dy,749,"System Idle Process"
	savedesc = "System Idle Process"
	descfound = 1
ELSE

	IF array[count] = "System"
		ADDSTRING dy,749,"NT Kernel & System"
		savedesc = "NT Kernel & System"
		descfound = 1

    ELSE

		IF array[count] = "smss.exe"
			ADDSTRING dy,749,"Windows Session Manager"
			savedesc = "Windows Session Manager"
			descfound = 1

		ELSE


			IF array[count] = "svchost.exe"
				ADDSTRING dy,749,"Host Process for Windows Services"
				savedesc = "Host Process for Windows Services"
				descfound = 1

			ELSE


				IF array[count] = "taskman4.exe"
					ADDSTRING dy,749,"Alternative Task Manager"
					savedesc = "Alternative Task Manager"
					descfound = 1

				ELSE

					IF array[count] = "audiodg.exe"
						ADDSTRING dy,749,"Windows Audio Graph Isolation"
						savedesc = "Windows Audio Graph Isolation"
						descfound = 1

					ELSE

							fname = loc[count]

							IF INSTR(loc[count],":")
								j=GetVarFileInfo(fname)

								IF LTRIM$(j.FileDescription) <> ""
									ADDSTRING dy,749,j.FileDescription
									savedesc = j.FileDescription   
									descfound = 1
								ELSE

									IF LTRIM$(j.FileDescription) = "" 
										ADDSTRING dy,749,array[count]
										savedesc = array[count]   
										descfound = 1
									ENDIF
								ENDIF
							ENDIF
						ENDIF
                 ENDIF
            ENDIF
		ENDIF
	ENDIF
ENDIF

if callfromad = 1
desc[zzz] = savedesc
ELSE
desc[count] = savedesc
ENDIF

starttimer dy,2000
RETURN 0
ENDSUB

SUB sortbyName()

'Sort 1st character
FOR x = 0 to countup
	FOR z = 0 to countup

		 length = 1 
		 position = 1
		 getval1()
		 checkltr()

	NEXT z
NEXT x

'Check 2nd letter of all array entries
LABEL totloop

FOR y = 0 TO countup
	FOR z = 0 to countup

		 length = 1
		 position = 1 
		 getval1()

		 FOR h = 2 TO LEN(array[z])

		 IF LEN(array[z]) >= h
			 IF b1 = b2 '1st letter match

				length = h
				position = 1 
				getval1()
				checkltr() 

			 NEXT h

			 ENDIF
		 ENDIF

	NEXT z
NEXT y

FOR zzz = 0 TO repop

    n2 = INSTR(array[zzz],"zzzzzzz")
 
    IF n2 = 0 
		 INSERTSTRING dy,747,zzz,array[zzz]
		 INSERTSTRING dy,748,zzz,proc[zzz]
		 INSERTSTRING dy,749,zzz,desc[zzz]

		 IF INSTR(loc[zzz],":")
			 INSERTSTRING dy,750,zzz,loc[zzz]
		 ELSE
			INSERTSTRING dy,750,zzz,"Not available "
		 ENDIF
    ENDIF

LABEL addnextone
NEXT zzz

RETURN 0
ENDSUB

SUB sortbyID()

'Sort 1st character
FOR x = 0 to countup
FOR z = 0 to countup

	GOSUB getval2
   GOSUB checknum

NEXT z
NEXT x


FOR zzz = 0 TO repop

    n2 = INSTR(array[zzz],"99999")
 
    IF n2 = 0 AND VAL(proc[zzz]) >= 0
	INSERTSTRING dy,747,zzz,array[zzz]
	INSERTSTRING dy,748,zzz,proc[zzz]
	INSERTSTRING dy,749,zzz,desc[zzz]
	INSERTSTRING dy,750,zzz,loc[zzz]
    ENDIF

LABEL addnextone
NEXT zzz

'DELETESTRING dy,747,0
'DELETESTRING dy,748,0
'DELETESTRING dy,749,0
'DELETESTRING dy,750,0

RETURN 0
ENDSUB

global sub GetVarFileInfo(string strExe),File_Ver_Info
	File_Ver_Info ret
	UINT dwTemp
	UINT dwVS = 0
	UINT dwSize = GetFileVersionInfoSizeA(strExe,dwTemp)
	POINTER pVer,padj
	IF(dwSize)
		pVer = NEW(CHAR,dwSize)
		IF(GetFileVersionInfoA(strExe,0,dwSize,pVer) <> 0)
			padj=pVer
			pointer sadj=padj
			'get total length of versioninfo
			uint verlen=#<word>padj
			'get ttitle field length
			padj+=2
			uint verlen2=#<word>padj
			'get text or bin
			padj+=2
			uint tb==#<word>padj
			'get main title text
			padj+=2
			wstring ws=#<wstring>padj
			'calculate padding
			padj+=len(ws)*2
			padj+=int(padj-sadj)%32
			'skip fixed fileinfo
			padj+=52
			pointer pstart=padj+8
			pointer pend=padj+#<word>padj

			string k=""

			k="comments"
			ret.comments=fstr(pstart, pend, k)

			k="CompanyName"
			ret.CompanyName=fstr(pstart, pend, k)

			k="FileDescription"
			ret.FileDescription=fstr(pstart, pend, k)

			k="FileVersion"
			ret.FileVersion=fstr(pstart, pend, k)

			k="InternalName"
			ret.InternalName=fstr(pstart, pend, k)

			k="LegalCopyright"
			ret.LegalCopyright=fstr(pstart, pend, k)

			k="LegalTrademarks"
			ret.LegalTrademarks=fstr(pstart, pend, k)

			k="OriginalFileName"
			ret.OriginalFileName=fstr(pstart, pend, k)

			k="PrivateBuild"
			ret.PrivateBuild=fstr(pstart, pend, k)

			k="ProductName"
			ret.ProductName=fstr(pstart, pend, k)

			k="ProductVersion"
			ret.ProductVersion=fstr(pstart, pend, k)

			k="SpecialBuild"
			ret.SpecialBuild=fstr(pstart, pend, k)

		ENDIF
		DELETE pVer
	ENDIF
	return ret
endsub

global sub fstr(pointer beg, pointer endp, string fnd2),string
int xdesc
string ret=""
wstring fnd = s2w(lcase$(fnd2))
for xdesc=beg to endp

	if WINSTR(wlcase$(#<wstring>beg),fnd)
		string t=w2s(#<wstring>beg)

		int pos= instr(t,chr$(1))
		if pos
			t=mid$(t,pos+1)
			beg+=(len(t)+pos)*2
			while w2s(#<wstring>beg)=""
				beg+=2
			wend
			ret=w2s(#<wstring>beg)

			return ret
		endif
		beg+=len(#<wstring>beg)*2-1
	endif
	beg+=1
next xdesc
return ret
endsub

'Count processes running
sub CountProcesses(string fileNameToFindPID),int

LABEL reenumprocs

const TH32CS_SNAPHEAPLIST	=0x00000001
const TH32CS_SNAPPROCESS	=0x00000002
const TH32CS_SNAPTHREAD		=0x00000004
const TH32CS_SNAPMODULE		=0x00000008
const TH32CS_SNAPMODULE32	=0x00000010
const TH32CS_SNAPALL		=(TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
const TH32CS_INHERIT		=0x80000000
const PROCESS_ALL_ACCESS	=0x1F0FFF


type PROCESSENTRY32
	uint dwSize
	uint cntUsage
	uint th32ProcessID
	uint th32DefaultHeapID
	uint th32ModuleID
	uint cntThreads
	uint th32ParentProcessID
	uint pcPriClassBase
	uint dwFlags
	istring szExeFile[259]
endtype

def pe:PROCESSENTRY32

int retval, x
x = 0
countp = 0

hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)
pe.dwSize=len(pe)
retval=Process32First(hSnapshot,pe)

do

if LCASE$(pe.szExeFile) = LCASE$(fileNameToFindPID)
	CloseHandle(hSnapshot)
	return pe.th32ProcessID
ENDIF
item = pe.szExeFile
PID = STR$(pe.th32ProcessID)

countp += 1 'Current processes running

x++

dwPriorityClass = 0
 
def dwVerHnd:word
dwVerHnd = 0

string lpFilename=space$(255)

hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID)
GetModuleFileNameEx(hProcess,0,lpFilename,len(lpFilename))
dwVerInfoSize = GetFileVersionInfoSize(lpFilename, dwVerHnd)

    if hProcess = NULL
      'print error("Open Process Fail findpidbyname ")
    else
    
      dwPriorityClass = GetPriorityClass(hProcess)

      if dwPriorityClass <>0
			
		ELSE
		'	print error("dwPriorityClass")
		endif
	CloseHandle(hProcess)

endif

	pe.dwSize=len(PROCESSENTRY32)
	retval=Process32Next(hSnapshot,pe)


until retval = false

CloseHandle(hSnapshot)

return 0
ENDSUB

'Sub routine to get file info
global sub GetFixedFileInfo(string filename),FFINFO
	FFINFO ret
	UINT dwTemp
	UINT dwSize= GetFileVersionInfoSizeA(filename,dwTemp)
	POINTER pVer,lpvs
	UINT dwVS = 0
	IF(dwSize)
		pVer = NEW(CHAR,dwSize)
		IF(GetFileVersionInfoA(filename,0,dwSize,pVer) <> 0)
			IF(VerQueryValueA(pVer,"\\",&lpvs,dwVS))
				'retriev the file version
				UINT nVerMSB= *<VS_FIXEDFILEINFO>lpvs.dwFileVersionMS
				UINT nVerLSB = *<VS_FIXEDFILEINFO>lpvs.dwFileVersionLS
				IF(nVerLSB <> 0)
					ret.filevers = USING("#&#&#&#",nVerMSB>>16,".",nVerMSB & 0xFFFF,"",nVerLSB>>16,"",nVerLSB & 0xFFFF)
				ELSE
					ret.filevers = USING("#&#",nVerMSB>>16,".",nVerMSB & 0xFFFF)
				ENDIF
				'retrive the product version
				nVerMSB = *<VS_FIXEDFILEINFO>lpvs.dwProductVersionMS
				nVerLSB = *<VS_FIXEDFILEINFO>lpvs.dwProductVersionlS
				IF(nVerLSB <> 0)
					ret.prodvers = USING("#&#&#&#",nVerMSB>>16,".",nVerMSB & 0xFFFF,"",nVerLSB>>16,"",nVerLSB & 0xFFFF)
				ELSE
					ret.prodvers = USING("#&#",nVerMSB>>16,".",nVerMSB & 0xFFFF)
				ENDIF	
				'get OS
				uint nFileOS = *<VS_FIXEDFILEINFO>lpvs.dwFileOS
				select nFileOS
					case 0x10000'VOS_DOS
						ret.opersys = "MS-DOS"
					case 0x40000'VOS_NT
						ret.opersys = "Windows NT"
					case 0x1'VOS_WINDOWS16
						ret.opersys = "Windows 16 bit"
					case 0x4'VOS_WINDOWS32
						ret.opersys = "Windows 32 bit"
					case 0x20000'VOS_OS216
						ret.opersys = "OS/2 16 bit"
					case 0x30000'VOS_OS232
						ret.opersys = "OS/2 32 bit"
					case 0x2'VOS_PM16
						ret.opersys = "Presentation Manager 16 bit"
					case 0x3'VOS_PM32
						ret.opersys = "Presentation Manager 32 bit"
					case 0x10001
						ret.opersys = "Windows 16 bit on MS-DOS"
					case 0x10004
						ret.opersys = "Windows 32 bit on MS-DOS"
					case 0x40004
						ret.opersys = "Windows 32 bit on NT"
					case 0x20002'VOS_PM16
						ret.opersys = "Presentation Manager 16 bit on OS/2 16 bit"
					case 0x30003'VOS_PM32
						ret.opersys = "Presentation Manager 32 bit on OS/2 32 bit"
					case 0'VOS_UNKNOWN
						ret.opersys = "Could not determine"
				endselect
				'get filetype
				uint nFileType = *<VS_FIXEDFILEINFO>lpvs.dwFileType
				select nFileType
					case 0x1
						ret.filetyp = "Application"
					case 0x2
						ret.filetyp = "DLL"
					case 0x3
						ret.filetyp = "Driver"
						uint nFileSubtype = *<VS_FIXEDFILEINFO>lpvs.dwFileSubtype
						select nFileSubtype
							case 0x4
								ret.filetyp = "Display Driver"
							case 0xB
								ret.filetyp = "Input Driver"
							case 0x8
								ret.filetyp = "Installable Driver"
							case 0x2
								ret.filetyp = "Keyboard Driver"
							case 0x3
								ret.filetyp = "Language Driver"
							case 0x6
								ret.filetyp = "Network Driver"
							case 0x1
								ret.filetyp = "Printer Driver"
							case 0x9
								ret.filetyp = "Sound Driver"
							case 0x7
								ret.filetyp = "System Driver"
							case 0
								ret.filetyp = "Unknown Driver"
							case 0xA
								ret.filetyp = "COMM Driver"
						endselect
					case 0x4
						ret.filetyp = "Font"
						nFileSubtype = *<VS_FIXEDFILEINFO>lpvs.dwFileSubtype
						select nFileSubtype
							case 0x1
								ret.filetyp = "Raster Font"
							case 0x3
								ret.filetyp = "TrueType Font"
							case 0x2
								ret.filetyp = "Vector Font"
							case 0x0
								ret.filetyp = "Unknown Font"
						endselect
					case 0x7
						ret.filetyp = "Static Lib"
					case 0x5
						ret.filetyp = "Vertual Device"
				endselect
			ENDIF
			DELETE pVer
		endif
	endif
	return ret
endsub

'Sub routine to list the processes running
sub FindInitialProcesses(string fileNameToFindPID),int
LABEL reenumprocs

const TH32CS_SNAPHEAPLIST	=0x00000001
const TH32CS_SNAPPROCESS	=0x00000002
const TH32CS_SNAPTHREAD		=0x00000004
const TH32CS_SNAPMODULE		=0x00000008
const TH32CS_SNAPMODULE32	=0x00000010
const TH32CS_SNAPALL		=(TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
const TH32CS_INHERIT		=0x80000000
const PROCESS_ALL_ACCESS	=0x1F0FFF


type PROCESSENTRY32
	uint dwSize
	uint cntUsage
	uint th32ProcessID
	uint th32DefaultHeapID
	uint th32ModuleID
	uint cntThreads
	uint th32ParentProcessID
	uint pcPriClassBase
	uint dwFlags
	istring szExeFile[259]
endtype

def pe:PROCESSENTRY32

int retval, x
x = 0
count = -1

hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)
pe.dwSize=len(pe)
retval=Process32First(hSnapshot,pe)

do

if LCASE$(pe.szExeFile) = LCASE$(fileNameToFindPID)
	CloseHandle(hSnapshot)
	return pe.th32ProcessID
ENDIF
item = pe.szExeFile
PID = STR$(pe.th32ProcessID)

IF LTRIM$(item) <> ""
	count = count + 1
	INSERTSTRING dy,747,count,item 
	INSERTSTRING dy,748,count,pid 

	array[count] = item
	Proc[count] = pid

    lstr = ""
    lstr = LCASE$(item)
    lstr = LTRIM$(lstr)
    lstr = RTRIM$(lstr)

    n2 = 0
    n3 = 0
    n3 = count + 1
    n2 = INSTR(lstr,"svchost")

    initprocs += 1

	totalprocs += 1 'Current processes running
	array2[totalprocs] = item
	Proc2[totalprocs] = pid
	desc2[totalprocs] = savedesc
ENDIF

x++

dwPriorityClass = 0
 
def dwVerHnd:word
dwVerHnd = 0

string lpFilename=space$(255)

hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID)
GetModuleFileNameEx(hProcess,0,lpFilename,len(lpFilename))
dwVerInfoSize = GetFileVersionInfoSize(lpFilename, dwVerHnd)

	loc[count] = lpFilename
    GOSUB adddesc

    if hProcess = NULL
      'print error("Open Process Fail findpidbyname ")
    else
    
      dwPriorityClass = GetPriorityClass(hProcess)

      if dwPriorityClass <>0
			
		ELSE
			'print error("dwPriorityClass")
		endif
	CloseHandle(hProcess)

endif

	pe.dwSize=len(PROCESSENTRY32)
	retval=Process32Next(hSnapshot,pe)


until retval = false

CloseHandle(hSnapshot)

IF firstrun = 0

IF sort <> 1
   sort = 1
   sort1 = 1
   sort2 = 0
ENDIF

   sortlist()

ENDIF

int textw, texth, textw_max,n
textw_max=0
for n=0 to getstringcount(dy,747)-1
   gettextsize dy, getstring(dy,747,n), textw, texth
   if textw>textw_max then textw_max = textw
next n
if textw_max>0 then SETHORIZEXTENT dy,747,textw_max+10 

textw_max=0
for n=0 to getstringcount(dy,749)-1
   gettextsize dy, getstring(dy,749,n), textw, texth
   if textw>textw_max then textw_max = textw
next n
if textw_max>0 then SETHORIZEXTENT dy,749,textw_max+10 

textw_max=0
for n=0 to getstringcount(dy,750)-1
   gettextsize dy, getstring(dy,750,n), textw, texth
   if textw>textw_max then textw_max = textw
next n
if textw_max>0 then SETHORIZEXTENT dy,750,textw_max+10 

return 0
ENDSUB

sub ViewServices(),int

OPENWINDOW dy4,100,100,830,500,@CAPTION|@MINBOX|@MAXBOX,0," Services.",&ServiceHnd	
floodfill dy4,1,1,rgb(bcr,bcg,bcb)

CONTROL dy4,@STATIC,"Service Name",10,60,200,25,@CTEDITLEFT,vs1
CONTROL dy4,@LISTBOX,"",10,90,200,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,747	

CONTROL dy4,@STATIC,"SID",210,60,100,25,@CTEDITLEFT,vs2
CONTROL dy4,@LISTBOX,"",210,90,80,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,748

CONTROL dy4,@STATIC,"Service Description",290,60,200,25,@CTEDITLEFT,vs3
CONTROL dy4,@LISTBOX,"",290,90,250,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,749

CONTROL dy4,@STATIC,"State",540,60,160,25,@CTEDITLEFT,vs4 
CONTROL dy4,@LISTBOX,"",540,90,160,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,750

CONTROL dy4,@STATIC,"Start Type",700,60,200,25,@CTEDITLEFT,vs5
CONTROL dy4,@LISTBOX,"",700,90,90,295,@CTLISTNOTIFY|@HSCROLL|LBS_DISABLENOSCROLL,751

CONTROL dy4,@SCROLLBAR,"",790,90,20,295,0x50000001,16	

CONTROL dy4,@BUTTON,"Start Service",10,405,120,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP,BUTTON_1	
CONTROL dy4,@BUTTON,"Stop Service",140,405,120,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP,BUTTON_2
CONTROL dy4,@BUTTON,"Change Start Type",270,405,160,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP,BUTTON_4
CONTROL dy4,@BUTTON,"More Details",440,405,120,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP,BUTTON_5
CONTROL dy4,@BUTTON,"Close",710,405,100,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP,BUTTON_3

BEGINMENU dy4
   MENUTITLE "&File"
   MENUITEM "Close",0,2000

   MENUTITLE "&Service"
   MENUITEM "Start Service",0,2001
   MENUITEM "Stop Service",0,2002

   MENUTITLE "&Start Type"
   MENUITEM "Change startup type",0,2003
ENDMENU

int hh
for hh = 0 to dwServicesReturned-1
    insertstring dy4,747,hh,LServiceName[hh]

    if LServiceId[hh] > 0
       insertstring dy4,748,hh,ltrim$(str$(LServiceId[hh]))
    else
       insertstring dy4,748,hh,""
    endif
 
    insertstring dy4,749,hh,LServiceDisplayName[hh]
    insertstring dy4,750,hh,LServiceStatus[hh]

    examkey = ""
    examkey = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services" + "\\"+ltrim$(LServiceName[hh])

    string resultin
    resultin = RegGetValue(examkey,"Start")
    resultin = ltrim$(resultin)
    resultin = rtrim$(resultin)

    if resultin = "0"
       insertstring dy4,751,hh,"Boot "
       goto nexthh
    endif

    if resultin = "1"
       insertstring dy4,751,hh,"System "
       goto nexthh
    endif

    if resultin = "2"
       insertstring dy4,751,hh,"Automatic "
       goto nexthh
    endif

    if resultin = "3"
       insertstring dy4,751,hh,"Manual "
       goto nexthh
    endif

    if resultin = "4"
       insertstring dy4,751,hh,"Disabled "
       goto nexthh
    endif

    insertstring dy4,751,hh,"Unknown "

label nexthh
next hh

SETCONTROLCOLOR dy4,vs1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy4,vs2,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy4,vs3,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy4,vs4,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy4,vs5,RGB(160,138,0),rgb(0,0,0)

SETFONT dy4,"Arial",12,500,0,BUTTON_1
SETFONT dy4,"Arial",12,500,0,BUTTON_2
SETFONT dy4,"Arial",12,500,0,BUTTON_3
SETFONT dy4,"Arial",12,500,0,BUTTON_4
SETFONT dy4,"Arial",12,500,0,BUTTON_5

SETFONT dy4,"Arial",12,500,0,vs1
SETFONT dy4,"Arial",12,500,0,vs2
SETFONT dy4,"Arial",12,500,0,vs3
SETFONT dy4,"Arial",12,500,0,vs4
SETFONT dy4,"Arial",12,500,0,vs5

SETFONT dy4,"Arial",12,500,0,747
SETFONT dy4,"Arial",12,500,0,748
SETFONT dy4,"Arial",12,500,0,749
SETFONT dy4,"Arial",12,500,0,750
SETFONT dy4,"Arial",12,500,0,751

SETSCROLLRANGE dy4,16,0,dwServicesReturned

setcaption dy4,"Services"
SETCONTROLTEXT dy4,vs1, "Services (" + LTRIM$(STR$(dwServicesReturned)) + ")"


int textw, texth, textw_max,nn
textw_max=0
for nn=0 to getstringcount(dy4,747)-1
   gettextsize dy4, getstring(dy4,747,nn), textw, texth
   if textw>textw_max then textw_max = textw
next nn
if textw_max>0 then SETHORIZEXTENT dy4,747,textw_max+10 

textw_max=0
for nn=0 to getstringcount(dy4,749)-1
   gettextsize dy4, getstring(dy4,749,nn), textw, texth
   if textw>textw_max then textw_max = textw
next nn
if textw_max>0 then SETHORIZEXTENT dy4,749,textw_max+10 

textw_max=0
for nn=0 to getstringcount(dy4,750)-1
   gettextsize dy4, getstring(dy4,750,nn), textw, texth
   if textw>textw_max then textw_max = textw
next nn
if textw_max>0 then SETHORIZEXTENT dy4,750,textw_max+10 

textw_max=0
for nn=0 to getstringcount(dy4,751)-1
   gettextsize dy4, getstring(dy4,751,nn), textw, texth
   if textw>textw_max then textw_max = textw
next nn
if textw_max>0 then SETHORIZEXTENT dy4,751,textw_max+10 

setfocus dy4
setselected dy4,747,0
setselected dy4,748,0
setselected dy4,749,0
setselected dy4,750,0
setselected dy4,751,0

state1 = getstring(dy4,750,getselected(dy4,750)) 
state1 = ltrim$(state1)

if state1 = "Running"
  enablecontrol dy4,BUTTON_1,0
  enablemenuitem dy4,2001,0
  enablemenuitem dy4,2002,1
else
  enablecontrol dy4,BUTTON_1,1
endif

if state1 = "Stopped"
  enablecontrol dy4,BUTTON_2,0
  enablemenuitem dy4,2001,1
  enablemenuitem dy4,2002,0
else
  enablecontrol dy4,BUTTON_2,1
endif

sps = getscrollpos(dy4,16)

waituntil dy4=0
closewindow dy4

return 0
endsub

sub OpenTheSCManager(),int
hHandle = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS)
if !hHandle
   'print
	'print "  Unable to open SCM, error: "
	'print GetLastError()

   MESSAGEBOX(boxwin,"OpenSCManager","error",@MB_ICONSTOP | @MB_OK)

else
   'print
	'print "  SCM opened sucessfully"
endif

return hHandle
endsub

sub EnumAllServices(int hHandle)
int retVal = EnumServicesStatus(hHandle, dwServiceType, SERVICE_STATE_ALL, &service, sizeof(ENUM_SERVICE_STATUS), &dwBytesNeeded,&dwServicesReturned,&dwResumedHandle)

if !retVal 
	if GetLastError() = ERROR_MORE_DATA then
		UINT dwBytes = sizeof(ENUM_SERVICE_STATUS) + dwBytesNeeded
		pointer p
		p = NEW(char, dwBytes)

		retVal = EnumServicesStatus(hHandle, dwServiceType, SERVICE_STATE_ALL, p, dwBytes, &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle)
		
      if !retVal
         MESSAGEBOX(boxwin,"EnumServicesStatus 2468","error",@MB_ICONSTOP | @MB_OK)
      endif

      i = 0
		for i = 0 to dwServicesReturned-1

         'print 
         'print
			'print "  Service Name ",#<ENUM_SERVICE_STATUS>p[i].lpServiceName,"   (",#<ENUM_SERVICE_STATUS>p[i].lpDisplayName,")"

         pointer pq = #<ENUM_SERVICE_STATUS>p[i].lpServiceName
         string Sname = #<string>pq

         pointer pn = #<ENUM_SERVICE_STATUS>p[i].lpDisplayName
         string Dname = #<string>pn

         'print "  Service Name ",Sname  

         LServiceName[i] = Sname
         LServiceDisplayName[i] = Dname       

         hService = OpenTheService(hHandle,#<ENUM_SERVICE_STATUS>p[i].lpServiceName)

         if hService > 0
            QueryTheService(hService)
         endif

		next i

		DELETE p
      delete pq
      delete pn

	endif
endif

'print
'print "  Total number of services ",dwServicesReturned
'print

if !CloseServiceHandle(hHandle) then
   'print
	'print "  Unable to close SCM, error:"
	'print GetLastError()
else
   'print
	'print "  SCM closed succesfully!"
endif
return
endsub

sub OpenTheService(uint hSCManager,pointer MyServiceIn),uint
hService = OpenService(hSCManager,MyServiceIn,SC_MANAGER_ALL_ACCESS)

IF hService = 0 THEN

   'MESSAGEBOX(boxwin,"OpenService 2539","error",@MB_ICONSTOP | @MB_OK)

   Error2 = GetLastError ()
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error2,0,ErMes,nSize,Arguments)
   Print "  Error by Open Service: ",ErMes

'MESSAGEBOX(boxwin,"2553","error",@MB_ICONSTOP | @MB_OK)

	'print
	'print
	print "  Service could not be opened..."
   LServiceStatus[i] = "Cannot determine status"
   return 0

else

   print "Service opened..."

ENDIF

return hService
endsub

Sub QueryTheService(uint hService)
int qs

'Designed to fail to get bytes needed.
qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,NULL,0,&Bneeded)

if !qs then 'Error detected.
	if GetLastError() = ERROR_INSUFFICIENT_BUFFER then
		Xbuffer = new(char, Bneeded)

      'Now try again with correct bytes required.
		qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,Xbuffer,Bneeded,&Bneeded)

      'If second fail, print error and exit. 
		IF qs = 0 THEN 'Error detected.
			Error3 = GetLastError ()
			FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error3,0,ErMes,nSize,Arguments)
			'Print "  Error by Query Service: ",ErMes

			'Close handles
			CloseServiceHandle(hService)

			'Free the buffer from memory
			'delete Xbuffer

			'print
			'print
			'print "  Unable to query service..."
			'print
         return 

		endif

	endif

endif

pointer pi = #<SERVICE_STATUS_PROCESS>Xbuffer.dwProcessId
int prcid = #<int>pi
LServiceId[i] = prcid

delete pi

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_STOPPED
	'print "  Service State (Stopped)."
   LServiceStatus[i] = "Stopped" 
endif 

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_RUNNING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Running" 
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_START_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Start Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_STOP_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Stop Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_CONTINUE_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Continue Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_PAUSE_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Pause Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_PAUSED
	'print "  Service State (Running)."
   LServiceStatus[i] = "Paused"
endif

if CloseService = 1

	cs = ControlService(hService,SERVICE_CONTROL_STOP,lpServiceStatus)
	IF cs = 0 THEN
		Error4 = GetLastError ()
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error4,0,ErMes,nSize,Arguments)
		'Print "  Error by Control Service: ",ErMes

		'Close handles
		CloseServiceHandle(hService)
		CloseServiceHandle(hHandle)

		'Free the buffer from memory
		delete Xbuffer

		'print
		'print
		'print "  Press any key to close..."
		'print
		'DO:UNTIL INKEY$<>""
		'closeconsole
		'end
      return 

	else
 
		'print
		'print "  Service was stopped..."
		'print

		'Close handles
		'CloseServiceHandle(hService)
		'CloseServiceHandle(hHandle)

		'Free the buffer from memory
		'delete Xbuffer

	ENDIF
endif

return 
endsub


SUB ServiceHnd(),int
SELECT @MESSAGE

	case @IDCREATE			
		  CENTERWINDOW dy4

	CASE @IDMENUPICK 
        SELECT @MENUNUM

				CASE 2000 'Close
                 closewindow dy4 
                 return
					  
				CASE 2001 'Start service

					  StartServiceName = ""
					  StartServiceName = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)
					  ssc = StartAService(StartServiceName)

					  if ssc > 0
						  deletestring dy4,750,sps
						  insertstring dy4,750,sps,"Running"
						  SETSELECTED dy4,750,sps

						  enablecontrol dy4,BUTTON_1,0
						  enablecontrol dy4,BUTTON_2,1
                    enablemenuitem dy4,2001,0
                    enablemenuitem dy4,2002,1
                 endif

            case 2002 'Stop service

					  StopServiceName = ""
					  StopServiceName = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)
					  ssc = StopAService(StopServiceName)

                 if ssc > 0
						  deletestring dy4,750,sps
						  insertstring dy4,750,sps,"Stopped"
						  SETSELECTED dy4,750,sps

						  deletestring dy4,748,sps
						  insertstring dy4,748,sps," "
						  SETSELECTED dy4,748,sps

						  enablecontrol dy4,BUTTON_1,1
						  enablecontrol dy4,BUTTON_2,0
                    enablemenuitem dy4,2001,1
                    enablemenuitem dy4,2002,0
                 endif

            case 2003 'Change start type

                 StartUpType = "" 
                 ServiceNameStart = ""
                 StartUpType = getstring(dy4,751,getselected(dy4,751))
                 ServiceNameStart = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)

                 showwindow dy4,@SWHIDE		
                 ChangeStartType(StartUpType,ServiceNameStart)
                 showwindow dy4,@SWRESTORE

                 if StartChange = 2
						  deletestring dy4,751,sps
						  insertstring dy4,751,sps,"Automatic"
						  SETSELECTED dy4,751,sps
                 endif

                 if StartChange = 3
						  deletestring dy4,751,sps
						  insertstring dy4,751,sps,"Manual"
						  SETSELECTED dy4,751,sps
                 endif

        endselect	
	
	case @IDVSCROLL
		select @CONTROLID
			case 16
				select @CODE
					CASE @SBTHUMBTRACK										
					CASE& @SBTHUMBPOS												
						SETSCROLLPOS dy4,16,@QUAL								
					CASE @SBLINEUP													
						SETSCROLLPOS dy4,16,GETSCROLLPOS(dy4,16) - 1		
					CASE @SBLINEDOWN												
						SETSCROLLPOS dy4,16,GETSCROLLPOS(dy4,16) + 1		
					CASE @SBPAGEUP													
						SETSCROLLPOS dy4,16,GETSCROLLPOS(dy4,16) - 10		
					CASE @SBPAGEDOWN												
						SETSCROLLPOS dy4,16,GETSCROLLPOS(dy4,16) + 10		
						
				endselect

		  ENDSELECT

		  SETSELECTED dy4,747,GETSCROLLPOS(dy4,16)							
		  SETSELECTED dy4,748,GETSCROLLPOS(dy4,16)							
		  SETSELECTED dy4,749,GETSCROLLPOS(dy4,16)							
		  SETSELECTED dy4,750,GETSCROLLPOS(dy4,16)	
		  SETSELECTED dy4,751,GETSCROLLPOS(dy4,16)


   CASE @IDCONTROL

		SELECT @CONTROLID						
			case 747								
			case& 748
			case& 750
			case& 751							
			case& 749							
				select @notifycode			
					case @LBNDBLCLK	

				endselect						
		endselect	

        SELECT @CONTROLID

			CASE 747 'Service Name
                 SETSCROLLPOS dy4,16,GETSELECTED(dy4,747)
                 SETSELECTED dy4,748,GETSELECTED(dy4,747)
                 SETSELECTED dy4,749,GETSELECTED(dy4,747)
                 SETSELECTED dy4,750,GETSELECTED(dy4,747)
                 SETSELECTED dy4,751,GETSELECTED(dy4,747)

                 state1 = getstring(dy4,750,getselected(dy4,750)) 
                 state1 = ltrim$(state1)

                 if state1 = "Running"
                    enablecontrol dy4,BUTTON_1,0
                    enablemenuitem dy4,2001,0
                    enablemenuitem dy4,2002,1
                 else
                    enablecontrol dy4,BUTTON_1,1
                 endif

                 if state1 = "Stopped"
                    enablecontrol dy4,BUTTON_2,0
                    enablemenuitem dy4,2002,0
                    enablemenuitem dy4,2001,1
                 else
                    enablecontrol dy4,BUTTON_2,1
                 endif
     
  					  sps = getscrollpos(dy4,16)


			CASE 748 'Service ID
                 SETSCROLLPOS dy4,16,GETSELECTED(dy4,748)
                 SETSELECTED dy4,747,GETSELECTED(dy4,748)
                 SETSELECTED dy4,749,GETSELECTED(dy4,748)
                 SETSELECTED dy4,750,GETSELECTED(dy4,748)
                 SETSELECTED dy4,751,GETSELECTED(dy4,748)

                 state1 = getstring(dy4,750,getselected(dy4,750)) 
                 state1 = ltrim$(state1)

                 if state1 = "Running"
                    enablecontrol dy4,BUTTON_1,0
                 else
                    enablecontrol dy4,BUTTON_1,1
                 endif

                 if state1 = "Stopped"
                    enablecontrol dy4,BUTTON_2,0
                 else
                    enablecontrol dy4,BUTTON_2,1
                 endif
     
  					  sps = getscrollpos(dy4,16)

			CASE 749 'Service Display Name
                 SETSCROLLPOS dy4,16,GETSELECTED(dy4,749)
                 SETSELECTED dy4,747,GETSELECTED(dy4,749)
                 SETSELECTED dy4,748,GETSELECTED(dy4,749)
                 SETSELECTED dy4,750,GETSELECTED(dy4,749)
                 SETSELECTED dy4,751,GETSELECTED(dy4,749)

                 state1 = getstring(dy4,750,getselected(dy4,750)) 
                 state1 = ltrim$(state1)

                 if state1 = "Running"
                    enablecontrol dy4,BUTTON_1,0
                 else
                    enablecontrol dy4,BUTTON_1,1
                 endif

                 if state1 = "Stopped"
                    enablecontrol dy4,BUTTON_2,0
                 else
                    enablecontrol dy4,BUTTON_2,1
                 endif
     
  					  sps = getscrollpos(dy4,16)

			CASE 750 'Service Status
                 SETSCROLLPOS dy4,16,GETSELECTED(dy4,750)
                 SETSELECTED dy4,747,GETSELECTED(dy4,750)
                 SETSELECTED dy4,748,GETSELECTED(dy4,750)
                 SETSELECTED dy4,749,GETSELECTED(dy4,750)
                 SETSELECTED dy4,751,GETSELECTED(dy4,750)

                 state1 = getstring(dy4,750,getselected(dy4,750)) 
                 state1 = ltrim$(state1)

                 if state1 = "Running"
                    enablecontrol dy4,BUTTON_1,0
                 else
                    enablecontrol dy4,BUTTON_1,1
                 endif

                 if state1 = "Stopped"
                    enablecontrol dy4,BUTTON_2,0
                 else
                    enablecontrol dy4,BUTTON_2,1
                 endif
     
  					  sps = getscrollpos(dy4,16)

			CASE 751 'Service Start Type
                 SETSCROLLPOS dy4,16,GETSELECTED(dy4,751)
                 SETSELECTED dy4,747,GETSELECTED(dy4,751)
                 SETSELECTED dy4,748,GETSELECTED(dy4,751)
                 SETSELECTED dy4,749,GETSELECTED(dy4,751)
                 SETSELECTED dy4,750,GETSELECTED(dy4,751)

                 state1 = getstring(dy4,750,getselected(dy4,750)) 
                 state1 = ltrim$(state1)

                 if state1 = "Running"
                    enablecontrol dy4,BUTTON_1,0
                 else
                    enablecontrol dy4,BUTTON_1,1
                 endif

                 if state1 = "Stopped"
                    enablecontrol dy4,BUTTON_2,0
                 else
                    enablecontrol dy4,BUTTON_2,1
                 endif
     
  					  sps = getscrollpos(dy4,16)

			case BUTTON_1 'Start a service
              if @NOTIFYCODE = 0
					  StartServiceName = ""
					  StartServiceName = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)
					  ssc = StartAService(StartServiceName)

					  if ssc > 0
						  deletestring dy4,750,sps
						  insertstring dy4,750,sps,"Running"
						  SETSELECTED dy4,750,sps

						  enablecontrol dy4,BUTTON_1,0
						  enablecontrol dy4,BUTTON_2,1
                    enablemenuitem dy4,2001,0
                    enablemenuitem dy4,2002,1
                 endif

              endif

			case BUTTON_2 'Stop a service
              if @NOTIFYCODE = 0
					  StopServiceName = ""
					  StopServiceName = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)
					  ssc = StopAService(StopServiceName)

                 if ssc > 0
						  deletestring dy4,750,sps
						  insertstring dy4,750,sps,"Stopped"
						  SETSELECTED dy4,750,sps

						  deletestring dy4,748,sps
						  insertstring dy4,748,sps," "
						  SETSELECTED dy4,748,sps

						  enablecontrol dy4,BUTTON_1,1
						  enablecontrol dy4,BUTTON_2,0
                    enablemenuitem dy4,2001,1
                    enablemenuitem dy4,2002,0
                 endif

              endif

			case BUTTON_3 'Close
              if @NOTIFYCODE = 0
 		           CLOSEWINDOW dy4
                 return
              endif

			case BUTTON_4 'Change start type
              if @NOTIFYCODE = 0

                 StartUpType = "" 
                 ServiceNameStart = ""
                 StartUpType = getstring(dy4,751,getselected(dy4,751))
                 ServiceNameStart = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)

                 showwindow dy4,@SWHIDE		
                 ChangeStartType(StartUpType,ServiceNameStart)
                 showwindow dy4,@SWRESTORE

                 if StartChange = 2
						  deletestring dy4,751,sps
						  insertstring dy4,751,sps,"Automatic"
						  SETSELECTED dy4,751,sps
                 endif

                 if StartChange = 3
						  deletestring dy4,751,sps
						  insertstring dy4,751,sps,"Manual"
						  SETSELECTED dy4,751,sps
                 endif

              endif

			case BUTTON_5 'Service Details
              if @NOTIFYCODE = 0

                 ServiceNameStart = ""
                 ServiceNameStart = getstring(dy4,747,getselected(dy4,747))

					  sps = getscrollpos(dy4,16)

                 showwindow dy4,@SWHIDE		
                 ServiceDetailsScreen(ServiceNameStart)
                 showwindow dy4,@SWRESTORE

              endif

      ENDSELECT

		CASE @IDCLOSEWINDOW
 		     CLOSEWINDOW dy4
           return
   
ENDSELECT

RETURN 0
ENDSUB

sub StartAService(string MyService),int
nSize = 255
'MyService = RegGetValue("HKEY_CURRENT_USER\\Software\\MyServices","ServiceName")     ' A name for the service.
MyService = ltrim$(MyService)
'Display ="IWBDisplayName" ' A display name for the service.

OPENCONSOLE 'So we can see if there are any errors.
print
print

'==========================================================
'Step 1 - open a connection to the service control manager.
'==========================================================

hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS)
IF hSCManager = 0 THEN
   Error1 = _GetLastError ()
   _FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error1,0,ErMes,nSize,Arguments)
   Print "  Error by OSCM: ",ErMes

	'Close handles
	_CloseServiceHandle(hService)
	_CloseServiceHandle(hSCManager)

	'Free the buffer from memory
	delete Xbuffer

	print
	print
	print "  Press any key to close..."
	print
	DO:UNTIL INKEY$<>""
	closeconsole
	return

else

	print
	print "  Service manager opened..."
	print

ENDIF


'==========================
'Step 2 - open the service.
'==========================

hService = OpenService(hSCManager,MyService,SC_MANAGER_ALL_ACCESS)
IF hService = 0 THEN
   Error2 = _GetLastError ()
   _FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error2,0,ErMes,nSize,Arguments)
   Print "  Error by Open Service: ",ErMes

	'Close handles
	_CloseServiceHandle(hService)
	_CloseServiceHandle(hSCManager)

	'Free the buffer from memory
	delete Xbuffer

	print
	print
	print "  Press any key to close..."
	print
	DO:UNTIL INKEY$<>""
	closeconsole
	return 0

else

	print
	print "  Service was found..."
	print

ENDIF


'============================
'Step 3 - Query the service.
'============================

int qs

'Designed to fail to get bytes needed.
qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,NULL,0,&Bneeded)

if not qs then 'Error detected.
	if _GetLastError() = ERROR_INSUFFICIENT_BUFFER then
		Xbuffer = new(char, Bneeded)

      'Now try again with correct bytes required.
		qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,Xbuffer,Bneeded,&Bneeded)

      'If second fail, print error and exit. 
		IF qs = 0 THEN 'Error detected.
			Error3 = _GetLastError ()
			_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error3,0,ErMes,nSize,Arguments)
			Print "  Error by Query Service: ",ErMes

			'Close handles
			_CloseServiceHandle(hService)
			_CloseServiceHandle(hSCManager)

			'Free the buffer from memory
			delete Xbuffer

			print
			print
			print "  Press any key to close..."
			print
			DO:UNTIL INKEY$<>""
			closeconsole
			return 0

		endif

	endif

	' Now get and display the results using type cast
   print "  Service Name ",MyService
   PRINT	"  Type         ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceType
	PRINT	"  State        ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState
	PRINT	"  Accepted     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwControlsAccepted
	PRINT	"  ExitCode     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWin32ExitCode
	PRINT	"  SExitCode    ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceSpecificExitCode
	PRINT	"  CheckPoint   ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCheckPoint
	PRINT	"  WaitHint     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWaitHint
   print "  Proc ID      ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwProcessId
   print "  Bytes needed ",Bneeded
	print
	print
	print "  No errors... ",qs

else

	' Now get and display the results using type cast
   print "  Service Name ",MyService
   PRINT	"  Type         ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceType
	PRINT	"  State        ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState
	PRINT	"  Accepted     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwControlsAccepted
	PRINT	"  ExitCode     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWin32ExitCode
	PRINT	"  SExitCode    ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceSpecificExitCode
	PRINT	"  CheckPoint   ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCheckPoint
	PRINT	"  WaitHint     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWaitHint
   print "  Proc ID      ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwProcessId
   print "  Bytes needed ",Bneeded
	print
	print
	print "  No errors... ",qs

endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_RUNNING
	print "  Service is Already Running."
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_STOPPED
	print "  Service is Stopped."
 
	def lpServiceStatus AS SERVICE_STATUS

	'===========================
	'Step 4 - Start the service.
	'===========================

	ss=StartService(hService,0,0) 

	IF ss = 0 THEN
		Error1 = _GetLastError ()
		_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error1,0,ErMes,nSize,Arguments)
		PRINT "  Error by StartService:",ErMes

		'Close handles
		_CloseServiceHandle(hService)
		_CloseServiceHandle(hSCManager)

		'Free the buffer from memory
		delete Xbuffer
      return 0

	else

		print
		print "  Service was started..."
		print

      QueryTheService2(hService)

	ENDIF

endif 

'=========================================================
'Step 4 - Close the handle to the service control manager.
'=========================================================

LABEL Exit
'Close handles
_CloseServiceHandle(hService)
_CloseServiceHandle(hSCManager)

'Free the buffer from memory
delete Xbuffer

print
print
print "  Press any key to close..."
print
DO:UNTIL INKEY$<>""
closeconsole
return 1
endsub

sub StopAService(string MyService),int
nSize = 255
'MyService = RegGetValue("HKEY_CURRENT_USER\\Software\\MyServices","ServiceName")     ' A name for the service.
MyService = ltrim$(MyService)
'Display ="IWBDisplayName" ' A display name for the service.

OPENCONSOLE 'So we can see if there are any errors.
print
print

'==========================================================
'Step 1 - open a connection to the service control manager.
'==========================================================

hSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS)
IF hSCManager = 0 THEN
   Error1 = _GetLastError ()
   _FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error1,0,ErMes,nSize,Arguments)
   Print "  Error by OSCM: ",ErMes

	'Close handles
	_CloseServiceHandle(hService)
	_CloseServiceHandle(hSCManager)

	'Free the buffer from memory
	delete Xbuffer

	print
	print
	print "  Press any key to close..."
	print
	DO:UNTIL INKEY$<>""
	closeconsole
	return 0

else

	print
	print "  Service manager opened..."
	print

ENDIF


'==========================
'Step 2 - open the service.
'==========================

hService = OpenService(hSCManager,MyService,SC_MANAGER_ALL_ACCESS)
IF hService = 0 THEN
   Error2 = _GetLastError ()
   _FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error2,0,ErMes,nSize,Arguments)
   Print "  Error by Open Service: ",ErMes

	'Close handles
	_CloseServiceHandle(hService)
	_CloseServiceHandle(hSCManager)

	'Free the buffer from memory
	delete Xbuffer

	print
	print
	print "  Press any key to close..."
	print
	DO:UNTIL INKEY$<>""
	closeconsole
	return 0

else

	print
	print "  Service was found..."
	print

ENDIF


'============================
'Step 3 - Query the service.
'============================

int qs

'Designed to fail to get bytes needed.
qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,NULL,0,&Bneeded)

if not qs then 'Error detected.
	if _GetLastError() = ERROR_INSUFFICIENT_BUFFER then
		Xbuffer = new(char, Bneeded)

      'Now try again with correct bytes required.
		qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,Xbuffer,Bneeded,&Bneeded)

      'If second fail, print error and exit. 
		IF qs = 0 THEN 'Error detected.
			Error3 = _GetLastError ()
			_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error3,0,ErMes,nSize,Arguments)
			Print "  Error by Query Service: ",ErMes

			'Close handles
			_CloseServiceHandle(hService)
			_CloseServiceHandle(hSCManager)

			'Free the buffer from memory
			delete Xbuffer

			print
			print
			print "  Press any key to close..."
			print
			DO:UNTIL INKEY$<>""
			closeconsole
			return 0

		endif

	endif

	' Now get and display the results using type cast
   print "  Service Name ",MyService
   PRINT	"  Type         ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceType
	PRINT	"  State        ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState
	PRINT	"  Accepted     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwControlsAccepted
	PRINT	"  ExitCode     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWin32ExitCode
	PRINT	"  SExitCode    ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceSpecificExitCode
	PRINT	"  CheckPoint   ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCheckPoint
	PRINT	"  WaitHint     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWaitHint
   print "  Proc ID      ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwProcessId
   print "  Bytes needed ",Bneeded
	print
	print
	print "  No errors... ",qs

else

	' Now get and display the results using type cast
   print "  Service Name ",MyService
   PRINT	"  Type         ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceType
	PRINT	"  State        ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState
	PRINT	"  Accepted     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwControlsAccepted
	PRINT	"  ExitCode     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWin32ExitCode
	PRINT	"  SExitCode    ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwServiceSpecificExitCode
	PRINT	"  CheckPoint   ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwCheckPoint
	PRINT	"  WaitHint     ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwWaitHint
   print "  Proc ID      ",#<SERVICE_STATUS_PROCESS>Xbuffer.dwProcessId
   print "  Bytes needed ",Bneeded
	print
	print
	print "  No errors... ",qs

endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_STOPPED
	print "  Service is Already Stopped."
endif 

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_RUNNING
	print "  Service is Running."
	def lpServiceStatus AS SERVICE_STATUS

	'==========================
	'Step 4 - Stop the service.
	'==========================

	cs = ControlService(hService,SERVICE_CONTROL_STOP,lpServiceStatus)
	IF cs = 0 THEN
		Error4 = _GetLastError ()
		_FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error4,0,ErMes,nSize,Arguments)
		Print "  Error by Control Service: ",ErMes

		'Close handles
		_CloseServiceHandle(hService)
		_CloseServiceHandle(hSCManager)

		'Free the buffer from memory
		delete Xbuffer

		print
		print
		print "  Press any key to close..."
		print
		DO:UNTIL INKEY$<>""
		closeconsole
		return 0

	else
 
		print
		print "  Service was stopped..."
		print

	ENDIF

endif 

'=========================================================
'Step 4 - Close the handle to the service control manager.
'=========================================================

LABEL Exit
'Close handles
_CloseServiceHandle(hService)
_CloseServiceHandle(hSCManager)

'Free the buffer from memory
delete Xbuffer

print
print
print "  Press any key to close..."
print
DO:UNTIL INKEY$<>""
closeconsole
return 1
endsub

sub ChangeStartType(string StartUpType,string ServiceNameStart),int

StartUpType = ltrim$(StartUpType)
StartUpType = rtrim$(StartUpType)

ServiceNameStart = ltrim$(ServiceNameStart)
ServiceNameStart = rtrim$(ServiceNameStart)

OPENWINDOW dy5,100,100,400,290,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," Start type.",&TypeHnd	
floodfill dy5,1,1,rgb(bcr,bcg,bcb)

CONTROL dy5,@STATIC,ServiceNameStart,40,40,200,25,@CTEDITLEFT,STATIC_1

CONTROL dy5,@RADIOBUTTON,"Automatic",40,90,200,25,@CTLISTNOTIFY,RADIO_1	
CONTROL dy5,@RADIOBUTTON,"Manual",40,130,80,25,@CTLISTNOTIFY,RADIO_2
	
CONTROL dy5,@BUTTON,"Save",40,200,100,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1	
CONTROL dy5,@BUTTON,"Cancel",160,200,100,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_2	

SETCONTROLCOLOR dy5,STATIC_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy5,RADIO_1,RGB(160,138,0),rgb(0,0,0)
SETCONTROLCOLOR dy5,RADIO_2,RGB(160,138,0),rgb(0,0,0)

SETFONT dy5,"Arial",12,500,0,BUTTON_1
SETFONT dy5,"Arial",12,500,0,BUTTON_2

SETFONT dy5,"Arial",12,500,0,STATIC_1
SETFONT dy5,"Arial",12,500,0,RADIO_1
SETFONT dy5,"Arial",12,500,0,RADIO_2

if StartUpType = "Automatic"
   setstate dy5,RADIO_1,1
   setstate dy5,RADIO_2,0
endif

if StartUpType = "Manual"
   setstate dy5,RADIO_1,0
   setstate dy5,RADIO_2,1
endif

waituntil dy5=0
return 0
endsub

SUB TypeHnd(),int
SELECT @MESSAGE

	case @IDCREATE			
		  CENTERWINDOW dy5

   CASE @IDCONTROL

        SELECT @CONTROLID

			case RADIO_1 'Automatic
              if @NOTIFYCODE = 0
					  setstate dy5,RADIO_1,1
					  setstate dy5,RADIO_2,0
                 setfocus dy5
              endif

			case RADIO_2 'Manual
              if @NOTIFYCODE = 0
					  setstate dy5,RADIO_1,0
					  setstate dy5,RADIO_2,1
                 setfocus dy5
              endif

			case BUTTON_1 'Save
              if @NOTIFYCODE = 0
                 if getstate(dy5,RADIO_1) = 1
				        RegSetDWValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\" + ServiceNameStart,2,"Start")
                    StartChange = 2
 		              CLOSEWINDOW dy5
                    return 0
                 endif

                 if getstate(dy5,RADIO_2) = 1
				        RegSetDWValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\" + ServiceNameStart,3,"Start")
                    StartChange = 3
 		              CLOSEWINDOW dy5
                    return 0
                endif
              endif

			case BUTTON_2 'Cancel
              if @NOTIFYCODE = 0
 		           CLOSEWINDOW dy5
                 return 0
              endif

      ENDSELECT

		CASE @IDCLOSEWINDOW
 		     CLOSEWINDOW dy5
           return 0
   
ENDSELECT

RETURN 0
ENDSUB

Sub QueryTheService2(uint hService)
int qs

'Designed to fail to get bytes needed.
qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,NULL,0,&Bneeded)

if !qs then 'Error detected.
	if GetLastError() = ERROR_INSUFFICIENT_BUFFER then
		Xbuffer = new(char, Bneeded)

      'Now try again with correct bytes required.
		qs = QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,Xbuffer,Bneeded,&Bneeded)

      'If second fail, print error and exit. 
		IF qs = 0 THEN 'Error detected.
			Error3 = GetLastError ()
			FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error3,0,ErMes,nSize,Arguments)
			'Print "  Error by Query Service: ",ErMes

			'Close handles
			CloseServiceHandle(hService)

			'Free the buffer from memory
			'delete Xbuffer

			'print
			'print
			'print "  Unable to query service..."
			'print
         return 

		endif

	endif

endif

pointer pi = #<SERVICE_STATUS_PROCESS>Xbuffer.dwProcessId
int prcid = #<int>pi
LServiceId[i] = prcid

deletestring dy4,748,sps
insertstring dy4,748,sps,ltrim$(str$(prcid))
SETSELECTED dy4,748,sps

delete pi

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_STOPPED
	'print "  Service State (Stopped)."
   LServiceStatus[i] = "Stopped" 
endif 

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_RUNNING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Running" 
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_START_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Start Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_STOP_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Stop Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_CONTINUE_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Continue Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_PAUSE_PENDING
	'print "  Service State (Running)."
   LServiceStatus[i] = "Pause Pending"
endif

if #<SERVICE_STATUS_PROCESS>Xbuffer.dwCurrentState = SERVICE_PAUSED
	'print "  Service State (Running)."
   LServiceStatus[i] = "Paused"
endif

if CloseService = 1

	cs = ControlService(hService,SERVICE_CONTROL_STOP,lpServiceStatus)
	IF cs = 0 THEN
		Error4 = GetLastError ()
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,Error4,0,ErMes,nSize,Arguments)
		'Print "  Error by Control Service: ",ErMes

		'Close handles
		CloseServiceHandle(hService)
		CloseServiceHandle(hHandle)

		'Free the buffer from memory
		delete Xbuffer

		'print
		'print
		'print "  Press any key to close..."
		'print
		'DO:UNTIL INKEY$<>""
		'closeconsole
		'end
      return 

	else
 
		'print
		'print "  Service was stopped..."
		'print

		'Close handles
		'CloseServiceHandle(hService)
		'CloseServiceHandle(hHandle)

		'Free the buffer from memory
		'delete Xbuffer

	ENDIF
endif

return 
endsub


sub ServiceDetailsScreen(string ServiceNameStart),int

ServiceNameStart = ltrim$(ServiceNameStart)
ServiceNameStart = rtrim$(ServiceNameStart)

OPENWINDOW dy5,100,100,800,700,@CAPTION|@MINBOX|@MAXBOX|@TOPMOST,0," More details.",&ServiceDetailsHnd	
floodfill dy5,1,1,rgb(bcr,bcg,bcb)

CONTROL dy5,@STATIC,"Service Name: " + ServiceNameStart,40,40,200,25,@CTEDITLEFT,STATIC_1

CONTROL dy5,@STATIC,"",40,100,700,25,@CTEDITLEFT,5001
CONTROL dy5,@STATIC,"",40,130,700,25,@CTEDITLEFT,6001

CONTROL dy5,@STATIC,"",40,160,700,25,@CTEDITLEFT,5002
CONTROL dy5,@STATIC,"",40,190,700,25,@CTEDITLEFT,6002

CONTROL dy5,@STATIC,"",40,220,700,25,@CTEDITLEFT,5003
CONTROL dy5,@STATIC,"",40,250,700,25,@CTEDITLEFT,6003

CONTROL dy5,@STATIC,"",40,280,700,25,@CTEDITLEFT,5004
CONTROL dy5,@STATIC,"",40,310,700,25,@CTEDITLEFT,6004

CONTROL dy5,@STATIC,"",40,340,700,25,@CTEDITLEFT,5005
CONTROL dy5,@STATIC,"",40,370,700,25,@CTEDITLEFT,6005

CONTROL dy5,@STATIC,"",40,400,700,25,@CTEDITLEFT,5006
CONTROL dy5,@STATIC,"",40,430,700,25,@CTEDITLEFT,6006

CONTROL dy5,@STATIC,"",40,460,700,25,@CTEDITLEFT,5007
CONTROL dy5,@STATIC,"",40,490,700,25,@CTEDITLEFT,6007

CONTROL dy5,@STATIC,"",40,520,700,25,@CTEDITLEFT,5008
CONTROL dy5,@STATIC,"",40,550,700,25,@CTEDITLEFT,6008
	
CONTROL dy5,@BUTTON,"Close",680,630,100,25,0x50800009|@CTLBTNDEFAULT|@TABSTOP, BUTTON_1	

SETCONTROLCOLOR dy5,STATIC_1,RGB(255,255,255),rgb(0,0,0)

for y = 1 to 8
	SETFONT dy5,"Arial",12,500,0,y + 5000
   SETCONTROLCOLOR dy5,y+5000,RGB(160,138,0),rgb(0,0,0)
   SETCONTROLCOLOR dy5,y+6000,RGB(255,255,255),rgb(0,0,0)
	SETFONT dy5,"Arial",12,500,0,y + 6000
next y


SETFONT dy5,"Arial",12,500,0,BUTTON_1
SETFONT dy5,"Arial",12,500,0,BUTTON_2

SETFONT dy5,"Arial",12,500,0,STATIC_1
SETFONT dy5,"Arial",12,500,0,RADIO_1
SETFONT dy5,"Arial",12,500,0,RADIO_2

'Key to be enumerated - CHANGE THIS TO A VALID REGISTRY KEY OF YOUR CHOICE
examkey = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\" + ServiceNameStart

'PRINT
'PRINT "Key to enumerated = ",examkey
'PRINT

'Count the number of sub keys
ret = RegCountSubKeys(examkey)
'PRINT "Number of sub-keys = ", ret
'PRINT

'Enumerate sub keys
FOR y = 0 to (ret-1)
'retval = RegEnumKey(examkey,y)
'PRINT "Sub-key ",(y+1), retval
NEXT y

'PRINT
'PRINT "Press any key to list registry entries for ",examkey
'DO:UNTIL INKEY$ <> ""
'PRINT CLS

'Count the number of values (entries) for the key "HKEY_CURRENT_USER\\Software\\KMS"
'PRINT
mvalues = RegCountEntries(examkey)
'PRINT values,"entries for ",examkey
'PRINT

'Enumerate the entry names
FOR y = 0 to (mvalues-1)
mretval = RegEnumEntryName(examkey,y)
'PRINT examkey," entry ",(y+1), retval

setcontroltext(dy5,y+5001,mretval)

'Display the type - string,dword etc
showtype = RegGetEntryType(examkey,mretval)

IF showtype = 1
   'PRINT "The entry '",retval,"' is a String"
ENDIF

IF showtype = 4
   'PRINT "The entry '",retval,"' is a Dword"
ENDIF

'Display the stored value of the entry
resultin = RegGetValue(examkey,mretval)
setcontroltext(dy5,y+6001,resultin)
'PRINT "Value is ",resultin
'PRINT
NEXT y

waituntil dy5=0
return 0
endsub

SUB ServiceDetailsHnd(),int
SELECT @MESSAGE

	case @IDCREATE			
		  CENTERWINDOW dy5

   CASE @IDCONTROL

        SELECT @CONTROLID

			case BUTTON_1 'Close
              if @NOTIFYCODE = 0
 		           CLOSEWINDOW dy5
                 return 0
              endif

      ENDSELECT

		CASE @IDCLOSEWINDOW
 		     CLOSEWINDOW dy5
           return 0
   
ENDSELECT

RETURN 0
ENDSUB