How do you programmatically force setupdi to load a particular driver

I believe setting DI_ENUMSINGLEINF but not setting the path to the INF is
going to be a problem.

0xE000020A is ERROR_NO_INF from SETUPAPI.H

Good Luck,
Dave Cattley

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 11:06 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Below is the code I am working with. The problem I am having is that I am
getting back 0xe000020a from the line with **** after it. That is what I
am exploring now… BTW, what the heck is 0xe000020a?

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

DebugBreak();
//
// Create an empty device information list.
//
DeviceInfoSet =
SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PRESENT,NULL,NULL,
NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,0,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS |
DI_FLAGSEX_FILTERSIMILARDRIVERS;

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installPara
ms)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRI
VER)) { ******
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);

if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

Replace1394BusDriverExit:
return result;

}
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 10:40 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

I share your sense of numbness whenever I try to read the SetupDi
documentation to gather any useful insight. I am sure it makes sense to
*somebody*.

When you call SetupDiBuildDriverInfoList() you can pass it a DeviceInfoData
structure. That DeviceInfoData structure in this case we want to be the
DeviceInfoData for the device you are trying to update the driver for.

One of the things you can do *to* that DeviceInfoData is to call
SetupDiSetDeviceInstallParams() to modify the SP_DEVICEINSTALL_PARAMS Flags,
FlagsEx, and DriverPath.

If you do a SetupDiGetDeviceInstallParams() to get the current values and
then modify them by setting

DriverPath to your INF file
Flags |= DI_ENUMSINGLEINF
FlagsEx |= DIF_FLAGSEX_ALLOWEXCLUDEDDRVS | DIF_FLAGSEX_FILTERSIMILARDRIVERS

Then call SetupDiSetDeviceInstallParams() to set those values back.

Then call SetupDiBuildDriverInfoList() and specify the DeviceInfoData for
that device.

And maybe SetupDi will play along and load the driver data only for your
driver.

And if you tried all that and I am just not understanding your current state
of affairs, I would conclude I have no idea what to do next.

I hope this helps.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

In your posted code I only see you working with the first found
DeviceInfoData (device) in the list.

Do you somewhere else enumerate the entire DeviceInfoSet using
SetupDiEnumDeviceInfo() to find the device of interest?

I think Bob noted in his outline that the operation (schematically) is:

  1. Find (all) devices.
  2. Enumerate to find your device removing those that don’t interest you.
  3. Set the install parameters.
  4. Enumerate drivers.
  5. Call class installer.

Or something similar.

Cheers,
Dave Cattley

I originally had an outer loop, but I was only getting back 1 1394 OHCI
driver (the installed driver), so I just removed it. I just don’t see
this thing enumerating everything in the INF file, so that is what I am
trying to figure out now…

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 11:44 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

In your posted code I only see you working with the first found
DeviceInfoData (device) in the list.

Do you somewhere else enumerate the entire DeviceInfoSet using
SetupDiEnumDeviceInfo() to find the device of interest?

I think Bob noted in his outline that the operation (schematically) is:

  1. Find (all) devices.
  2. Enumerate to find your device removing those that don’t interest you.
  3. Set the install parameters.
  4. Enumerate drivers.
  5. Call class installer.

Or something similar.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

Mark,

Well I would say it’s an error and it’s a customer defined error code, at
least that’s what the three upper bits say. Have you defined any error
codes, or use a third party lib that defines them? Do you even use MC to
compile them?

Gary G. Little
H (952) 223-1349
C (952) 454-4629
xxxxx@comcast.net

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 10:06 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Below is the code I am working with. The problem I am having is that I am
getting back 0xe000020a from the line with **** after it. That is what I
am exploring now… BTW, what the heck is 0xe000020a?

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

DebugBreak();
//
// Create an empty device information list.
//
DeviceInfoSet =
SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PRESENT,NULL,NULL,
NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,0,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS |
DI_FLAGSEX_FILTERSIMILARDRIVERS;

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installPara
ms)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRI
VER)) { ******
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);

