$include "windows.inc"
'$use "advapi32.lib"

const SERVICE_WIN32 = 0x30
const SERVICE_START_PENDING = 0x2
const SERVICE_ACCEPT_STOP = 0x1
const SERVICE_ACCEPT_SHUTDOWN = 0x4
const SERVICE_STOPPED = 0x1

def LPHANDLER_FUNCTION as pointer
typedef SERVICE_STATUS_HANDLE int
def LPSERVICE_MAIN_FUNCTION as int
typedef SERVICE_STATUS_HANDLE int


def ServiceStatus as SERVICE_STATUS 
def hStatus as SERVICE_STATUS_HANDLE

declare import, RegisterServiceCtrlHandler alias RegisterServiceCtrlHandlerA(pointer lpServiceName,int lpHandlerProc),SERVICE_STATUS_HANDLE
declare import, StartServiceCtrlDispatcher alias StartServiceCtrlDispatcherA(pointer lpServiceTable),int
declare import, SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,pointer lpServiceStatus),int
DECLARE IMPORT, Sleep(int time)		

int request
int argc
int SLEEP_TIME = 5000
string LOGFILE = "C:\\RunOnce\\log.txt"
string MyService = "memorystatus"

openconsole

InitService()
Main(LPSERVICE_MAIN_FUNCTION) 
ServiceMain(argc) 
ControlHandler(request) 

closeconsole
do:until inkey$ <> ""

end

'int WriteToLog(char* str)
'
'	FILE* log
'	log = fopen(LOGFILE, "a+")
'	if (log == NULL)
'		return -1
'	fprintf(log, "%s\n", str)
'	fclose(log)
'	return 0


sub Main(int LPSERVICE_MAIN_FUNCTION),int 
    def mfunc as int
    def ServiceTable[2] as SERVICE_TABLE_ENTRY 
    ServiceTable[0].lpServiceName = "MemoryStatus"
    mfunc = ServiceMain(LPSERVICE_MAIN_FUNCTION)
    ServiceTable[0].lpServiceProc = mfunc

    ServiceTable[1].lpServiceName = NULL
    ServiceTable[1].lpServiceProc = NULL
    ' Start the control dispatcher thread for our service
    StartServiceCtrlDispatcher(ServiceTable)  
return 0
endsub


sub ServiceMain(int argc),int 
 
    int error 
 
    ServiceStatus.dwServiceType             = SERVICE_WIN32 
    ServiceStatus.dwCurrentState            = SERVICE_START_PENDING 
    ServiceStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN
    ServiceStatus.dwWin32ExitCode           = 0 
    ServiceStatus.dwServiceSpecificExitCode = 0 
    ServiceStatus.dwCheckPoint              = 0 
    ServiceStatus.dwWaitHint                = 0 
 
    hStatus = RegisterServiceCtrlHandler(MyService,ControlHandler(LPHANDLER_FUNCTION)) 
    if hStatus = 0 
        ' Registering Control Handler failed
        return hStatus
    endif
      
    ' Initialize Service 
    error = InitService() 
    if error 
 		' Initialization failed
        ServiceStatus.dwCurrentState       = SERVICE_STOPPED 
        ServiceStatus.dwWin32ExitCode      = -1 
        SetServiceStatus(hStatus, &ServiceStatus) 
        return ServiceStatus.dwWin32ExitCode
    endif
      
    ' We report the running status to SCM. 
    ServiceStatus.dwCurrentState = SERVICE_RUNNING 
    SetServiceStatus (hStatus, &ServiceStatus)
 
    'MEMORYSTATUS memory
    ' The worker loop of a service

    file MyFile

    openfile(MyFile,LOGFILE,"W")

    while ServiceStatus.dwCurrentState = SERVICE_RUNNING
	
      write MyFile,"Service Running..."
		'char buffer[16]
		'GlobalMemoryStatus(&memory)
		'sprintf(buffer, "%d", memory.dwAvailPhys)
		'int result = WriteToLog(buffer)

		'if (result)
		
		'	ServiceStatus.dwCurrentState       = SERVICE_STOPPED 
		'	ServiceStatus.dwWin32ExitCode      = -1 
		'	SetServiceStatus(hStatus, &ServiceStatus)
		'	return ServiceStatus.dwWin32ExitCode

		'endif

		Sleep(SLEEP_TIME)

    endwhile
	
    closefile MyFile

    return hStatus
endsub

 
' Service initialization
sub InitService(),int 
    int result
    'result = WriteToLog("Monitoring started.")
    return result 
endsub 

' Control handler function
sub ControlHandler(int request),int 
 
    select request 
     
        case SERVICE_CONTROL_STOP: 
             'WriteToLog("Monitoring stopped.")
             ServiceStatus.dwWin32ExitCode = 0 
             ServiceStatus.dwCurrentState  = SERVICE_STOPPED 
             SetServiceStatus (hStatus, &ServiceStatus)
             return hStatus
 
        case SERVICE_CONTROL_SHUTDOWN: 
             'WriteToLog("Monitoring stopped.")
             ServiceStatus.dwWin32ExitCode = 0 
             ServiceStatus.dwCurrentState  = SERVICE_STOPPED 
             SetServiceStatus (hStatus, &ServiceStatus)
             return hStatus
        
    endselect
     
 
    ' Report current status
    SetServiceStatus (hStatus, &ServiceStatus)
 
    return hStatus
 endsub


