Thanks, I found the problem:
I was calling the below function to edit service description (which
TServiceApplication cannot do automatically) in OnStart of the
service!
BOOL ReconfigureService(BOOL fDisable, LPSTR lpDesc, const String
&serviceName) // from
//
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/opening_an_scmanager_database.asp
// and
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/changing_a_service_configuration.asp
{
SC_LOCK sclLock;
LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf;
SERVICE_DESCRIPTION sdBuf;
DWORD dwBytesNeeded, dwStartType;
BOOL bSuccess=TRUE;
SC_HANDLE schSCManager;
SC_HANDLE schService;
// Open a handle to the SC Manager database.
schSCManager = OpenSCManager(
NULL,// local machine
NULL,// ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if(NULL == schSCManager)
return false;
// Need to acquire database lock before reconfiguring.
sclLock = LockServiceDatabase(schSCManager);
// If the database cannot be locked, report the details.
if (sclLock == NULL)
{
// Exit if the database is not locked by another process.
if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)
{
// printf("LockServiceDatabase failed (%d)\n", GetLastError());
return FALSE;
}
// Allocate a buffer to get details about the lock.
lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc(
LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256);
if (lpqslsBuf == NULL)
{
// printf("LocalAlloc failed (%d)\n", GetLastError());
return FALSE;
}
// Get and print the lock status information.
if (!QueryServiceLockStatus(
schSCManager,
lpqslsBuf,
sizeof(QUERY_SERVICE_LOCK_STATUS)+256,
&dwBytesNeeded) )
{
// printf("QueryServiceLockStatus failed (%d)", GetLastError());
return FALSE;
}
//if (lpqslsBuf->fIsLocked)
// printf("Locked by: %s, duration: %d seconds\n",
//lpqslsBuf->lpLockOwner,
//lpqslsBuf->dwLockDuration);
//else
// printf("No longer locked\n");
LocalFree(lpqslsBuf);
}
// The database is locked, so it is safe to make changes.
// Open a handle to the service.
schService = OpenService(
schSCManager, // SCManager database
serviceName.c_str(), // name of service
SERVICE_CHANGE_CONFIG); // need CHANGE access
if (schService == NULL)
{
// printf("OpenService failed (%d)\n", GetLastError());
return FALSE;
}
dwStartType = SERVICE_AUTO_START; //(fDisable) ? SERVICE_DISABLED
: SERVICE_DEMAND_START;
// Make the changes.
if (! ChangeServiceConfig(
schService,// handle of service
SERVICE_NO_CHANGE, // service type: no change
dwStartType, // change service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) )// display name: no change
{
// printf("ChangeServiceConfig failed (%d)\n", GetLastError());
bSuccess = FALSE;
}
else
// printf("ChangeServiceConfig succeeded.\n");
sdBuf.lpDescription = lpDesc;
if( !ChangeServiceConfig2(
schService, // handle to service
SERVICE_CONFIG_DESCRIPTION, // change: description
&sdBuf) ) // value: new description
{
// printf("ChangeServiceConfig2 failed\n");
bSuccess = FALSE;
}
else
// printf("ChangeServiceConfig2 succeeded\n");
// Release the database lock.
UnlockServiceDatabase(sclLock);
// Close the handle to the service.
CloseServiceHandle(schService);
return bSuccess;
}
//---
It simply got the service hanging during system boot if service type
was auto. Just FYI.
BTW, the function is useful in adding the description but it should be
called after install or a few mins.
Best Regards,
SZ
On 12/13/06, Arno Garrels <[EMAIL PROTECTED]> wrote:
> Fastream Technologies wrote:
> > Hello,
> >
> > Our clients using Windows 2003 complain that the lastest beta is
> > causing hangs during boot up and then reboots and goes into a loop.
> > This is a HTTP/FTP server installed as system service and running with
> > administrative rights. It depends only to Tcpip. I noticed tha