How to dynamically unload a driver.

I want to load and unload a driver dynamically. For this i am using
ZwLoadDriver and ZwUnloadDriver. This is what was suggested. Now i have
problems with this api. This works fine on Win 2K, but on XP it returns
STATUS_INVALID_DEVICE_REQUEST. In my driver i do not have entry points only
for create close, deviceIoControl and Unload.

What is more required for me to unload this driver? Do i need plug and play
handlers to the driver being unloaded?
Or, Should i need to use any other api instead of ZwUnloadDriver for
unloading the driver?
Or, loading and unloading a driver dynamically is not possible on XP?

any help, any pointers are really appreciated.
Thanks,
Srin.

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);
}

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

You are setting the DO_VERIFY_VOLUME flag. Take this is a hint.

----- Original Message -----
From:
To: “NT Developers Interest List”
Sent: Friday, January 10, 2003 2:26 AM
Subject: [ntdev] Re: How to dynamically unload a driver.

> 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
>
>
> —
> You are currently subscribed to ntdev as: xxxxx@compaqnet.be
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>

DO_VERIFY_VOLUME is meaningless for driver objects - it’s a device
object flag.

The flag he’s clearing is DRVO_LEGACY_DRIVER. They happen to have the
same bit value though :slight_smile:

-p

-----Original Message-----
From: Christiaan Ghijselinck [mailto:xxxxx@CompaqNet.be]
Sent: Thursday, January 09, 2003 10:42 PM
To: NT Developers Interest List

You are setting the DO_VERIFY_VOLUME flag. Take this is a hint.

----- Original Message -----
From:
To: “NT Developers Interest List”
Sent: Friday, January 10, 2003 2:26 AM
Subject: [ntdev] Re: How to dynamically unload a driver.

> 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
>
>
> —
> You are currently subscribed to ntdev as: xxxxx@compaqnet.be
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>


You are currently subscribed to ntdev as: xxxxx@microsoft.com
To unsubscribe send a blank email to xxxxx@lists.osr.com

I am not clearing, I am setting the flag. :slight_smile:

-Srin.

-----Original Message-----
From: Peter Wieland [mailto:xxxxx@windows.microsoft.com]
Sent: Friday, January 10, 2003 8:43 AM
To: NT Developers Interest List
Subject: [ntdev] Re: How to dynamically unload a driver.

DO_VERIFY_VOLUME is meaningless for driver objects - it’s a device
object flag.

The flag he’s clearing is DRVO_LEGACY_DRIVER. They happen to have the
same bit value though :slight_smile:

-p

-----Original Message-----
From: Christiaan Ghijselinck [mailto:xxxxx@CompaqNet.be]
Sent: Thursday, January 09, 2003 10:42 PM
To: NT Developers Interest List

You are setting the DO_VERIFY_VOLUME flag. Take this is a hint.

----- Original Message -----
From:
To: “NT Developers Interest List”
Sent: Friday, January 10, 2003 2:26 AM
Subject: [ntdev] Re: How to dynamically unload a driver.

> 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
>
>
> —
> You are currently subscribed to ntdev as: xxxxx@compaqnet.be
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>


You are currently subscribed to ntdev as: xxxxx@microsoft.com
To unsubscribe send a blank email to xxxxx@lists.osr.com


You are currently subscribed to ntdev as: xxxxx@nai.com
To unsubscribe send a blank email to xxxxx@lists.osr.com

Thanks Peter,

I knew I was wrong: the name didn’t make sense in the context of unloading
a driver. I was mislead by the fact that I’ve never seen an access of the
“Flags” entry of a DriverObject within a Driver. But why does behave XP
different from W2K ? Srin Kumar stated that XP returned
STATUS_INVALID_DEVICE_REQUEST within XP.

I hope I can invite you to react once more.

Thanks Peter,

I knew I was wrong ; the name didn’t make sence in the context of unloading
a driver.
By the way, why does behave XP different from W2K ? Srin Kumar stated that
XP returned
STATUS_INVALID_DEVICE_REQUEST within XP. I hope I can invite you to react
once
more.

----- Original Message -----
From: “Peter Wieland”
To: “NT Developers Interest List”
Sent: Friday, January 10, 2003 5:43 PM
Subject: [ntdev] Re: How to dynamically unload a driver.

> DO_VERIFY_VOLUME is meaningless for driver objects - it’s a device
> object flag.
>
> The flag he’s clearing is DRVO_LEGACY_DRIVER. They happen to have the
> same bit value though :slight_smile:
>
> -p
>
> -----Original Message-----
> From: Christiaan Ghijselinck [mailto:xxxxx@CompaqNet.be]
> Sent: Thursday, January 09, 2003 10:42 PM
> To: NT Developers Interest List
>
>
>
> You are setting the DO_VERIFY_VOLUME flag. Take this is a hint.
>
>
> ----- Original Message -----
> From:
> To: “NT Developers Interest List”
> Sent: Friday, January 10, 2003 2:26 AM
> Subject: [ntdev] Re: How to dynamically unload a driver.
>
>
> > 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.
> >
> >
> > —
> > You are currently subscribed to ntdev as: xxxxx@nai.com
> > To unsubscribe send a blank email to xxxxx@lists.osr.com
> >
> >
> > —
> > You are currently subscribed to ntdev as: xxxxx@compaqnet.be
> > To unsubscribe send a blank email to xxxxx@lists.osr.com
> >
>
>
>
> —
> You are currently subscribed to ntdev as: xxxxx@microsoft.com
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>
>
>
>
> —
> You are currently subscribed to ntdev as: xxxxx@compaqnet.be
> To unsubscribe send a blank email to xxxxx@lists.osr.com
>