Função WdfIoTargetSendIoctlSynchronously (wdfiotarget.h)
[Aplica-se a KMDF e UMDF]
O método WdfIoTargetSendIoctlSynchronously cria uma solicitação de controle de dispositivo e a envia de forma síncrona para um destino de E/S.
Sintaxe
NTSTATUS WdfIoTargetSendIoctlSynchronously(
[in] WDFIOTARGET IoTarget,
[in, optional] WDFREQUEST Request,
[in] ULONG IoctlCode,
[in, optional] PWDF_MEMORY_DESCRIPTOR InputBuffer,
[in, optional] PWDF_MEMORY_DESCRIPTOR OutputBuffer,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
[out, optional] PULONG_PTR BytesReturned
);
Parâmetros
[in] IoTarget
Um identificador para um objeto de destino de E/S local ou remoto obtido de uma chamada anterior para WdfDeviceGetIoTarget ou WdfIoTargetCreate ou de um método que um destino de E/S especializado fornece.
[in, optional] Request
Um identificador para um objeto de solicitação de estrutura. Esse parâmetro é opcional e pode ser NULL. Para obter mais informações, consulte a seção Comentários a seguir.
[in] IoctlCode
Um IOCTL (código de controle de E/S) compatível com o destino de E/S.
[in, optional] InputBuffer
Um ponteiro para uma estrutura de WDF_MEMORY_DESCRIPTOR alocada pelo chamador que descreve um buffer que será gravado no destino de E/S. Para obter mais informações, consulte a seção Comentários a seguir. Esse parâmetro é opcional e pode ser NULL se a solicitação não enviar dados.
[in, optional] OutputBuffer
Um ponteiro para uma estrutura de WDF_MEMORY_DESCRIPTOR alocada pelo chamador que descreve um buffer que receberá dados do destino de E/S. Para obter mais informações, consulte a seção Comentários a seguir. Esse parâmetro é opcional e pode ser NULL se a solicitação não receber dados.
[in, optional] RequestOptions
Um ponteiro para uma estrutura de WDF_REQUEST_SEND_OPTIONS alocada pelo chamador que especifica opções para a solicitação. Esse ponteiro é opcional e pode ser NULL. Para obter mais informações, consulte a seção Comentários a seguir.
[out, optional] BytesReturned
Um ponteiro para um local que recebe informações (como o número de bytes transferidos) que outro driver fornece quando conclui a solicitação chamando WdfRequestCompleteWithInformation. Esse ponteiro é opcional e pode ser NULL.
Valor de retorno
Se a operação for bem-sucedida, WdfIoTargetSendIoctlSynchronously retorna após a conclusão da solicitação de controle do dispositivo e o valor retornado é o valor de status de conclusão da solicitação. Caso contrário, esse método poderá retornar um dos seguintes valores:
Código de retorno | Descrição |
---|---|
|
Um parâmetro inválido foi detectado. |
|
O tamanho da estrutura de WDF_REQUEST_SEND_OPTIONS que o parâmetro RequestOptions apontou estava incorreto. |
|
A solicitação já estava na fila para um destino de E/S. |
|
A estrutura não pode alocar recursos do sistema (normalmente memória). |
|
O pacote de solicitação de E/S ( |
Esse método também pode retornar outros valores NTSTATUS .
Uma verificação de bug ocorre se o driver fornece um identificador de objeto inválido.
Observações
Use o método WdfIoTargetSendIoctlSynchronously para enviar solicitações de controle de dispositivo de forma síncrona. Para enviar solicitações de controle de dispositivo de forma assíncrona, use o método WdfIoTargetFormatRequestForIoctl
Para obter mais informações sobre solicitações de controle de dispositivo, consulte Usando códigos de controle de E/S.
O método WdfIoTargetSendIoctlSynchronously não retorna até que a solicitação seja concluída, a menos que o driver forneça um valor de tempo limite no requestOptions estrutura de WDF_REQUEST_SEND_OPTIONS do parâmetro ou a menos que um erro seja detectado.
Você pode encaminhar uma solicitação de controle de dispositivo que seu driver recebeu em uma fila de E/S ou pode criar e enviar uma nova solicitação. Em ambos os casos, a estrutura requer um objeto de solicitação e algum espaço de buffer.
Para encaminhar uma solicitação de controle de dispositivo que o driver recebeu em uma fila de E/S:
- Especifique o identificador da solicitação recebida para o parâmetro WdfIoTargetSendIoctlSynchronouslyrequest do método.
-
Use o buffer de entrada da solicitação recebida para o parâmetro
WdfIoTargetSendIoctlSynchronously inputbuffer. O driver deve chamar WdfRequestRetrieveInputMemory para obter um identificador para um objeto de memória de estrutura que represente o buffer de entrada da solicitação. Em seguida, o driver deve colocar esse identificador na estrutura WDF_MEMORY_DESCRIPTOR que o driver fornece para o parâmetro InputBuffer de WdfIoTargetSendIoctlSynchronously.
-
Use o buffer de saída da solicitação recebida para o parâmetro
WdfIoTargetSendIoctlSynchronously métodoOutputBuffer. O driver deve chamar WdfRequestRetrieveOutputMemory para obter um identificador para um objeto de memória da estrutura que representa o buffer de saída da solicitação. Em seguida, o driver deve colocar esse identificador na estrutura WDF_MEMORY_DESCRIPTOR que o driver fornece para o parâmetro OutputBuffer de WdfIoTargetSendIoctlSynchronously.
Os drivers geralmente dividem as solicitações de E/S recebidas em solicitações menores que eles enviam para um destino de E/S, para que o driver possa criar novas solicitações.
Para criar uma nova solicitação de E/S:
-
Forneça um identificador de solicitação
NULL para o parâmetro de solicitação do métodoWdfIoTargetSendIoctlSynchronously do métodoou crie um novo objeto de solicitação e forneça seu identificador: - Se você fornecer um identificador de solicitação NULL, a estrutura usará um objeto de solicitação interno. Essa técnica é simples de usar, mas o driver não pode cancelar a solicitação.
- Se você chamar WdfRequestCreate para criar um ou mais objetos de solicitação, você poderá reutilizar esses objetos de solicitação chamando WdfRequestReuse. Essa técnica permite que o do driver EvtDriverDeviceAdd função de retorno de chamada para pré-alocar objetos de solicitação para um dispositivo. Além disso, outro thread de driver pode chamar WdfRequestCancelSentRequest para cancelar a solicitação, se necessário.
O driver pode especificar um parâmetro
NULL não RequestOptions, independentemente de o driver fornecer uma NULL não ou um parâmetro de solicitação de NULL . Você pode, por exemplo, usar o parâmetro RequestOptions para especificar um valor de tempo limite. -
Forneça espaço de buffer para o
parâmetro sInputBuffer do métodoe OutputBuffer , se a solicitação exigir.O driver pode especificar esse espaço de buffer como buffers alocados localmente, como identificadores WDFMEMORY ou como MDLs (listas de descritores de memória). Você pode usar qualquer método mais conveniente.
Se necessário, a estrutura converte as descrições de buffer para que elas estejam corretas para o tipo de transferência do IOCTL. Para obter mais informações sobre tipos de transferência IOCTL, consulte Definindo códigos de controle de E/S.
As seguintes técnicas para especificar o espaço em buffer estão disponíveis:
-
Forneça buffers locais.
Como WdfIoTargetSendIoctlSynchronously manipula solicitações de E/S de forma síncrona, o driver pode criar buffers de solicitação locais para a rotina de chamada, como mostra o exemplo de código a seguir.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor; MY_BUFFER_TYPE MyBuffer; WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor, (PVOID) &MyBuffer, sizeof(MyBuffer));
-
Forneça identificadores WDFMEMORY.
Chame WdfMemoryCreate ou WdfMemoryCreatePreallocated para obter um identificador para a memória gerenciada por estrutura, como mostra o exemplo de código a seguir.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor; WDFMEMORY MemoryHandle = NULL; status = WdfMemoryCreate(NULL, NonPagedPool, POOL_TAG, MY_BUFFER_SIZE, &MemoryHandle, NULL); WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&MemoryDescriptor, MemoryHandle, NULL);
Como alternativa, o driver pode chamar
WdfRequestRetrieveInputMemory ouWdfRequestRetrieveOutputMemory para obter um identificador para um objeto de memória de estrutura que representa um buffer de solicitação de E/S recebido, se você quiser que o driver passe o conteúdo desse buffer para o destino de E/S. O driver não deve concluir a solicitação de E/S recebida até que a nova solicitação que WdfIoTargetSendIoctlSynchronously envia para o destino de E/S tenha sido excluída, reutilizado ou reformatado. (WdfIoTargetSendIoctlSynchronously incrementa a contagem de referência do objeto de memória. Excluir, reutilizar ou reformatar um objeto de solicitação diminui a contagem de referência do objeto de memória.) -
Forneça MDLs.
Os drivers podem obter MDLs associadas a uma solicitação de E/S recebida chamando WdfRequestRetrieveInputWdmMdl e WdfRequestRetrieveOutputWdmMdl.
-
Forneça buffers locais.
Para obter mais informações sobre WdfIoTargetSendIoctlSynchronously, consulte Enviar solicitações de E/S para destinos gerais de E/S.
Para obter mais informações sobre destinos de E/S, consulte Usando destinos de E/S.
Exemplos
O exemplo de código a seguir define um buffer local, inicializa uma estrutura de WDF_MEMORY_DESCRIPTOR e chama WdfIoTargetSendIoctlSynchronously. Este exemplo especifica NULL para o identificador de objeto de solicitação, portanto, a estrutura criará um novo objeto de solicitação para o destino de E/S.
WDF_MEMORY_DESCRIPTOR outputDescriptor;
NTSTATUS status;
HID_COLLECTION_INFORMATION collectionInformation;
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(
&outputDescriptor,
(PVOID) &collectionInformation,
sizeof(HID_COLLECTION_INFORMATION)
);
status = WdfIoTargetSendIoctlSynchronously(
hidTarget,
NULL,
IOCTL_HID_GET_COLLECTION_INFORMATION,
NULL,
&outputDescriptor,
NULL,
NULL
);
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino |
Universal |
versão mínima do KMDF | 1.0 |
versão mínima do UMDF | 2.0 |
cabeçalho | wdfiotarget.h (inclua Wdf.h) |
biblioteca | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
regras de conformidade de DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InternalIoctlReqs(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), ReadReqs(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), SyncReqSend(kmdf), WriteReqs(kmdf) |
Consulte também
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER
WdfIoTargetFormatRequestForIoctl
WdfIoTargetSendInternalIoctlSynchronously
WdfRequestCompleteWithInformation
WdfRequestRetrieveOutputMemory