I load and unload from another driver, so i can not use there routines.
I found a work around. In driver entry if i or the DriverObject->Flags with
0x02.
the driver gets unloaded.
Thanks any way for listening.
-Srin.
-----Original Message-----
From: Hardwired [mailto:xxxxx@rdslink.ro]
Sent: Thursday, January 09, 2003 2:36 PM
To: NT Developers Interest List
Subject: [ntdev] Re: How to dynamically unload a driver.
Hello,
Is there any problem in using this routines: OpenSCManager(…),
CreateService(…),CloseServiceHandle(…) for installing and …,
DeleteService(…), … for unsinstalling? I just noticed that no
one talkes about these routines.
here is a piece of code which is tested and works:
// install the driver:
void CDummyDlg::OnButtonInstall()
{
SC_HANDLE svc_manager = OpenSCManager( NULL, NULL, GENERIC_WRITE);
if( 0 == svc_manager )
{
TRACE(_T(“Error on opening ServiceManager!!!\n”));
return;
}
SC_HANDLE svc = CreateService(svc_manager, SERVICE_NAME,
SERVICE_DISPLAY,
SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
SERVICE_PATH,
NULL, NULL, NULL, NULL, NULL);
if( 0 == svc )
{
char buf[200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0,
buf, sizeof(buf), 0);
TRACE(_T(“Error on CreateService : %s\n”), buf);
CloseServiceHandle(svc_manager);
return;
}
if( svc )
CloseServiceHandle(svc);
if( svc_manager )
CloseServiceHandle(svc_manager);
TRACE(_T(“Driver Service Installed!\n”));
}
// Delete the driver
void CDummyDlg::OnButtonDelete()
{
SC_HANDLE svc_manager = OpenSCManager( NULL, NULL, GENERIC_WRITE);
if( 0 == svc_manager )
{
TRACE(_T(“Error on opening ServiceManager!!!\n”));
return;
}
SC_HANDLE svc = OpenService(svc_manager, SERVICE_NAME,
SERVICE_ALL_ACCESS);
if( svc )
{
if( FALSE == ::DeleteService(svc) )
{
char buf[200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(),
0, buf, sizeof(buf), 0);
MessageBox( buf, “Error” );
TRACE(_T(“Error on DeleteService : %s\n”), buf);
CloseServiceHandle(svc);
CloseServiceHandle(svc_manager);
return;
}
else
{
TRACE(_T(“Driver Service Deleted!\n”));
}
}
if( svc )
CloseServiceHandle(svc);
if( svc_manager )
CloseServiceHandle(svc_manager);
}
//Start the Driver
void CDummyDlg::OnButtonStart()
{
SC_HANDLE svc_manager = OpenSCManager( NULL, NULL, GENERIC_EXECUTE);
if( 0 == svc_manager )
{
TRACE(_T(“Error on opening ServiceManager!!!\n”));
return;
}
SC_HANDLE svc = OpenService(svc_manager, SERVICE_NAME,
SERVICE_ALL_ACCESS);
if( svc )
{
if( 0 == StartService(svc, NULL, NULL) )
{
char buf[200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(),
0, buf, sizeof(buf), 0);
TRACE(_T(“Error on StartService : %s\n”), buf);
CloseServiceHandle(svc_manager);
return;
}
}
if( svc )
CloseServiceHandle(svc);
if( svc_manager )
CloseServiceHandle(svc_manager);
TRACE(_T(“Driver Service Started!\n”));
}
//Stop the driver
void CDummyDlg::OnButtonStop()
{
SC_HANDLE svc_manager = OpenSCManager( NULL, NULL, GENERIC_EXECUTE);
if( 0 == svc_manager )
{
TRACE(_T(“Error on opening ServiceManager!!!\n”));
return;
}
SC_HANDLE svc = OpenService(svc_manager, SERVICE_NAME,
SERVICE_ALL_ACCESS);
if( svc )
{
SERVICE_STATUS svc_status;
if( FALSE == ControlService(svc, SERVICE_CONTROL_STOP,
&svc_status) ){
char buf[200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0,
buf, sizeof(buf), 0);
TRACE(_T(“Error on StopService : %s\n”), buf);
CloseServiceHandle(svc_manager);
return;
}
}
if( svc )
CloseServiceHandle(svc);
if( svc_manager )
CloseServiceHandle(svc_manager);
}
You are currently subscribed to ntdev as: xxxxx@nai.com
To unsubscribe send a blank email to xxxxx@lists.osr.com