repository: c:/kernel.org/kvm-guest-drivers-windows
branch: master
commit daf4f003115776271af690b59329ece72183ea27
Author: Vadim Rozenfeld <[email protected]>
Date:   Mon Sep 27 13:36:49 2010 +0200

    [balloon] support for memory statistics

diff --git a/Balloon/app/device.cpp b/Balloon/app/device.cpp
index 6ab257e..36dda69 100644
--- a/Balloon/app/device.cpp
+++ b/Balloon/app/device.cpp
@@ -1,5 +1,6 @@
 #include "device.h"
 #include "public.h"
+#include "utils.h"
 
 CDevice::CDevice()
 {
@@ -8,7 +9,10 @@ CDevice::CDevice()
 
 CDevice::~CDevice()
 {
+    BALLOON_STAT stat[VIRTIO_BALLOON_S_NR];
     if (m_hDevice != INVALID_HANDLE_VALUE) {
+        memset(stat, -1, sizeof(BALLOON_STAT) * VIRTIO_BALLOON_S_NR);
+        Write(stat, VIRTIO_BALLOON_S_NR); 
         CloseHandle(m_hDevice);
         m_hDevice = INVALID_HANDLE_VALUE;
     }
@@ -23,22 +27,31 @@ BOOL CDevice::Init()
                              0,
                              NULL,
                              OPEN_EXISTING,
-                             FILE_FLAG_OVERLAPPED,
+                             FILE_ATTRIBUTE_NORMAL,
                              NULL );
 
         if (m_hDevice != INVALID_HANDLE_VALUE) {
+            PrintMessage("Open balloon device"); 
             return TRUE;
         }
 
     }
+    PrintMessage("Cannot find balloon device"); 
     return FALSE;
 }
 
-BOOL CDevice::Write(PBALLOON_STAT pstat, int nr, HANDLE ev)
+BOOL CDevice::Write(PBALLOON_STAT pstat, int nr)
 {
-    OVERLAPPED ov = {0};
-    ov.hEvent = ev;
-    return WriteFile(m_hDevice, pstat, sizeof(BALLOON_STAT) * nr, NULL,
&ov);
+    BOOL res = FALSE;
+    ULONG ret = 0; 
+    res = WriteFile(m_hDevice, pstat, sizeof(BALLOON_STAT) * nr, &ret,
NULL);
+    if (!res) {
+        PrintMessage("Cannot write balloon device"); 
+    } else if ( ret != sizeof(BALLOON_STAT) * nr) {
+        PrintMessage("Write balloon device error");
+        ret = FALSE; 
+    }
+    return res;
 }
 
 
@@ -57,6 +70,7 @@ PTCHAR CDevice::GetDevicePath( IN  LPGUID
InterfaceGuid )
                              (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
 
     if (HardwareDeviceInfo == INVALID_HANDLE_VALUE) {
+        PrintMessage("Cannot get class devices"); 
         return NULL;
     }
 
@@ -69,6 +83,7 @@ PTCHAR CDevice::GetDevicePath( IN  LPGUID
InterfaceGuid )
                                               &DeviceInterfaceData);
 
     if (bResult == FALSE) {
+        PrintMessage("Cannot get enumerate device interfaces"); 
         SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
         return NULL;
     }
@@ -85,6 +100,7 @@ PTCHAR CDevice::GetDevicePath( IN  LPGUID
InterfaceGuid )
     DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
LocalAlloc(LMEM_FIXED, RequiredLength);
 
     if (DeviceInterfaceDetailData == NULL) {
+        PrintMessage("Cannot allocate memory"); 
         SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
         return NULL;
     }
