Compartilhar via


Device Interface Notifications

Windows Mobile SupportedWindows Embedded CE Supported

9/8/2008

Windows Embedded CE utiliza notificação interface dispositivo para alerta aplicativos, serviços e drivers dispositivo para a aparência e disappearance das interfaces dispositivo. É o Windows Embedded CE equivalente para o sistema evento Plug and Play em área de trabalho Windows-Based plataformas.

A seguinte tabela mostra as notificações geradas pelo Device Manager.

Notificação Descrição

Mensagens WM_DEVICECHANGE

Transmitir com SendNotifyMessage.

Mensagem mensagens fila

Registrar mensagens fila de mensagens com RequestDeviceNotifications. Pare de receber notificações dispositivo por chamado StopDeviceNotifications.

Notificações fila de mensagens incluem as notificações que AdvertiseInterface anuncia explicitamente e notificações que do o driver IClass valor chave do Registro implicitamente anuncia. IClass GUIDs podem ter um nome associado com eles. Por exemplo " {GUID} = GUID_friendly_name ".

AdvertiseInterface Informa ao Device Manager notificar todas as partes interessadas da disponibilidade ou a remoção de uma interface dispositivo. Ele não carregar ou descarregar drivers. Drivers que usam AdvertiseInterface Também deve anunciar quando a interface vai ausente.

A módulo implementa filesys a AdvertiseInterface, RequestDeviceNotifications, e StopDeviceNotifications funções. Isso permite que eles serem disponível anteriormente no processo, em particular para inicializar bloco drivers carregados pelo módulo filesys.

A seguinte lista mostra as formas que pode expor interfaces dispositivo para aplicativos e drivers através de Device Manager:

  • Você pode definir a interface in a IClass valor da chave do Registro usado para ativar o dispositivo.
  • Você pode definir a IClass valor in a Ativa chave por do um driver de dispositivo Init função.
  • Você pode definir a IClass valor no parâmetro de REGINI a ActivateDeviceEx.
    Definir o valor precisa acessar avançado para informações de instância para o driver que está prestes a ser carregado. Ele também requer que o driver faça instruções relacionadas capacidade desse driver de acordo com algumas interface.
  • Você pode explicitamente chamar AdvertiseInterface Para as interfaces que seu driver suporta.

Essas abordagens todos causar Device Manager APIs para enviar notificações para todos o driver é definido interfaces depois que o driver é carregado e inicializado e em seguida, novamente depois que o driver for descarregado.

A seguinte lista mostra as regras que garantem aplicativos são compatível com as notificações Plug and Play que usam nomes non-Legacy:

  • IClass GUIDs sem associado de nomes apenas geram mensagens WM_DEVICECHANGE se o dispositivo tiver um herdado nome como " com1: ".
  • IClass GUIDs sem associado herdado do dispositivo a usam nomes nome se a herdado nome existe.
    " com1: " é um exemplo de herdado Nome.
  • IClass GUIDs sem associado nomes usam nome completo do dispositivo se nenhum herdado nome existe.
    "\$device\COM11" é um exemplo de nome de dispositivo completo.
  • AdvertiseInterface interface nomes são transmitidos e não modificada.
  • IClass GUIDs com associado nomes são transmitidos e não modificada.

Essas regras garantem que os destinatários WM_DEVICECHANGE podem processo um nome dispositivo non-legacy. Se um fila de mensagens não inclui espaço suficiente para um nome dispositivo non-Legacy, a tentativa falhar transmitir e o consumidor fila de mensagens não receberá uma mensagem não pode processo.

Usar RequestDeviceNotifications e StopDeviceNotifications para registrar e cancelar o registro para notificações interface dispositivo. Quando você não estiver interessado em receber notificações, chamar StopDeviceNotificationse então fechar o fila de mensagens com CloseMsgQueue.

Filas de mensagens são objetos sistema operacional (OS) que são úteis para notificações dispositivo. Eles implementar primeiro, primeiro Out filas (FIFO) em Compartilhada espaço memória. Um aberto identificador para um fila de mensagens pode bloco com WaitForSingleObject ou WaitForMultipleObjects. Além do WaitForSingleObject e WaitForMultipleObject chamadas, você deve manipular filas mensagem somente com as funções fila de mensagens. De exemplo, você não pode chamar CloseHandle em um identificador fila de mensagens. Para obter mais informações sobre as funções fila de mensagens, consulte Message Queue Point-to-Point Reference.

O seguinte exemplo de código mostra um simples uso de CreateMsgQueue, RequestDeviceNotifications, WaitForSingleObject, e StopDeviceNotifications.

#include <windows.h>
#include <msgqueue.h>

#include <pnp.h>

typedef union {
  DEVDETAIL d;
  char pad[sizeof(DEVDETAIL)+MAX_DEVCLASS_NAMELEN];
} MYDEV;

void EnumerateDevices (HANDLE h)
{
  MYDEV detail;
  DWORD flags;
  DWORD size;

  SetLastError(0);

  while (ReadMsgQueue(h, &detail, sizeof(detail), &size, 1, &flags) == TRUE)
    printf("Device notification: %S %s, f=0x%x\n", detail.d.szName, detail.d.fAttached ? "appeared" : "was removed", flags);

  printf("Leaving Enumerate, error = %d\n", GetLastError());
}

main ()
{
  GUID guid = {0};    // or any known and relevant device interface GUID
  HANDLE hq, hn;
  MSGQUEUEOPTIONS msgopts;

  msgopts.dwFlags = MSGQUEUE_VARIABLESIZE | MSGQUEUE_MSGSIZE;
  msgopts.dwMaxMessages = 0; //?
  msgopts.cbMaxMessage = sizeof(MYDEV);
  msgopts.cbMaxMsgQueue = 0; //?
  msgopts.dwDesiredAccess = GENERIC_READ;
  msgopts.dwShareMode = 0;
  msgopts.dwCreationDisposition = CREATE_NEW;
  hq = CreateMsgQueue(NULL, &msgopts);

  printf("Created message queue, h = %08X\n", hq);
  if (hq == 0) return 0;

  hn = RequestDeviceNotifications(&guid, hq, TRUE);

  printf("Registered for notifications, h = %08X\n", hn);

  EnumerateDevices(hq);

  printf("Completed initial notification pass.\n");

  // do whatever
  while (WaitForSingleObject(hq, 80000) == WAIT_OBJECT_0)
    EnumerateDevices(hq);

  printf("Commencing final enumeration\n");
  EnumerateDevices(hq);
  printf("Done.\n");

  StopDeviceNotifications(hn);
  CloseMsgQueue(hq);

  return 0;
}

See Also

Reference

Device Interface Notifications Reference

Concepts

Loading Device Drivers
Bus Enumerator
Device Interfaces