if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

Replace1394BusDriverExit:
return result;

}
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 10:40 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

I share your sense of numbness whenever I try to read the SetupDi
documentation to gather any useful insight. I am sure it makes sense to
*somebody*.

When you call SetupDiBuildDriverInfoList() you can pass it a DeviceInfoData
structure. That DeviceInfoData structure in this case we want to be the
DeviceInfoData for the device you are trying to update the driver for.

One of the things you can do *to* that DeviceInfoData is to call
SetupDiSetDeviceInstallParams() to modify the SP_DEVICEINSTALL_PARAMS Flags,
FlagsEx, and DriverPath.

If you do a SetupDiGetDeviceInstallParams() to get the current values and
then modify them by setting

DriverPath to your INF file
Flags |= DI_ENUMSINGLEINF
FlagsEx |= DIF_FLAGSEX_ALLOWEXCLUDEDDRVS | DIF_FLAGSEX_FILTERSIMILARDRIVERS

Then call SetupDiSetDeviceInstallParams() to set those values back.

Then call SetupDiBuildDriverInfoList() and specify the DeviceInfoData for
that device.

And maybe SetupDi will play along and load the driver data only for your
driver.

And if you tried all that and I am just not understanding your current state
of affairs, I would conclude I have no idea what to do next.

I hope this helps.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

This was sent to soon …

I did do a search on the error code and it does pop up in Bing with this
link:
http://stackoverflow.com/questions/1438371/win32-api-function-to-programatic
ally-enable-disable-device

Following that, it looks to be an error code defined by SetupApiError, and
it means “NoInf” as defined in the code example, which is written in C#.

Gary G. Little
H (952) 223-1349
C (952) 454-4629
xxxxx@comcast.net

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 10:06 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Below is the code I am working with. The problem I am having is that I am
getting back 0xe000020a from the line with **** after it. That is what I
am exploring now… BTW, what the heck is 0xe000020a?

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

DebugBreak();
//
// Create an empty device information list.
//
DeviceInfoSet =
SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PRESENT,NULL,NULL,
NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,0,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS |
DI_FLAGSEX_FILTERSIMILARDRIVERS;

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installPara
ms)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRI
VER)) { ******
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);

if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

Replace1394BusDriverExit:
return result;

}
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 10:40 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

I share your sense of numbness whenever I try to read the SetupDi
documentation to gather any useful insight. I am sure it makes sense to
*somebody*.

When you call SetupDiBuildDriverInfoList() you can pass it a DeviceInfoData
structure. That DeviceInfoData structure in this case we want to be the
DeviceInfoData for the device you are trying to update the driver for.

One of the things you can do *to* that DeviceInfoData is to call
SetupDiSetDeviceInstallParams() to modify the SP_DEVICEINSTALL_PARAMS Flags,
FlagsEx, and DriverPath.

If you do a SetupDiGetDeviceInstallParams() to get the current values and
then modify them by setting

DriverPath to your INF file
Flags |= DI_ENUMSINGLEINF
FlagsEx |= DIF_FLAGSEX_ALLOWEXCLUDEDDRVS | DIF_FLAGSEX_FILTERSIMILARDRIVERS

Then call SetupDiSetDeviceInstallParams() to set those values back.

Then call SetupDiBuildDriverInfoList() and specify the DeviceInfoData for
that device.

And maybe SetupDi will play along and load the driver data only for your
driver.

And if you tried all that and I am just not understanding your current state
of affairs, I would conclude I have no idea what to do next.

I hope this helps.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Gary G. Little
Sent: Friday, October 15, 2010 11:50 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Mark,

Well I would say it’s an error and it’s a customer defined error code, at
least that’s what the three upper bits say. Have you defined any error
codes, or use a third party lib that defines them? Do you even use MC to
compile them?

Gary G. Little
H (952) 223-1349
C (952) 454-4629
xxxxx@comcast.net

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 10:06 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Below is the code I am working with. The problem I am having is that I am
getting back 0xe000020a from the line with **** after it. That is what I
am exploring now… BTW, what the heck is 0xe000020a?

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

DebugBreak();
//
// Create an empty device information list.
//
DeviceInfoSet =
SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PRESENT,NULL,NULL,
NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,0,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS |
DI_FLAGSEX_FILTERSIMILARDRIVERS;

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installPara
ms)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRI
VER)) { ******
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);

if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

Replace1394BusDriverExit:
return result;

}
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 10:40 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

I share your sense of numbness whenever I try to read the SetupDi
documentation to gather any useful insight. I am sure it makes sense to
*somebody*.

When you call SetupDiBuildDriverInfoList() you can pass it a DeviceInfoData
structure. That DeviceInfoData structure in this case we want to be the
DeviceInfoData for the device you are trying to update the driver for.

One of the things you can do *to* that DeviceInfoData is to call
SetupDiSetDeviceInstallParams() to modify the SP_DEVICEINSTALL_PARAMS Flags,
FlagsEx, and DriverPath.

If you do a SetupDiGetDeviceInstallParams() to get the current values and
then modify them by setting

DriverPath to your INF file
Flags |= DI_ENUMSINGLEINF
FlagsEx |= DIF_FLAGSEX_ALLOWEXCLUDEDDRVS | DIF_FLAGSEX_FILTERSIMILARDRIVERS

Then call SetupDiSetDeviceInstallParams() to set those values back.

Then call SetupDiBuildDriverInfoList() and specify the DeviceInfoData for
that device.

And maybe SetupDi will play along and load the driver data only for your
driver.

And if you tried all that and I am just not understanding your current state
of affairs, I would conclude I have no idea what to do next.

I hope this helps.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

I generally search for the last 3 or 4 characters only.
I also will look at the last 3 ‘hex’ values and convert to decimal and
search for that at times.

A comprehensive error value list produced after all of the pre-processing
would be nice :). Something to extend the osronline error lookup widget.

Dave Cattley

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of
xxxxx@gmail.com
Sent: Friday, October 15, 2010 12:04 PM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Gary G. Little
Sent: Friday, October 15, 2010 11:50 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Mark,

Well I would say it’s an error and it’s a customer defined error code, at
least that’s what the three upper bits say. Have you defined any error
codes, or use a third party lib that defines them? Do you even use MC to
compile them?

Gary G. Little
H (952) 223-1349
C (952) 454-4629
xxxxx@comcast.net

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 10:06 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

Below is the code I am working with. The problem I am having is that I am
getting back 0xe000020a from the line with **** after it. That is what I
am exploring now… BTW, what the heck is 0xe000020a?

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

DebugBreak();
//
// Create an empty device information list.
//
DeviceInfoSet =
SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PRESENT,NULL,NULL,
NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,0,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS |
DI_FLAGSEX_FILTERSIMILARDRIVERS;

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installPara
ms)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRI
VER)) { ******
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);

if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

Replace1394BusDriverExit:
return result;

}
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 10:40 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a
particular driver

I share your sense of numbness whenever I try to read the SetupDi
documentation to gather any useful insight. I am sure it makes sense to
*somebody*.

When you call SetupDiBuildDriverInfoList() you can pass it a DeviceInfoData
structure. That DeviceInfoData structure in this case we want to be the
DeviceInfoData for the device you are trying to update the driver for.

One of the things you can do *to* that DeviceInfoData is to call
SetupDiSetDeviceInstallParams() to modify the SP_DEVICEINSTALL_PARAMS Flags,
FlagsEx, and DriverPath.

If you do a SetupDiGetDeviceInstallParams() to get the current values and
then modify them by setting

DriverPath to your INF file
Flags |= DI_ENUMSINGLEINF
FlagsEx |= DIF_FLAGSEX_ALLOWEXCLUDEDDRVS | DIF_FLAGSEX_FILTERSIMILARDRIVERS

Then call SetupDiSetDeviceInstallParams() to set those values back.

Then call SetupDiBuildDriverInfoList() and specify the DeviceInfoData for
that device.