@@ -102,6 +118,7 @@ PTCHAR CDevice::GetDevicePath( IN  LPGUID
InterfaceGuid )
                   NULL);
 
     if (bResult == FALSE) {
+        PrintMessage("Cannot get device interface details"); 
         SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
         LocalFree(DeviceInterfaceDetailData);
         return NULL;
diff --git a/Balloon/app/device.h b/Balloon/app/device.h
index f2aea71..4095054 100644
--- a/Balloon/app/device.h
+++ b/Balloon/app/device.h
@@ -16,7 +16,7 @@ public:
     CDevice();
     ~CDevice();
     BOOL     Init();
-    BOOL     Write(PBALLOON_STAT pstat, int nr, HANDLE ev);
+    BOOL     Write(PBALLOON_STAT pstat, int nr);
 protected:
     HANDLE   m_hDevice;
     PTCHAR   GetDevicePath( IN  LPGUID InterfaceGuid );
diff --git a/Balloon/app/main.cpp b/Balloon/app/main.cpp
index eab7542..983aaef 100644
--- a/Balloon/app/main.cpp
+++ b/Balloon/app/main.cpp
@@ -12,6 +12,7 @@ void __stdcall Handler(DWORD ctlcode)
 { 
     CService::HandlerThunk(&srvc, ctlcode);
 } 
+
 void __stdcall ServiceMain(DWORD argc, TCHAR* argv[]) 
 {
     srvc.m_StatusHandle = RegisterServiceCtrlHandler(argv[0],
(LPHANDLER_FUNCTION) Handler);
@@ -24,6 +25,23 @@ SERVICE_TABLE_ENTRY serviceTable[] =
     { NULL, NULL}
 };
 
+void __stdcall HandlerEx(DWORD ctlcode, DWORD evtype, PVOID evdata,
PVOID context)
+{
+    CService::HandlerExThunk((CService*) context, ctlcode, evtype,
evdata);
+}
+
+void __stdcall ServiceMainEx(DWORD argc, TCHAR* argv[]) 
+{
+    srvc.m_StatusHandle = RegisterServiceCtrlHandlerEx(argv[0],
(LPHANDLER_FUNCTION_EX) HandlerEx, (PVOID) &srvc);
+    CService::ServiceMainThunk(&srvc, argc, argv);
+}
+
+SERVICE_TABLE_ENTRY serviceTableEx[] =
+{
+    { ServiceName, (LPSERVICE_MAIN_FUNCTION) ServiceMainEx},
+    { NULL, NULL}
+};
+
 ULONG
 _cdecl
 wmain(
@@ -66,7 +84,7 @@ wmain(
         }
     } else {
         BOOL success;
-        success = StartServiceCtrlDispatcher(serviceTable);
+        success = StartServiceCtrlDispatcher(serviceTableEx);
         if (!success) {
            ErrorHandler("StartServiceCtrlDispatcher",GetLastError());
         }
diff --git a/Balloon/app/memstat.cpp b/Balloon/app/memstat.cpp
index f76b9bd..db982d8 100644
--- a/Balloon/app/memstat.cpp
+++ b/Balloon/app/memstat.cpp
@@ -1,4 +1,5 @@
 #include "memstat.h"
+#include "utils.h"
 
 CMemStat::CMemStat()
 {
@@ -23,6 +24,7 @@ BOOL CMemStat::Init()
     status = CoInitializeEx(NULL, 
                             COINIT_MULTITHREADED);
     if (FAILED(status)) {
+        PrintMessage("Cannot initialize COM"); 
         return status;
     }
     initialized = TRUE;
@@ -38,6 +40,7 @@ BOOL CMemStat::Init()
                             0);
 
     if (FAILED(status)) {
+        PrintMessage("Cannot initialize security"); 
         return FALSE;
     }
 
@@ -48,6 +51,7 @@ BOOL CMemStat::Init()
                             reinterpret_cast< void** >( &locator ));
 
     if (FAILED(status)) {
+        PrintMessage("Cannot create instance"); 
         return FALSE;
     }
 
@@ -60,6 +64,7 @@ BOOL CMemStat::Init()
                             NULL,
                             &service);
     if (FAILED(status)) {
+        PrintMessage("Cannot connect to wmi server"); 
         return FALSE;
     }
 
@@ -72,107 +77,15 @@ BOOL CMemStat::Init()
                             NULL,
                             EOAC_NONE);
     if (FAILED(status)) {
+        PrintMessage("Cannot set proxy blanket"); 
         return FALSE;
     }
     return TRUE;
 }
 
