Хорошо, поэтому я смог ответить на один из моих собственных вопросов: Есть ли способ заставить Windows уведомлять меня об удалении обоих томов?
Да - даже если Windows отправляет только одно DBT_DEVTYP_VOLUME
WM_DEVICECHANGE
сообщение, вы действительно получаете уведомление об удалении обоих томов - но, как всегда, Ответ лежит в глубине похоронен в MSDN :
Хотя член dbcv_unitmask может указывать более одного тома в любом сообщении, это не гарантирует, что для указанного события будет сгенерировано только одно сообщение. Несколько компонентов системы могут независимо генерировать сообщения для логических томов одновременно.
Итак, все, что мне нужно было сделать, это проигнорировать пример функции , которую Microsoft дает в одном из своих примеров,
char FirstDriveFromMask (ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
И замените его функцией, которая интерпретирует маску для всех затронутых дисков. Таким образом, единственное сообщение, которое я получал, было действительно для обоих томов, и обе буквы диска тома были доступны в маске.
// [IN] ULONG unitmask
// [IN/OUT] char* outDriveLetters - an array of characters to be passed in
// that is filled out with the drive letters
// in the mask (this must be 26 bytes to be safe)
// RETURNS the number of drive letters in the mask
int MaskToDriveLetters (ULONG unitmask, char* outDriveLetters)
{
int cnt = 0;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
{
outDriveLetters[cnt++] = 'A' + i;
cnt++;
}
unitmask = unitmask >> 1;
}
outDriveLetters[cnt] = 0; // set the last character to \0 (optional)
return cnt; // the number of drives that were set in the mask
}
У меня все еще есть другой вопрос, на который нужно ответить - как можно соотнести два сообщения (DBT_DEVTYP_DEVICEINTERFACE
и DBT_DEVTYP_VOLUME
)?