And maybe SetupDi will play along and load the driver data only for your
driver.

And if you tried all that and I am just not understanding your current state
of affairs, I would conclude I have no idea what to do next.

I hope this helps.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

Just to be complete I added back the outer loop. With this code, I am only getting information on the loaded device and nothing listed from the INF file. Now you know why I stick to drivers…

I guess I know what I will be doing all weekend…

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD index = 0;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

//
// Create an empty device information list.
//
DeviceInfoSet = SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PROFILE,NULL,NULL,NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
_tprintf(_T(“Outter Loop: index:%d\n”),index);
DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,index,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_APPENDDRIVERLIST | DI_FLAGSEX_DIDCOMPATINFO;
wcscpy_s(installParams.DriverPath,SIZECHARS(installParams.DriverPath),
TEXT(“C:\WINDOWS\INF\1394.INF”));

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installParams)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRIVER)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
_tprintf(_T(“Inner Loop: index:%d, memberIndex:%d\n”),index,memberIndex);
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
break;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

index++;
}
Replace1394BusDriverExit:
return result;

}

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 12:11 PM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

I generally search for the last 3 or 4 characters only.
I also will look at the last 3 ‘hex’ values and convert to decimal and search for that at times.

A comprehensive error value list produced after all of the pre-processing
would be nice :). Something to extend the osronline error lookup widget.

Dave Cattley

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@gmail.com
Sent: Friday, October 15, 2010 12:04 PM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Gary G. Little
Sent: Friday, October 15, 2010 11:50 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

Mark,

Well I would say it’s an error and it’s a customer defined error code, at least that’s what the three upper bits say. Have you defined any error codes, or use a third party lib that defines them? Do you even use MC to compile them?

Gary G. Little
H (952) 223-1349
C (952) 454-4629
xxxxx@comcast.net

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 10:06 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

Below is the code I am working with. The problem I am having is that I am
getting back 0xe000020a from the line with **** after it. That is what I
am exploring now… BTW, what the heck is 0xe000020a?