-HRESULT CMemStat::GetStat()
-{
-    CComPtr< IEnumWbemClassObject > enumerator;
-    CComPtr< IWbemClassObject > memory;
-    ULONG retcnt;
-    _variant_t var_val;
-    HRESULT status  = S_OK;
-    status = service->ExecQuery(L"WQL", 
-                            L"SELECT * FROM
Win32_PerfFormattedData_PerfOS_Memory",
-                            WBEM_FLAG_FORWARD_ONLY |
WBEM_FLAG_RETURN_IMMEDIATELY, 
-                            NULL,
-                            &enumerator);
-    if (FAILED(status)) {
-        return status;
-    }
-
-    while (1)
-    {
-        status = enumerator->Next(WBEM_INFINITE,
-                            1L,
-                            &memory,
-                            &retcnt);
-        if (status == WBEM_S_FALSE) {
-            status = S_OK;
-            break;
-        }
-
-        if (FAILED(status)) {
-            return status;
-        }
-
-        status = memory->Get( L"AvailableBytes", 
-                            0, 
-                            &var_val, 
-                            NULL, 
-                            NULL );
-        if (FAILED(status)) {
-            return status;
-        }
-        if (var_val.vt != VT_NULL) {
-            printf("AvailableBytes = %d\n", (long)var_val);
-        }
-        status = memory->Get( L"PageFaultsPerSec", 
-                            0, 
-                            &var_val, 
-                            NULL, 
-                            NULL );
-        if (FAILED(status)) {
-            return status;
-        }
-        if (var_val.vt != VT_NULL) {
-            printf("PageFaultsPerSec = %d\n", (long)var_val);
-        }
-
-        status = memory->Get( L"PageReadsPerSec", 
-                            0, 
-                            &var_val, 
-                            NULL, 
-                            NULL );
-        if (FAILED(status)) {
-            return status;
-        }
-        if (var_val.vt != VT_NULL) {
-           printf("PageReadsPerSec = %d\n", (long)var_val);
-        }
-
-        status = memory->Get( L"PagesInputPerSec", 
-                            0, 
-                            &var_val, 
-                            NULL, 
-                            NULL );
-        if (FAILED(status)) {
-            return status;
-        }
-        if (var_val.vt != VT_NULL) {
-           printf("PagesInputPerSec = %d\n", (long)var_val);
-        }
-
-        status = memory->Get( L"PagesOutputPerSec", 
-                            0, 
-                            &var_val, 
-                            NULL, 
-                            NULL );
-        if (FAILED(status)) {
-            return status;
-        }
-        if (var_val.vt != VT_NULL) {
-           printf("PagesOutputPerSec = %d\n", (long)var_val);
-        }
-
-    }
-    return status;
-}
-
 BOOL  CMemStat::GetStatus(PBALLOON_STAT pStat)
 {
+    MEMORYSTATUS stat = {sizeof(stat)};
     CComPtr< IEnumWbemClassObject > enumerator;
     CComPtr< IWbemClassObject > memory;
     ULONG retcnt;
@@ -180,11 +93,10 @@ BOOL  CMemStat::GetStatus(PBALLOON_STAT pStat)
     HRESULT status  = S_OK;
     UINT idx = 0;
     if(!pStat) {
+        PrintMessage("Invalid pointer"); 
         return FALSE;
     }
 
-    memset(pStat, 0, sizeof(*pStat));
-
     status = service->ExecQuery(L"WQL", 
                             L"SELECT * FROM
Win32_PerfFormattedData_PerfOS_Memory",
                             WBEM_FLAG_FORWARD_ONLY |
WBEM_FLAG_RETURN_IMMEDIATELY, 
@@ -192,96 +104,80 @@ BOOL  CMemStat::GetStatus(PBALLOON_STAT pStat)
                             &enumerator);
 
     if (FAILED(status)) {
+        PrintMessage("Cannot execute query"); 
         return FALSE;
     }
 
-    while (1)
+    while(enumerator)
     {
         status = enumerator->Next(WBEM_INFINITE,
                             1L,
                             &memory,
                             &retcnt);
-        if (status == WBEM_S_FALSE) {
-            status = S_OK;
-            break;
+        if (retcnt == 0) {
+            break; 
         }
 
-        if (FAILED(status)) {
-            return FALSE;
-        }
-
-        status = memory->Get( L"AvailableBytes", 
+        status = memory->Get( L"PagesInputPerSec", 
                             0, 
                             &var_val, 
                             NULL, 
                             NULL );
-        if (FAILED(status)) {
-            return FALSE;
+        if (FAILED(status) || (var_val.vt == VT_NULL)) {
+            PrintMessage("Cannot get PagesInputPerSec"); 
+            var_val.vt =  -1; 
         }
-        if (var_val.vt != VT_NULL) {
-           pStat[idx].tag = VIRTIO_BALLOON_S_MEMFREE;
-           pStat[idx].val = (long)var_val;
-           idx++;
-        }
-        status = memory->Get( L"PageFaultsPerSec", 
+        pStat[idx].tag = VIRTIO_BALLOON_S_SWAP_IN;
+        pStat[idx].val = (long)var_val;
+        idx++;
+
+        status = memory->Get( L"PagesOutputPerSec", 
                             0, 
                             &var_val, 
                             NULL, 
                             NULL );
-        if (FAILED(status)) {
-            return FALSE;
-        }
-        if (var_val.vt != VT_NULL) {
-            pStat[idx].tag = VIRTIO_BALLOON_S_MINFLT;
-            pStat[idx].val = (long)var_val;
-            idx++;
+        if (FAILED(status) || (var_val.vt == VT_NULL)) {
+            PrintMessage("Cannot get PagesOutputPerSec"); 
+            var_val.vt =  -1; 
         }
+        pStat[idx].tag = VIRTIO_BALLOON_S_SWAP_OUT;
+        pStat[idx].val = (long)var_val;
+        idx++;
 
         status = memory->Get( L"PageReadsPerSec", 
                             0, 
                             &var_val, 
                             NULL, 
                             NULL );
-        if (FAILED(status)) {
-            return FALSE;
-        }
-        if (var_val.vt != VT_NULL) {
-            pStat[idx].tag = VIRTIO_BALLOON_S_MAJFLT;
-            pStat[idx].val = (long)var_val;
-            idx++;
-        }
+        if (FAILED(status) || (var_val.vt == VT_NULL)) {
+            PrintMessage("Cannot get PageReadsPerSec"); 
+            var_val.vt =  -1; 
+        } 
+        pStat[idx].tag = VIRTIO_BALLOON_S_MAJFLT;
+        pStat[idx].val = (long)var_val;
+        idx++;
 
-        status = memory->Get( L"PagesInputPerSec", 
+        status = memory->Get( L"PageFaultsPerSec", 
                             0, 
                             &var_val, 
                             NULL, 
                             NULL );
-        if (FAILED(status)) {
-            return FALSE;
-        }
-        if (var_val.vt != VT_NULL) {
-            pStat[idx].tag = VIRTIO_BALLOON_S_SWAP_IN;
-            pStat[idx].val = (long)var_val;
-            idx++;
+        if (FAILED(status) || (var_val.vt == VT_NULL)) {
+            PrintMessage("Cannot get PageFaultsPerSec"); 
+            var_val.vt =  -1; 
         }
+        pStat[idx].tag = VIRTIO_BALLOON_S_MINFLT;
+        pStat[idx].val = (long)var_val;
+        idx++;
 
-        status = memory->Get( L"PagesOutputPerSec", 
-                            0, 
-                            &var_val, 
-                            NULL, 
-                            NULL );
-        if (FAILED(status)) {
-            return FALSE;
-        }
-        if (var_val.vt != VT_NULL) {
-            pStat[idx].tag = VIRTIO_BALLOON_S_SWAP_OUT;
-            pStat[idx].val = (long)var_val;
-            idx++;
-        }
+        GlobalMemoryStatus(&stat);
 
-        pStat[idx].tag = VIRTIO_BALLOON_S_MEMTOT;
-        pStat[idx].val = 0xdeadbeef;
+        pStat[idx].tag = VIRTIO_BALLOON_S_MEMFREE;
+        pStat[idx].val = stat.dwAvailPhys;
+        idx++;
 
+        pStat[idx].tag = VIRTIO_BALLOON_S_MEMTOT;
+        pStat[idx].val = stat.dwTotalPhys;
     }
     return TRUE;
 }
diff --git a/Balloon/app/memstat.h b/Balloon/app/memstat.h
index bc66200..359a98f 100644
--- a/Balloon/app/memstat.h
+++ b/Balloon/app/memstat.h
@@ -12,7 +12,6 @@ public:
     CMemStat();
     ~CMemStat();
     BOOL Init();
-    HRESULT GetStat();
     BOOL GetStatus(PBALLOON_STAT pstat);
 private:
     BOOL initialized;
diff --git a/Balloon/app/service.cpp b/Balloon/app/service.cpp
index a067d92..2b1833a 100644
--- a/Balloon/app/service.cpp
+++ b/Balloon/app/service.cpp
@@ -1,8 +1,10 @@
 #include "service.h"
+#include "utils.h"
 
 CService::CService()
 {
     m_evTerminate = NULL;
+    m_evWakeUp = NULL;
     m_thHandle = NULL;
     m_bPauseService = FALSE;
     m_bRunningService = FALSE;
@@ -14,6 +16,7 @@ CService::CService()
 CService::~CService()
 {
     m_evTerminate = NULL;
+    m_evWakeUp = NULL;
     m_thHandle = NULL;
     m_bPauseService = FALSE;
     m_bRunningService = FALSE;
@@ -27,6 +30,23 @@ void __stdcall CService::HandlerThunk(CService*
service, DWORD ctlcode)
     service->ServiceCtrlHandler(ctlcode);
 }
 
+DWORD __stdcall CService::HandlerExThunk(CService* service, DWORD
ctlcode, DWORD evtype, PVOID evdata)
+{
+    switch (ctlcode) {
+
+    case SERVICE_CONTROL_DEVICEEVENT:
+    case SERVICE_CONTROL_HARDWAREPROFILECHANGE:
+        return service->ServiceHandleDeviceChange(evtype,
(_DEV_BROADCAST_HEADER*) evdata);
+
+    case SERVICE_CONTROL_POWEREVENT:
+        return service->ServiceHandlePowerEvent(evtype, (DWORD)
evdata);
+
+    default:
+        service->ServiceCtrlHandler(ctlcode);
+        return NO_ERROR;
+    }    
+}
+
 void __stdcall CService::ServiceMainThunk(CService* service, DWORD
argc, TCHAR* argv[])
 {
     service->ServiceMain(argc, argv);
@@ -45,6 +65,7 @@ BOOL CService::InitService()
                               &id);
 
     if (m_thHandle == NULL) {
+        PrintMessage("Cannot create thread"); 
         return FALSE;
     }
     m_bRunningService = TRUE;
@@ -60,14 +81,19 @@ DWORD WINAPI CService::ServiceThread(LPDWORD lParam)
 
 void CService::Run()
 {
-    HANDLE ev = CreateEvent(NULL, TRUE, FALSE, NULL);
     BALLOON_STAT stat[VIRTIO_BALLOON_S_NR];
-    DWORD res;
+    BOOL res;
+
     while (1) {
+        memset(stat, -1, sizeof(BALLOON_STAT) * VIRTIO_BALLOON_S_NR);
         if (m_pMemStat->GetStatus(stat)) {
-           if (!m_pDev->Write(stat, VIRTIO_BALLOON_S_NR, ev) &&
-              (GetLastError() == ERROR_IO_PENDING)) {
-              res = WaitForSingleObject(ev, 1000);
+           EnterCriticalSection(&m_scWrite);
+           res = m_pDev->Write(stat, VIRTIO_BALLOON_S_NR);
+           LeaveCriticalSection(&m_scWrite);
+           if (res && 
+              (WaitForSingleObject(m_evWakeUp, 1000) == WAIT_OBJECT_0))
{
+              ResetEvent(m_evWakeUp);
+              break;
            }
         }
     }
@@ -115,14 +141,31 @@ void CService::ResumeService()
 }
 
 void CService::PauseService()
-{
-    m_bPauseService = TRUE;
-    SuspendThread(m_thHandle);
+{   
+    BALLOON_STAT stat[VIRTIO_BALLOON_S_NR];
+    if (m_bRunningService && !m_bPauseService && m_pDev) {
+        memset(stat, -1, sizeof(BALLOON_STAT) * VIRTIO_BALLOON_S_NR);
+        EnterCriticalSection(&m_scWrite);
+        m_pDev->Write(stat, VIRTIO_BALLOON_S_NR);
+        m_bPauseService = TRUE;
+        SuspendThread(m_thHandle);
+        LeaveCriticalSection(&m_scWrite);
+    }
 }
 
 void CService::StopService()
 {
-    m_bRunningService = FALSE;
+    if (m_bRunningService && m_pDev) {
+        if (m_evWakeUp) {
+           SetEvent(m_evWakeUp);
+           if (WaitForSingleObject(m_thHandle, 1000) == WAIT_TIMEOUT) {
+              TerminateThread(m_thHandle, 0);
+           }
+        }
+        EnterCriticalSection(&m_scWrite);
+        m_bRunningService = FALSE;
+        LeaveCriticalSection(&m_scWrite);
+    }
     SetEvent(m_evTerminate);
 }
 
@@ -132,6 +175,12 @@ void CService::terminate(DWORD error)
         CloseHandle(m_evTerminate);
     }
 
+    if (m_evWakeUp) {
+        CloseHandle(m_evWakeUp);
+    }
+
+    DeleteCriticalSection(&m_scWrite);
+
     if (m_StatusHandle) {
         SendStatusToSCM(SERVICE_STOPPED, error, 0, 0, 0);
     }
@@ -199,6 +248,18 @@ void CService::ServiceCtrlHandler(DWORD
controlCode)
     SendStatusToSCM(currentState, NO_ERROR, 0, 0, 0);
 }
 
+DWORD CService::ServiceHandleDeviceChange(DWORD evtype,
_DEV_BROADCAST_HEADER* dbhdr)
+{
+    PrintMessage("ServiceHandleDeviceChange"); 
+    return NO_ERROR;
+}
+
+DWORD CService::ServiceHandlePowerEvent(DWORD evtype, DWORD flags)
+{
+    PrintMessage("ServiceHandlePowerEvent"); 
+    return NO_ERROR;
+}
+
 void CService::ServiceMain(DWORD argc, LPTSTR *argv)
 {
     BOOL res;
@@ -209,13 +270,13 @@ void CService::ServiceMain(DWORD argc, LPTSTR
*argv)
     }
 
     m_pMemStat = new CMemStat;
-    if(!m_pMemStat || !m_pMemStat->Init()) {
+    if (!m_pMemStat || !m_pMemStat->Init()) {
         terminate(GetLastError());
         return;
     }
 
     m_pDev = new CDevice;
-    if(!m_pDev || !m_pDev->Init()) {
+    if (!m_pDev || !m_pDev->Init()) {
         terminate(GetLastError());
         return;
     }
@@ -226,12 +287,20 @@ void CService::ServiceMain(DWORD argc, LPTSTR
*argv)
         return;
     }
 
-    m_evTerminate = CreateEvent (0, TRUE, FALSE, 0);
+    m_evTerminate = CreateEvent(NULL, TRUE, FALSE, NULL);
     if (!m_evTerminate) {
         terminate(GetLastError());
         return;
     }
 
+    m_evWakeUp = CreateEvent(NULL, TRUE, FALSE, NULL);
+    if (!m_evWakeUp) {
+        terminate(GetLastError());
+        return;
+    }
+
+    InitializeCriticalSection(&m_scWrite);
+
     res = SendStatusToSCM(SERVICE_START_PENDING, NO_ERROR, 0 , 2,
1000);
     if (!res) { 
         terminate(GetLastError());
diff --git a/Balloon/app/service.h b/Balloon/app/service.h
index 0bad757..5c5c9c3 100644
--- a/Balloon/app/service.h
+++ b/Balloon/app/service.h
@@ -2,6 +2,7 @@
 #define SERVICE_H
 
 #include <windows.h>
+#include <dbt.h>
 
 #include "memstat.h"
 #include "device.h"
@@ -15,6 +16,7 @@ public:
     BOOL InitService();
     void GetStatus(SC_HANDLE service);
     static void __stdcall HandlerThunk(CService* service, DWORD
ctlcode);
+    static DWORD __stdcall HandlerExThunk(CService* service, DWORD
ctlcode, DWORD evtype, PVOID evdata);
     static void __stdcall ServiceMainThunk(CService* service, DWORD
argc, TCHAR* argv[]);
     SERVICE_STATUS_HANDLE m_StatusHandle;
 
@@ -28,12 +30,15 @@ private:
     void terminate(DWORD error);
     void ServiceCtrlHandler(DWORD controlCode);
     void ServiceMain(DWORD argc, LPTSTR *argv);
+    DWORD ServiceHandleDeviceChange(DWORD evtype,
_DEV_BROADCAST_HEADER* dbhdr);
+    DWORD ServiceHandlePowerEvent(DWORD evtype, DWORD flags);
 
     HANDLE m_evTerminate;
+    HANDLE m_evWakeUp;
     HANDLE m_thHandle;
     BOOL   m_bPauseService;
     BOOL   m_bRunningService;
-
+    CRITICAL_SECTION m_scWrite;
     CMemStat* m_pMemStat;
     CDevice* m_pDev;
 
diff --git a/Balloon/app/sources b/Balloon/app/sources
index 839d8b1..77df20a 100644
--- a/Balloon/app/sources
+++ b/Balloon/app/sources
@@ -29,7 +29,6 @@ USE_VCCOM=1
 USE_ATL=1
 ATL_VER=71
 
-#INCLUDES=$(INCLUDES);$(DDK_INC_PATH);$(ATL_INC_PATH)
+INCLUDES = $(INCLUDES);..\sys
 
-#TARGET_DESTINATION=wdf
 
diff --git a/Balloon/app/utils.cpp b/Balloon/app/utils.cpp
index 5ce89b0..9e17137 100644
--- a/Balloon/app/utils.cpp
+++ b/Balloon/app/utils.cpp
@@ -45,24 +45,33 @@ void ErrorHandler(char *s, int err)
         printf("unknown error\n");
     }
 
-    FILE* pLog = fopen("server.log","a");
+    FILE* pLog = fopen("balloon.log","a");
     fprintf(pLog, "%s failed, error code = %d\n",s , err); 
     fclose(pLog);
 
     ExitProcess(err);
 }
 
+void PrintMessage(char *s)
+{
+#ifdef DBG
+    FILE* pLog = fopen("balloon.log", "a");
+    fprintf(pLog, "%s\n", s); 
+    fclose(pLog);
+#endif
+}
+
 void ShowUsage()
 {
     printf("\n");
     printf("USAGE:\n");
-    printf("server -i\tInstall service\n");
-    printf("server -u\tUninstall service\n");
-    printf("server -r\tRun service\n");
-    printf("server -s\tStop service\n");
-    printf("server -p\tPause service\n");
-    printf("server -c\tResume service\n");
-    printf("server status\tCurrent status\n");
+    printf("blnsvr -i\tInstall service\n");
+    printf("blnsvr -u\tUninstall service\n");
+    printf("blnsvr -r\tRun service\n");
+    printf("blnsvr -s\tStop service\n");
+    printf("blnsvr -p\tPause service\n");
+    printf("blnsvr -c\tResume service\n");
+    printf("blnsvr status\tCurrent status\n");
     printf("\n");
 }
 
@@ -123,7 +132,7 @@ BOOL UninstallService()
     BOOL res;
     SERVICE_STATUS status;
 
-    scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+    scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
     if (!scm) {
         ErrorHandler("OpenSCManager", GetLastError());
     }
@@ -144,7 +153,7 @@ BOOL UninstallService()
         if (!res) {
             ErrorHandler("ControlService", GetLastError());
         }
-        Sleep(500);
+        Sleep(5000);
     }
 
     res = DeleteService(service);
diff --git a/Balloon/app/utils.h b/Balloon/app/utils.h
index dd754cf..507e103 100644
--- a/Balloon/app/utils.h
+++ b/Balloon/app/utils.h
@@ -14,5 +14,6 @@ BOOL ServiceControl(int ctrl);
 
 void ShowUsage();
 void ErrorHandler(char *s, int err);
+void PrintMessage(char *s);
 
 #endif
diff --git a/Balloon/app/public.h b/Balloon/sys/public.h
similarity index 100%
rename from Balloon/app/public.h
rename to Balloon/sys/public.h

--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to