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