int Replace1394BusDriver()
{
DWORD Err = NO_ERROR;
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVINFO_DATA DeviceInfoData1;
DWORD Reboot = false;
int result = EXIT_FAIL;
DWORD memberIndex = 0;
SP_DEVINSTALL_PARAMS installParams;

memset(&installParams,0,sizeof(installParams));

DebugBreak();
//
// Create an empty device information list.
//
DeviceInfoSet =
SetupDiGetClassDevsEx(&GUID_DEVCLASS_1394,NULL,NULL,DIGCF_PRESENT,NULL,NULL,
NULL);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if(!SetupDiEnumDeviceInfo(DeviceInfoSet,0,&DeviceInfoData)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

//
// We got information about a member in the 1394 class, let’s
// see if it is the legacy driver.
//
DumpDevice(DeviceInfoSet,&DeviceInfoData);

installParams.cbSize = sizeof(installParams);
installParams.Flags = DI_ENUMSINGLEINF;
installParams.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS | DI_FLAGSEX_FILTERSIMILARDRIVERS;

if(!SetupDiSetDeviceInstallParams(DeviceInfoSet,&DeviceInfoData,&installPara
ms)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

if(!SetupDiBuildDriverInfoList(DeviceInfoSet,&DeviceInfoData,SPDIT_COMPATDRI
VER)) { ******
Err = GetLastError();
goto Replace1394BusDriverExit;
}

while(TRUE) {
DeviceInfoData1.cbSize = sizeof(DeviceInfoData1);

if(!SetupDiEnumDeviceInfo(DeviceInfoSet,memberIndex,&DeviceInfoData1)) {
Err = GetLastError();
goto Replace1394BusDriverExit;
}

DumpDevice(DeviceInfoSet,&DeviceInfoData1);

memberIndex++;
}

Replace1394BusDriverExit:
return result;

}
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of David R. Cattley
Sent: Friday, October 15, 2010 10:40 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

I share your sense of numbness whenever I try to read the SetupDi documentation to gather any useful insight. I am sure it makes sense to *somebody*.

When you call SetupDiBuildDriverInfoList() you can pass it a DeviceInfoData
structure. That DeviceInfoData structure in this case we want to be the
DeviceInfoData for the device you are trying to update the driver for.

One of the things you can do *to* that DeviceInfoData is to call
SetupDiSetDeviceInstallParams() to modify the SP_DEVICEINSTALL_PARAMS Flags, FlagsEx, and DriverPath.

If you do a SetupDiGetDeviceInstallParams() to get the current values and then modify them by setting

DriverPath to your INF file
Flags |= DI_ENUMSINGLEINF
FlagsEx |= DIF_FLAGSEX_ALLOWEXCLUDEDDRVS | DIF_FLAGSEX_FILTERSIMILARDRIVERS

Then call SetupDiSetDeviceInstallParams() to set those values back.

Then call SetupDiBuildDriverInfoList() and specify the DeviceInfoData for that device.

And maybe SetupDi will play along and load the driver data only for your driver.

And if you tried all that and I am just not understanding your current state of affairs, I would conclude I have no idea what to do next.

I hope this helps.

Cheers,
Dave Cattley


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

xxxxx@gmail.com wrote:

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

The infinitely useful “err” tool saves the day:

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>err e000020a

for hex 0xe000020a / decimal -536870390 :

ERROR_NO_INF setupapi.h

1 matches found for “e000020a”

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>


Tim Roberts, xxxxx@probo.com
Providenza & Boekelheide, Inc.

My sincere apologies, Mark- that obviously wasn’t good advice on my part. What you’re describing is not what I expected, either.

If I myself get something useful before you’ve solved your problem, I’ll reply back with it.

Here’s an interesting tidbit… If you do “devcon drivernodes =1394” then you will get a listing of all the 1394 drivers. So the question can I get windows to install a particular driver from this list…

D:\WinDDK\7600.16385.0\tools\devcon\amd64>devcon drivernodes =1394
PCI\VEN_104C&DEV_8024&SUBSYS_00000000&REV_00\4&2966AB86&0&30A4
Name: Texas Instruments 1394 OHCI Compliant Host Controller
Driver node #0:
Inf file is C:\Windows\INF\1394.inf
Inf section is Generic.Install
Driver description is 1394 OHCI Compliant Host Controller
Manufacturer name is 1394 OHCI Compliant Host Controller
Provider name is Microsoft
Driver date is 6/21/2006
Driver version is 6.1.7600.16385
Driver node rank is 16719875
Driver node flags are 00102044
Inf is digitally signed
Driver node #1:
Inf file is C:\Windows\INF\1394.inf
Inf section is Legacy.Install
Driver description is 1394 OHCI Compliant Host Controller (Legacy)
Manufacturer name is 1394 OHCI Compliant Host Controller (Legacy)
Provider name is Microsoft
Driver date is 6/21/2006
Driver version is 6.1.7600.16385
Driver node rank is 16719875
Driver node flags are 00102044
Inf is digitally signed
Driver node #2:
Inf file is C:\Windows\INF\1394.inf
Inf section is Generic.Install
Driver description is Texas Instruments 1394 OHCI Compliant Host Controller
Manufacturer name is Texas Instruments
Provider name is Microsoft
Driver date is 6/21/2006
Driver version is 6.1.7600.16385
Driver node rank is 16719872
Driver node flags are 00142044
Inf is digitally signed
1 matching device(s) found.

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Tim Roberts
Sent: Friday, October 15, 2010 1:33 PM
To: Windows System Software Devs Interest List
Subject: Re: [ntdev] How do you programmatically force setupdi to load a particular driver

xxxxx@gmail.com wrote:

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

The infinitely useful “err” tool saves the day:

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>err e000020a # for hex 0xe000020a / decimal -536870390 :
ERROR_NO_INF setupapi.h

1 matches found for “e000020a”

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>


Tim Roberts, xxxxx@probo.com
Providenza & Boekelheide, Inc.


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Okay after figuring out what “devcon drivernodes” is doing, I have my code finding the driver node that I want to install. Unfortunately I can’t get the switch to occur. I have tried SetupDiSetDriverinstallparams and SetupDiSetSelectedDriver. Is there anything else special you have to do to make this work?

–Mark

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Tim Roberts
Sent: Friday, October 15, 2010 1:33 PM
To: Windows System Software Devs Interest List
Subject: Re: [ntdev] How do you programmatically force setupdi to load a particular driver

xxxxx@gmail.com wrote:

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

The infinitely useful “err” tool saves the day:

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>err e000020a # for hex 0xe000020a / decimal -536870390 :
ERROR_NO_INF setupapi.h

1 matches found for “e000020a”

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>


Tim Roberts, xxxxx@probo.com
Providenza & Boekelheide, Inc.


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Well, after a weekend of working on this problem, I am no closer to finding a solution. If anyone has any insights on how to solve this problem, I’d really appreciate it. It must be possible since the update driver wizard can do it, but I haven’t been able to duplicate what it does programmatically.

What a waste of a nice weekend…

–Mark

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 4:14 PM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

Okay after figuring out what “devcon drivernodes” is doing, I have my code finding the driver node that I want to install. Unfortunately I can’t get the switch to occur. I have tried SetupDiSetDriverinstallparams and SetupDiSetSelectedDriver. Is there anything else special you have to do to make this work?

–Mark

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Tim Roberts
Sent: Friday, October 15, 2010 1:33 PM
To: Windows System Software Devs Interest List
Subject: Re: [ntdev] How do you programmatically force setupdi to load a particular driver

xxxxx@gmail.com wrote:

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

The infinitely useful “err” tool saves the day:

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>err e000020a # for hex 0xe000020a / decimal -536870390 :
ERROR_NO_INF setupapi.h

1 matches found for “e000020a”

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>


Tim Roberts, xxxxx@probo.com
Providenza & Boekelheide, Inc.


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Well here is my last update on this.

After struggling to figure out a way to do this nicely, I decided to do it by brute force. While my solution works and is fine for me, I would not recommend it. What I did was create a .INF file containing the information that described the exact software/driver I wanted installed, copied the drivers that I needed for the INF file into the local directory I was doing the install from and then called UpdateDriverForPlgAndPlayDevices. I really wish that I could have figured out how to tell setupdi that I wanted to do an update from a particular manufacturer in the INF file…

–Mark Cariddi

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Monday, October 18, 2010 11:23 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

Well, after a weekend of working on this problem, I am no closer to finding a solution. If anyone has any insights on how to solve this problem, I’d really appreciate it. It must be possible since the update driver wizard can do it, but I haven’t been able to duplicate what it does programmatically.

What a waste of a nice weekend…

–Mark

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Mark Cariddi
Sent: Friday, October 15, 2010 4:14 PM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] How do you programmatically force setupdi to load a particular driver

Okay after figuring out what “devcon drivernodes” is doing, I have my code finding the driver node that I want to install. Unfortunately I can’t get the switch to occur. I have tried SetupDiSetDriverinstallparams and SetupDiSetSelectedDriver. Is there anything else special you have to do to make this work?

–Mark

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Tim Roberts
Sent: Friday, October 15, 2010 1:33 PM
To: Windows System Software Devs Interest List
Subject: Re: [ntdev] How do you programmatically force setupdi to load a particular driver

xxxxx@gmail.com wrote:

The error code was in setupapi.h, however it wasn’t in a format that could
be found by searching for 0xe000020a that would have been too easy…

The infinitely useful “err” tool saves the day:

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>err e000020a # for hex 0xe000020a / decimal -536870390 :
ERROR_NO_INF setupapi.h

1 matches found for “e000020a”

C:\DDK\7600\src\setup\DIFxAPI\DIFxCmd>


Tim Roberts, xxxxx@probo.com
Providenza & Boekelheide, Inc.


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer