📄 addfilter.c
字号:
} else {
if( needReboot ) {
printf("One or more devices could not be restarted. The machine "
"must be restarted\n"
"in order for settings to take effect\n");
} else {
printf("Everything has completed normally.\n");
}
}
return (0);
}
/*
* add the given filter driver to the list of upper filter drivers for the
* device.
*
* After the call, the device must be restarted in order for the new setting to
* take effect. This can be accomplished with a call to RestartDevice(), or by
* rebooting the machine.
*
* returns TRUE if successful, FALSE otherwise
*
* note: The filter is prepended to the list of drivers, which will put it at
* the bottom of the filter driver stack
*
* parameters:
* DeviceInfoSet - The device information set which contains DeviceInfoData
* DeviceInfoData - Information needed to deal with the given device
* Filter - the filter to add
*/
BOOLEAN
AddFilterDriver(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN LPTSTR Filter,
IN BOOLEAN UpperFilter
)
{
size_t length = 0; // character length
size_t size = 0; // buffer size
LPTSTR buffer = GetFilters( DeviceInfoSet, DeviceInfoData, UpperFilter );
ASSERT(DeviceInfoData != NULL);
ASSERT(Filter != NULL);
if( buffer == NULL )
{
// if there is no such value in the registry, then there are no upper
// filter drivers loaded, and we can just put one there
// make room for the string, string null terminator, and multisz null
// terminator
length = _tcslen(Filter)+1;
size = (length+1)*sizeof(_TCHAR);
buffer = malloc( size );
if( buffer == NULL )
{
printf("in AddUpperFilterDriver(): unable to allocate memory!\n");
return (FALSE);
}
memset(buffer, 0, size);
// copy the string into the new buffer
memcpy(buffer, Filter, length*sizeof(_TCHAR));
}
else
{
LPTSTR buffer2;
// remove all instances of filter from driver list
MultiSzSearchAndDeleteCaseInsensitive( Filter, buffer, &length );
// allocate a buffer large enough to add the new filter
// MultiSzLength already includes length of terminating NULL
// determing the new length of the string
length = MultiSzLength(buffer) + _tcslen(Filter) + 1;
size = length*sizeof(_TCHAR);
buffer2 = malloc( size );
if (buffer2 == NULL) {
printf("Out of memory adding filter\n");
return (0);
}
memset(buffer2, 0, size);
// swap the buffers out
memcpy(buffer2, buffer, MultiSzLength(buffer)*sizeof(_TCHAR));
free(buffer);
buffer = buffer2;
// add the driver to the driver list
PrependSzToMultiSz(Filter, &buffer);
}
// set the new list of filters in place
if( !SetupDiSetDeviceRegistryProperty( DeviceInfoSet,
DeviceInfoData,
(UpperFilter ? SPDRP_UPPERFILTERS : SPDRP_LOWERFILTERS),
(PBYTE)buffer,
(MultiSzLength(buffer)*sizeof(_TCHAR)) )
)
{
printf("in AddUpperFilterDriver(): "
"couldn't set registry value! error: %u\n", GetLastError());
free( buffer );
return (FALSE);
}
// no need for buffer anymore
free( buffer );
return (TRUE);
}
/*
* remove all instances of the given filter driver from the list of upper
* filter drivers for the device.
*
* After the call, the device must be restarted in order for the new setting to
* take effect. This can be accomplished with a call to RestartDevice(), or by
* rebooting the machine.
*
* returns TRUE if successful, FALSE otherwise
*
* parameters:
* DeviceInfoSet - The device information set which contains DeviceInfoData
* DeviceInfoData - Information needed to deal with the given device
* Filter - the filter to remove
*/
BOOLEAN
RemoveFilterDriver(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN LPTSTR Filter,
IN BOOLEAN UpperFilter
)
{
size_t length = 0;
size_t size = 0;
LPTSTR buffer = GetFilters( DeviceInfoSet, DeviceInfoData, UpperFilter );
BOOL success = FALSE;
ASSERT(DeviceInfoData != NULL);
ASSERT(Filter != NULL);
if( buffer == NULL )
{
// if there is no such value in the registry, then there are no upper
// filter drivers loaded, and we are done
return (TRUE);
}
else
{
// remove all instances of filter from driver list
MultiSzSearchAndDeleteCaseInsensitive( Filter, buffer, &length );
}
length = MultiSzLength(buffer);
ASSERT ( length > 0 );
if( length == 1 )
{
// if the length of the list is 1, the return value from
// MultiSzLength() was just accounting for the trailing '\0', so we can
// delete the registry key, by setting it to NULL.
success = SetupDiSetDeviceRegistryProperty( DeviceInfoSet,
DeviceInfoData,
(UpperFilter ? SPDRP_UPPERFILTERS : SPDRP_LOWERFILTERS),
NULL,
0 );
}
else
{
// set the new list of drivers into the registry
size = length*sizeof(_TCHAR);
success = SetupDiSetDeviceRegistryProperty( DeviceInfoSet,
DeviceInfoData,
(UpperFilter ? SPDRP_UPPERFILTERS : SPDRP_LOWERFILTERS),
(PBYTE)buffer,
size );
}
// no need for buffer anymore
free( buffer );
if( !success )
{
printf("in RemoveUpperFilterDriver(): "
"couldn't set registry value! error: %i\n", GetLastError());
return (FALSE);
}
return (TRUE);
}
/*
* print the list of upper filters for the given device
*
* parameters:
* DeviceInfoSet - The device information set which contains DeviceInfoData
* DeviceInfoData - Information needed to deal with the given device
*/
void
PrintFilters(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN BOOLEAN UpperFilters
)
{
// get the list of filters
LPTSTR buffer = GetFilters( DeviceInfoSet, DeviceInfoData, UpperFilters );
size_t filterPosition;
if( buffer == NULL )
{
// if there is no such value in the registry, then there are no upper
// filter drivers loaded
printf("There are no upper filter drivers loaded for this device.\n");
}
else
{
// go through the multisz and print out each driver
filterPosition=0;
while( *buffer != _T('\0') )
{
_tprintf(_T("%i: %s\n"), filterPosition, buffer);
buffer += _tcslen(buffer)+1;
filterPosition++;
}
// no need for buffer anymore
free( buffer );
}
return;
}
/*
* print the device name
*
* parameters:
* DeviceInfoSet - The device information set which contains DeviceInfoData
* DeviceInfoData - Information needed to deal with the given device
*/
void PrintDeviceName(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData
)
{
DWORD regDataType;
LPTSTR deviceName =
(LPTSTR) GetDeviceRegistryProperty( DeviceInfoSet,
DeviceInfoData,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
®DataType );
if( deviceName != NULL )
{
// just to make sure we are getting the expected type of buffer
if( regDataType != REG_SZ )
{
printf("in PrintDeviceName(): registry key is not an SZ!\n");
}
else
{
// if the device name starts with \Device, cut that off (all
// devices will start with it, so it is redundant)
if( _tcsncmp(deviceName, _T("\\Device"), 7) == 0 )
{
memmove(deviceName,
deviceName+7,
(_tcslen(deviceName)-6)*sizeof(_TCHAR) );
}
_tprintf(_T("%s\n"), deviceName);
}
free( deviceName );
}
else
{
printf("in PrintDeviceName(): registry key is NULL! error: %u\n",
GetLastError());
}
return;
}
/*
* Returns a buffer containing the list of upper filters for the device. (NULL
* is returned if there is no buffer, or an error occurs)
* The buffer must be freed by the caller.
*
* parameters:
* DeviceInfoSet - The device information set which contains DeviceInfoData
* DeviceInfoData - Information needed to deal with the given device
*/
LPTSTR
GetFilters(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN BOOLEAN UpperFilters
)
{
DWORD regDataType;
LPTSTR buffer = (LPTSTR) GetDeviceRegistryProperty( DeviceInfoSet,
DeviceInfoData,
(UpperFilters ? SPDRP_UPPERFILTERS : SPDRP_LOWERFILTERS),
®DataType );
// just to make sure we are getting the expected type of buffer
if( buffer != NULL && regDataType != REG_MULTI_SZ )
{
printf("in GetUpperFilters(): "
"registry key is not a MULTI_SZ!\n");
free( buffer );
return (NULL);
}
return (buffer);
}
/*
* return true if DeviceName matches the name of the device specified by
* DeviceInfoData
*
* parameters:
* DeviceInfoSet - The device information set which contains DeviceInfoData
* DeviceInfoData - Information needed to deal with the given device
* DeviceName - the name to try to match
*/
BOOLEAN
DeviceNameMatches(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
IN LPTSTR DeviceName
)
{
BOOLEAN matching = FALSE;
DWORD regDataType;
// get the device name
LPTSTR deviceName =
(LPTSTR) GetDeviceRegistryProperty( DeviceInfoSet,
DeviceInfoData,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
®DataType );
if( deviceName != NULL )
{
// just to make sure we are getting the expected type of buffer
if( regDataType != REG_SZ )
{
printf("in DeviceNameMatches(): registry key is not an SZ!\n");
matching = FALSE;
}
else
{
// if the device name starts with \Device, cut that off (all
// devices will start with it, so it is redundant)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -