本文整理汇总了C++中TraceEvents函数的典型用法代码示例。如果您正苦于以下问题:C++ TraceEvents函数的具体用法?C++ TraceEvents怎么用?C++ TraceEvents使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了TraceEvents函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: VirtRngEvtInterruptDpc
VOID VirtRngEvtInterruptDpc(IN WDFINTERRUPT Interrupt,
IN WDFOBJECT AssociatedObject)
{
PDEVICE_CONTEXT context = GetDeviceContext(
WdfInterruptGetDevice(Interrupt));
struct virtqueue *vq = context->VirtQueue;
PREAD_BUFFER_ENTRY entry;
PSINGLE_LIST_ENTRY iter;
NTSTATUS status;
PVOID buffer;
size_t bufferLen;
unsigned int length;
UNREFERENCED_PARAMETER(AssociatedObject);
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_DPC,
"--> %!FUNC! Interrupt: %p", Interrupt);
for (;;)
{
WdfSpinLockAcquire(context->VirtQueueLock);
entry = (PREAD_BUFFER_ENTRY)virtqueue_get_buf(vq, &length);
if (entry == NULL)
{
WdfSpinLockRelease(context->VirtQueueLock);
break;
}
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ,
"Got %p Request: %p Buffer: %p",
entry, entry->Request, entry->Buffer);
iter = &context->ReadBuffersList;
while (iter->Next != NULL)
{
PREAD_BUFFER_ENTRY current = CONTAINING_RECORD(iter->Next,
READ_BUFFER_ENTRY, ListEntry);
if (entry == current)
{
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ,
"Delete %p Request: %p Buffer: %p",
entry, entry->Request, entry->Buffer);
iter->Next = current->ListEntry.Next;
break;
}
else
{
iter = iter->Next;
}
};
if ((entry->Request == NULL) ||
(WdfRequestUnmarkCancelable(entry->Request) == STATUS_CANCELLED))
{
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC,
"Ignoring a canceled read request: %p", entry->Request);
entry->Request = NULL;
}
WdfSpinLockRelease(context->VirtQueueLock);
if (entry->Request != NULL)
{
status = WdfRequestRetrieveOutputBuffer(entry->Request, length,
&buffer, &bufferLen);
if (NT_SUCCESS(status))
{
length = min(length, (unsigned)bufferLen);
RtlCopyMemory(buffer, entry->Buffer, length);
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_DPC,
"Complete Request: %p Length: %d", entry->Request, length);
WdfRequestCompleteWithInformation(entry->Request,
STATUS_SUCCESS, (ULONG_PTR)length);
}
else
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
"WdfRequestRetrieveOutputBuffer failed: %!STATUS!", status);
WdfRequestComplete(entry->Request, status);
}
}
ExFreePoolWithTag(entry->Buffer, VIRT_RNG_MEMORY_TAG);
ExFreePoolWithTag(entry, VIRT_RNG_MEMORY_TAG);
}
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_DPC, "<-- %!FUNC!");
}
示例2: SetBarGraphState
NTSTATUS
SetBarGraphState(
_In_ PDEVICE_CONTEXT DevContext,
_In_ PBAR_GRAPH_STATE BarGraphState
)
/*++
Routine Description
This routine sets the state of the bar graph on the board
Arguments:
DevContext - One of our device extensions
BarGraphState - Struct that describes the bar graph's desired state
Return Value:
NT status value
--*/
{
NTSTATUS status;
WDF_USB_CONTROL_SETUP_PACKET controlSetupPacket;
WDF_REQUEST_SEND_OPTIONS sendOptions;
WDF_MEMORY_DESCRIPTOR memDesc;
ULONG bytesTransferred;
PAGED_CODE();
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "--> SetBarGraphState\n");
WDF_REQUEST_SEND_OPTIONS_INIT(
&sendOptions,
WDF_REQUEST_SEND_OPTION_TIMEOUT
);
WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(
&sendOptions,
DEFAULT_CONTROL_TRANSFER_TIMEOUT
);
WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&controlSetupPacket,
BmRequestHostToDevice,
BmRequestToDevice,
USBFX2LK_SET_BARGRAPH_DISPLAY, // Request
0, // Value
0); // Index
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&memDesc,
BarGraphState,
sizeof(BAR_GRAPH_STATE));
status = WdfUsbTargetDeviceSendControlTransferSynchronously(
DevContext->UsbDevice,
NULL, // Optional WDFREQUEST
&sendOptions,
&controlSetupPacket,
&memDesc,
&bytesTransferred);
if(!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
"SetBarGraphState: Failed - 0x%x \n", status);
} else {
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
"SetBarGraphState: LED mask is 0x%x\n", BarGraphState->BarsAsUChar);
}
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "<-- SetBarGraphState\n");
return status;
}
示例3: SetSevenSegmentState
NTSTATUS
SetSevenSegmentState(
_In_ PDEVICE_CONTEXT DevContext,
_In_ PUCHAR SevenSegment
)
/*++
Routine Description
This routine sets the state of the 7 segment display on the board
Arguments:
DevContext - One of our device extensions
SevenSegment - desired state of the 7 segment display
Return Value:
NT status value
--*/
{
NTSTATUS status;
WDF_USB_CONTROL_SETUP_PACKET controlSetupPacket;
WDF_REQUEST_SEND_OPTIONS sendOptions;
WDF_MEMORY_DESCRIPTOR memDesc;
ULONG bytesTransferred;
PAGED_CODE();
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "--> SetSevenSegmentState\n");
WDF_REQUEST_SEND_OPTIONS_INIT(
&sendOptions,
WDF_REQUEST_SEND_OPTION_TIMEOUT
);
WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(
&sendOptions,
DEFAULT_CONTROL_TRANSFER_TIMEOUT
);
WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&controlSetupPacket,
BmRequestHostToDevice,
BmRequestToDevice,
USBFX2LK_SET_7SEGMENT_DISPLAY, // Request
0, // Value
0); // Index
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&memDesc,
SevenSegment,
sizeof(UCHAR));
status = WdfUsbTargetDeviceSendControlTransferSynchronously(
DevContext->UsbDevice,
NULL, // Optional WDFREQUEST
&sendOptions,
&controlSetupPacket,
&memDesc,
&bytesTransferred);
if(!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
"SetSevenSegmentState: Failed to set 7 Segment state - 0x%x \n", status);
} else {
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
"SetSevenSegmentState: 7 Segment mask is 0x%x\n", *SevenSegment);
}
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "<-- SetSevenSegmentState\n");
return status;
}
示例4: VirtQueueAddBuffer
static NTSTATUS VirtQueueAddBuffer(IN PDEVICE_CONTEXT Context,
IN WDFREQUEST Request,
IN size_t Length)
{
PREAD_BUFFER_ENTRY entry;
size_t length;
struct virtqueue *vq = Context->VirtQueue;
struct VirtIOBufferDescriptor sg;
int ret;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ, "--> %!FUNC!");
entry = (PREAD_BUFFER_ENTRY)ExAllocatePoolWithTag(NonPagedPool,
sizeof(READ_BUFFER_ENTRY), VIRT_RNG_MEMORY_TAG);
if (entry == NULL)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
"Failed to allocate a read entry.");
return STATUS_INSUFFICIENT_RESOURCES;
}
length = min(Length, PAGE_SIZE);
entry->Buffer = ExAllocatePoolWithTag(NonPagedPool, length,
VIRT_RNG_MEMORY_TAG);
if (entry->Buffer == NULL)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
"Failed to allocate a read buffer.");
ExFreePoolWithTag(entry, VIRT_RNG_MEMORY_TAG);
return STATUS_INSUFFICIENT_RESOURCES;
}
entry->Request = Request;
sg.physAddr = MmGetPhysicalAddress(entry->Buffer);
sg.length = (unsigned)length;
WdfSpinLockAcquire(Context->VirtQueueLock);
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ,
"Push %p Request: %p Buffer: %p",
entry, entry->Request, entry->Buffer);
PushEntryList(&Context->ReadBuffersList, &entry->ListEntry);
ret = virtqueue_add_buf(vq, &sg, 0, 1, entry, NULL, 0);
if (ret < 0)
{
PSINGLE_LIST_ENTRY removed;
TraceEvents(TRACE_LEVEL_ERROR, DBG_READ,
"Failed to add buffer to virt queue.");
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ,
"Pop %p Request: %p Buffer: %p",
entry, entry->Request, entry->Buffer);
removed = PopEntryList(&Context->ReadBuffersList);
NT_ASSERT(entry == CONTAINING_RECORD(
removed, READ_BUFFER_ENTRY, ListEntry));
ExFreePoolWithTag(entry->Buffer, VIRT_RNG_MEMORY_TAG);
ExFreePoolWithTag(entry, VIRT_RNG_MEMORY_TAG);
WdfSpinLockRelease(Context->VirtQueueLock);
return STATUS_UNSUCCESSFUL;
}
WdfSpinLockRelease(Context->VirtQueueLock);
virtqueue_kick(vq);
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ, "<-- %!FUNC!");
return STATUS_SUCCESS;
}
示例5: OsrFxEvtIoDeviceControl
VOID
OsrFxEvtIoDeviceControl(
_In_ WDFQUEUE Queue,
_In_ WDFREQUEST Request,
_In_ size_t OutputBufferLength,
_In_ size_t InputBufferLength,
_In_ ULONG IoControlCode
)
/*++
Routine Description:
This event is called when the framework receives IRP_MJ_DEVICE_CONTROL
requests from the system.
Arguments:
Queue - Handle to the framework queue object that is associated
with the I/O request.
Request - Handle to a framework request object.
OutputBufferLength - length of the request's output buffer,
if an output buffer is available.
InputBufferLength - length of the request's input buffer,
if an input buffer is available.
IoControlCode - the driver-defined or system-defined I/O control code
(IOCTL) that is associated with the request.
Return Value:
VOID
--*/
{
WDFDEVICE device;
PDEVICE_CONTEXT pDevContext;
size_t bytesReturned = 0;
PBAR_GRAPH_STATE barGraphState = NULL;
PSWITCH_STATE switchState = NULL;
PUCHAR sevenSegment = NULL;
BOOLEAN requestPending = FALSE;
NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
UNREFERENCED_PARAMETER(InputBufferLength);
UNREFERENCED_PARAMETER(OutputBufferLength);
PAGED_CODE();
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_IOCTL, "--> OsrFxEvtIoDeviceControl\n");
//
// initialize variables
//
device = WdfIoQueueGetDevice(Queue);
pDevContext = GetDeviceContext(device);
switch(IoControlCode) {
case IOCTL_OSRUSBFX2_GET_CONFIG_DESCRIPTOR: {
PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor = NULL;
USHORT requiredSize = 0;
//
// First get the size of the config descriptor
//
status = WdfUsbTargetDeviceRetrieveConfigDescriptor(
pDevContext->UsbDevice,
NULL,
&requiredSize);
if (status != STATUS_BUFFER_TOO_SMALL) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
"WdfUsbTargetDeviceRetrieveConfigDescriptor failed 0x%x\n", status);
break;
}
//
// Get the buffer - make sure the buffer is big enough
//
status = WdfRequestRetrieveOutputBuffer(Request,
(size_t)requiredSize, // MinimumRequired
&configurationDescriptor,
NULL);
if(!NT_SUCCESS(status)){
TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
"WdfRequestRetrieveOutputBuffer failed 0x%x\n", status);
break;
}
status = WdfUsbTargetDeviceRetrieveConfigDescriptor(
pDevContext->UsbDevice,
configurationDescriptor,
&requiredSize);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_IOCTL,
"WdfUsbTargetDeviceRetrieveConfigDescriptor failed 0x%x\n", status);
break;
}
bytesReturned = requiredSize;
//.........这里部分代码省略.........
示例6: BthEchoCliRetrieveServerBthAddress
NTSTATUS
BthEchoCliRetrieveServerBthAddress(
_In_ PBTHECHOSAMPLE_CLIENT_CONTEXT DevCtx
)
/*++
Description:
Retrieve server Bth address
Arguments:
DevCtx - Client context where we store bth address
Return Value:
NTSTATUS Status code.
--*/
{
NTSTATUS status, statusReuse;
WDF_MEMORY_DESCRIPTOR outMemDesc;
WDF_REQUEST_REUSE_PARAMS ReuseParams;
BTH_DEVICE_INFO serverDeviceInfo;
WDF_REQUEST_REUSE_PARAMS_INIT(&ReuseParams, WDF_REQUEST_REUSE_NO_FLAGS, STATUS_NOT_SUPPORTED);
statusReuse = WdfRequestReuse(DevCtx->Header.Request, &ReuseParams);
NT_ASSERT(NT_SUCCESS(statusReuse));
UNREFERENCED_PARAMETER(statusReuse);
RtlZeroMemory( &serverDeviceInfo, sizeof(serverDeviceInfo) );
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(
&outMemDesc,
&serverDeviceInfo,
sizeof(serverDeviceInfo)
);
status = WdfIoTargetSendInternalIoctlSynchronously(
DevCtx->Header.IoTarget,
DevCtx->Header.Request,
IOCTL_INTERNAL_BTHENUM_GET_DEVINFO,
NULL, //inMemDesc
&outMemDesc,
NULL, //sendOptions
NULL //bytesReturned
);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"Failed to obtain server device info, Status code %!STATUS!\n", status);
goto exit;
}
DevCtx->ServerBthAddress = serverDeviceInfo.address;
exit:
return status;
}
示例7: OsrFxEvtDevicePrepareHardware
NTSTATUS
OsrFxEvtDevicePrepareHardware(
IN WDFDEVICE Device,
IN WDFCMRESLIST ResourceList,
IN WDFCMRESLIST ResourceListTranslated
)
/*++
Routine Description:
In this callback, the driver does whatever is necessary to make the
hardware ready to use. In the case of a USB device, this involves
reading descriptors and selecting interfaces.
Arguments:
Device - handle to a device
Return Value:
NT status value
--*/
{
NTSTATUS status, tempStatus;
PDEVICE_CONTEXT pDeviceContext;
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams;
UNREFERENCED_PARAMETER(ResourceList);
UNREFERENCED_PARAMETER(ResourceListTranslated);
PAGED_CODE();
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "--> EvtDevicePrepareHardware\n");
pDeviceContext = GetDeviceContext(Device);
//
// Create a USB device handle so that we can communicate with the
// underlying USB stack. The WDFUSBDEVICE handle is used to query,
// configure, and manage all aspects of the USB device.
// These aspects include device properties, bus properties,
// and I/O creation and synchronization. We only create device the first
// the PrepareHardware is called. If the device is restarted by pnp manager
// for resource rebalance, we will use the same device handle but then select
// the interfaces again because the USB stack could reconfigure the device on
// restart.
//
if (pDeviceContext->UsbDevice == NULL) {
status = WdfUsbTargetDeviceCreate(Device,
WDF_NO_OBJECT_ATTRIBUTES,
&pDeviceContext->UsbDevice);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfUsbTargetDeviceCreate failed with Status code %!STATUS!\n", status);
return status;
}
}
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE( &configParams);
status = WdfUsbTargetDeviceSelectConfig(pDeviceContext->UsbDevice,
WDF_NO_OBJECT_ATTRIBUTES,
&configParams);
if(!NT_SUCCESS(status)) {
WDF_USB_DEVICE_INFORMATION deviceInfo;
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfUsbTargetDeviceSelectConfig failed %!STATUS! \n",
status);
//
// detect if we are connected to a 1.1 USB port
//
WDF_USB_DEVICE_INFORMATION_INIT(&deviceInfo);
tempStatus = WdfUsbTargetDeviceRetrieveInformation(pDeviceContext->UsbDevice, &deviceInfo);
if (NT_SUCCESS(tempStatus)) {
//
// Since the Osr USB fx2 device is capable of working at high speed, the only reason
// the device would not be working at high speed is if the port doesn't
// support it. If the port doesn't support high speed it is a 1.1 port
//
if ((deviceInfo.Traits & WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED) == 0) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
" On a 1.1 USB port on Windows Vista"
" this is expected as the OSR USB Fx2 board's Interrupt EndPoint descriptor"
" doesn't conform to the USB specification. Windows Vista detects this and"
" returns an error. \n"
);
}
}
return status;
}
pDeviceContext->UsbInterface =
configParams.Types.SingleInterface.ConfiguredUsbInterface;
status = OsrFxConfigContReaderForInterruptEndPoint(pDeviceContext);
//.........这里部分代码省略.........
示例8: UNREFERENCED_PARAMETER
CMyReadWriteQueue::OnRead(
__in IWDFIoQueue *pWdfQueue,
__in IWDFIoRequest *pWdfRequest,
__in SIZE_T BytesToRead
)
/*++
Routine Description:
Read dispatch routine
IQueueCallbackRead
Aruments:
pWdfQueue - Framework Queue instance
pWdfRequest - Framework Request instance
BytesToRead - Lenth of bytes in the read buffer
Copy available data into the read buffer
Return Value:
VOID
--*/
{
UNREFERENCED_PARAMETER(pWdfQueue);
TraceEvents(TRACE_LEVEL_INFORMATION,
TEST_TRACE_QUEUE,
"%!FUNC!: Queue %p Request %p BytesToTransfer %d\n",
this,
pWdfRequest,
(ULONG)(ULONG_PTR)BytesToRead
);
HRESULT hr = S_OK;
IWDFMemory * pOutputMemory = NULL;
pWdfRequest->GetOutputMemory(&pOutputMemory);
hr = m_Device->GetInputPipe()->FormatRequestForRead(
pWdfRequest,
NULL, //pFile
pOutputMemory,
NULL, //Memory offset
NULL //DeviceOffset
);
if (FAILED(hr))
{
pWdfRequest->Complete(hr);
}
else
{
ForwardFormattedRequest(pWdfRequest, m_Device->GetInputPipe());
}
SAFE_RELEASE(pOutputMemory);
return;
}
示例9: owner
HRESULT
CMyDevice::SetPowerManagement(
VOID
)
/*++
Routine Description:
This method enables the idle and wake functionality
using UMDF. UMDF has been set as the power policy
owner (PPO) for the device stack and we are using power
managed queues.
Arguments:
None
Return Value:
Status
--*/
{
HRESULT hr;
//
// Enable USB selective suspend on the device.
//
hr = m_FxDevice->AssignS0IdleSettings( IdleUsbSelectiveSuspend,
PowerDeviceMaximum,
IDLE_TIMEOUT_IN_MSEC,
IdleAllowUserControl,
WdfUseDefault);
if (FAILED(hr))
{
TraceEvents(TRACE_LEVEL_ERROR,
TEST_TRACE_DEVICE,
"%!FUNC! Unable to assign S0 idle settings for the device %!HRESULT!",
hr
);
}
//
// Enable Sx wake settings
//
if (SUCCEEDED(hr))
{
hr = m_FxDevice->AssignSxWakeSettings( PowerDeviceMaximum,
WakeAllowUserControl,
WdfUseDefault);
if (FAILED(hr))
{
TraceEvents(TRACE_LEVEL_ERROR,
TEST_TRACE_DEVICE,
"%!FUNC! Unable to set Sx Wake Settings for the device %!HRESULT!",
hr
);
}
}
return hr;
}
示例10: DriverEntry
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
/*++
Routine Description:
Driver initialization entry point.
This entry point is called directly by the I/O system.
Arguments:
DriverObject - pointer to the driver object
RegistryPath - pointer to a unicode string representing the path,
to driver-specific key in the registry.
Return Value:
NTSTATUS - if the status value is not STATUS_SUCCESS,
the driver will get unloaded immediately.
--*/
{
NTSTATUS status = STATUS_SUCCESS;
WDF_DRIVER_CONFIG config;
WDF_OBJECT_ATTRIBUTES attributes;
//
// Initialize WDF WPP tracing.
//
WPP_INIT_TRACING( DriverObject, RegistryPath );
//
// TraceEvents function is mapped to DoTraceMessage provided by
// WPP by using a directive in the sources file.
//
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT,
"Pci9656 Sample - Driver Framework Edition.");
//
// Initialize the Driver Config structure.
//
WDF_DRIVER_CONFIG_INIT( &config, PLxEvtDeviceAdd );
//
// Register a cleanup callback so that we can call WPP_CLEANUP when
// the framework driver object is deleted during driver unload.
//
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
attributes.EvtCleanupCallback = PlxEvtDriverContextCleanup;
status = WdfDriverCreate( DriverObject,
RegistryPath,
&attributes,
&config,
WDF_NO_HANDLE);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfDriverCreate failed with status %!STATUS!", status);
//
// Cleanup tracing here because DriverContextCleanup will not be called
// as we have failed to create WDFDRIVER object itself.
// Please note that if your return failure from DriverEntry after the
// WDFDRIVER object is created successfully, you don't have to
// call WPP cleanup because in those cases DriverContextCleanup
// will be executed when the framework deletes the DriverObject.
//
WPP_CLEANUP(DriverObject);
}
return status;
}
示例11: PLxEvtDeviceAdd
NTSTATUS
PLxEvtDeviceAdd(
IN WDFDRIVER Driver,
IN PWDFDEVICE_INIT DeviceInit
)
/*++
Routine Description:
EvtDeviceAdd is called by the framework in response to AddDevice
call from the PnP manager. Here the driver should register all the
PNP, power and Io callbacks, register interfaces and allocate other
software resources required by the device. The driver can query
any interfaces or get the config space information from the bus driver
but cannot access hardware registers or initialize the device.
Arguments:
Return Value:
--*/
{
NTSTATUS status = STATUS_SUCCESS;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
WDF_OBJECT_ATTRIBUTES attributes;
WDFDEVICE device;
PDEVICE_EXTENSION devExt = NULL;
UNREFERENCED_PARAMETER( Driver );
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "--> PLxEvtDeviceAdd");
PAGED_CODE();
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//
// Zero out the PnpPowerCallbacks structure.
//
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
//
// Set Callbacks for any of the functions we are interested in.
// If no callback is set, Framework will take the default action
// by itself.
//
pnpPowerCallbacks.EvtDevicePrepareHardware = PLxEvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = PLxEvtDeviceReleaseHardware;
//
// These two callbacks set up and tear down hardware state that must be
// done every time the device moves in and out of the D0-working state.
//
pnpPowerCallbacks.EvtDeviceD0Entry = PLxEvtDeviceD0Entry;
pnpPowerCallbacks.EvtDeviceD0Exit = PLxEvtDeviceD0Exit;
//
// Register the PnP Callbacks..
//
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
//
// Initialize Fdo Attributes.
//
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_EXTENSION);
//
// By opting for SynchronizationScopeDevice, we tell the framework to
// synchronize callbacks events of all the objects directly associated
// with the device. In this driver, we will associate queues and
// and DpcForIsr. By doing that we don't have to worrry about synchronizing
// access to device-context by Io Events and DpcForIsr because they would
// not concurrently ever. Framework will serialize them by using an
// internal device-lock.
//
attributes.SynchronizationScope = WdfSynchronizationScopeDevice;
//
// Create the device
//
status = WdfDeviceCreate( &DeviceInit, &attributes, &device );
if (!NT_SUCCESS(status)) {
//
// Device Initialization failed.
//
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"DeviceCreate failed %!STATUS!", status);
return status;
}
//
// Get the DeviceExtension and initialize it. PLxGetDeviceContext is an inline function
// defined by WDF_DECLARE_CONTEXT_TYPE_WITH_NAME macro in the
// private header file. This function will do the type checking and return
// the device context. If you pass a wrong object a wrong object handle
// it will return NULL and assert if run under framework verifier mode.
//
devExt = PLxGetDeviceContext(device);
devExt->Device = device;
//.........这里部分代码省略.........
示例12: CHECK_HR
VOID
HealthThermometerServiceContent::TemperatureMeasurementEvent(
_In_ BTH_LE_GATT_EVENT_TYPE EventType,
_In_ PVOID EventOutParameter
)
{
HRESULT hr = S_OK;
PBLUETOOTH_GATT_VALUE_CHANGED_EVENT ValueChangedEventParameters = NULL;
TEMPERATURE_MEASUREMENT Measurement = {0};
IPortableDeviceValues * pEventParams = NULL;
BYTE* pBuffer = NULL;
DWORD cbBuffer = 0;
if (CharacteristicValueChangedEvent != EventType) {
return;
}
ValueChangedEventParameters = (PBLUETOOTH_GATT_VALUE_CHANGED_EVENT)EventOutParameter;
//
// Our value is at least 5 bytes
//
if (5 > ValueChangedEventParameters->CharacteristicValue->DataSize) {
hr = E_FAIL;
CHECK_HR(hr, "Invalid data size: %d, expencting at least 5 bytes",
ValueChangedEventParameters->CharacteristicValue->DataSize);
}
if (SUCCEEDED(hr))
{
ULONG mantissa = 0;
LONG exponent = 0;
mantissa = (ULONG)(((ULONG)ValueChangedEventParameters->CharacteristicValue->Data[3] << (ULONG)16)
| ((ULONG)ValueChangedEventParameters->CharacteristicValue->Data[2] << (ULONG)8)
| ((ULONG)ValueChangedEventParameters->CharacteristicValue->Data[1] << (ULONG)0));
exponent = 0xFFFFFF00 | (LONG)ValueChangedEventParameters->CharacteristicValue->Data[4];
Measurement.Value = (double)mantissa * pow((double)10.0, (double)exponent);
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FLAG_DEVICE, "Received a value change event, new value [%.2f]", Measurement.Value);
}
//
// Get the timestamp
//
if (SUCCEEDED(hr))
{
FILETIME fTime;
GetSystemTimeAsFileTime(&fTime);
ConvertFileTimeToUlonglong(&fTime, &Measurement.TimeStamp);
}
//
// CoCreate a collection to store the property set event parameters.
//
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceValues,
(VOID**) &pEventParams);
CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues");
}
if (SUCCEEDED(hr))
{
hr = pEventParams->SetGuidValue(WPD_EVENT_PARAMETER_EVENT_ID, EVENT_HealthThermometerService_TemperatureMeasurement);
CHECK_HR(hr, "Failed to add WPD_EVENT_PARAMETER_EVENT_ID");
}
//
// Set the timestamp
//
if (SUCCEEDED(hr))
{
hr = pEventParams->SetUnsignedLargeIntegerValue(EVENT_PARAMETER_HealthTemperatureService_Measurement_TimeStamp, Measurement.TimeStamp);
CHECK_HR(hr, "Failed to add EVENT_PARAMETER_HealthTemperatureService_Measurement_TimeStamp");
}
//
// Set the measurement Value
//
if (SUCCEEDED(hr))
{
hr = pEventParams->SetFloatValue(EVENT_PARAMETER_HealthTemperatureService_Measurement_Value, (float)Measurement.Value);
CHECK_HR(hr, "Failed to add EVENT_PARAMETER_HealthTemperatureService_Measurement_Value");
}
//
// Adding this event parameter will allow WPD to scope this event to the container functional object
//
if (SUCCEEDED(hr))
{
hr = pEventParams->SetStringValue(WPD_EVENT_PARAMETER_OBJECT_PARENT_PERSISTENT_UNIQUE_ID, ParentPersistentUniqueID);
CHECK_HR(hr, "Failed to add WPD_EVENT_PARAMETER_OBJECT_PARENT_PERSISTENT_UNIQUE_ID");
//.........这里部分代码省略.........
示例13: ExecuteOpcode
FORCEINLINE
NTSTATUS
ExecuteOpcode (
__in PUCHAR SpiBar,
__in UCHAR OpcodeIndex,
__in ULONG Offset
)
{
NTSTATUS Status;
ULONG SwSeqRegs;
LONG Timeout;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_HW_ACCESS, "--> ExecuteOpcode\n");
Timeout = TIMEOUT;
TraceEvents(TRACE_LEVEL_ERROR, DBG_HW_ACCESS, "SSFS_SSFC: 0x%08x.\n", READ_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET)));
do {
SwSeqRegs = READ_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET));
if ((SwSeqRegs & SSFS_SCIP) == 0) {
break;
}
KeStallExecutionProcessor(10);
} while (--Timeout > 0);
if (Timeout == 0) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_HW_ACCESS, "SCIP was not cleared.\n");
Status = STATUS_DEVICE_BUSY;
goto End;
}
//
// Program the offset, even if it is not needed (to simplify logic).
// SPI addresses are 24 bits long.
//
WRITE_REGISTER_ULONG((PULONG) (SpiBar + FADDR_OFFSET), (Offset & 0x00FFFFFF));
//
// Clear error status registers while preserving reserved bits.
//
SwSeqRegs &= SSFS_RESERVED_MASK | SSFC_RESERVED_MASK;
SwSeqRegs |= SSFS_CDS | SSFS_FCERR;
WRITE_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET), SwSeqRegs);
//
// Set the opcode index, relative to the OPMENU register.
//
SwSeqRegs |= ((ULONG) (OpcodeIndex & 0x07)) << (8 + 4);
//
// Start.
//
SwSeqRegs |= SSFC_SCGO;
WRITE_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET), SwSeqRegs);
//
// Wait for any of the Cycle Done Status and Flash Cycle Error registers.
//
Timeout = TIMEOUT;
TraceEvents(TRACE_LEVEL_ERROR, DBG_HW_ACCESS, "SSFS_SSFC: 0x%08x.\n", READ_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET)));
while ((READ_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET)) & (SSFS_CDS | SSFS_FCERR)) == 0
&& --Timeout > 0) {
KeStallExecutionProcessor(10);
}
if (Timeout == 0) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_HW_ACCESS, "Timeout while waiting for a cycle to complete.\n");
Status = STATUS_TIMEOUT;
goto End;
}
SwSeqRegs = READ_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET));
if (SwSeqRegs & SSFS_FCERR) {
TraceEvents(TRACE_LEVEL_ERROR, DBG_HW_ACCESS, "Transaction error.\n");
SwSeqRegs &= SSFS_RESERVED_MASK | SSFC_RESERVED_MASK;
WRITE_REGISTER_ULONG((PULONG) (SpiBar + SSFS_SSFC_OFFSET), SwSeqRegs | SSFS_FCERR);
Status = STATUS_DEVICE_DATA_ERROR;
goto End;
}
End:
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_HW_ACCESS, "<-- ExecuteOpcode\n");
return Status;
}
示例14: BthEchoCliRetrievePsmFromSdpRecord
NTSTATUS
BthEchoCliRetrievePsmFromSdpRecord(
_In_ PBTHDDI_SDP_PARSE_INTERFACE SdpParseInterface,
_In_ PBTH_SDP_STREAM_RESPONSE ServerSdpRecord,
_Out_ USHORT * Psm
)
/*++
Description:
Retrieve PSM from the SDP record
Arguments:
sdpParseInterface - Parse interface used for sdp parse functions
ServerSdpRecord - SDP record to obtain Psm from
Psm - Psm retrieved
Return Value:
NTSTATUS Status code.
--*/
{
NTSTATUS status = STATUS_SUCCESS;
PUCHAR nextElement;
ULONG nextElementSize;
PSDP_TREE_ROOT_NODE sdpTree = NULL;
PSDP_NODE nodeProtoDescList = NULL;
PSDP_NODE nodeProto0 = NULL;
PSDP_NODE nodeProto0UUID = NULL;
PSDP_NODE nodeProto0SParam0 = NULL;
SdpParseInterface->SdpGetNextElement(
&(ServerSdpRecord->response[0]),
ServerSdpRecord->responseSize,
NULL,
&nextElement,
&nextElementSize
);
if(nextElementSize == 0)
{
status = STATUS_DEVICE_DATA_ERROR;
TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,
"Getting first element from SDP record failed, returning status code %!STATUS!\n", status);
goto exit;
}
status = SdpParseInterface->SdpConvertStreamToTree(
nextElement,
nextElementSize,
&sdpTree,
POOLTAG_BTHECHOSAMPLE
);
if(!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,
"Converting SDP record to tree failed, status code %!STATUS!\n", status);
goto exit;
}
//
//Find PROTOCOL_DESCRIPTOR_LIST in the tree
//
status = SdpParseInterface->SdpFindAttributeInTree(
sdpTree,
(USHORT)SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST,
&nodeProtoDescList
);
if(!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_SDP,
"FindAttribute failed for SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST, status code %!STATUS!\n", status);
goto exit0;
}
if(nodeProtoDescList->hdr.Type != SDP_TYPE_SEQUENCE)
{
goto SdpFormatError;
}
//
// Get the next sequence.
//
if(nodeProtoDescList->u.sequence.Link.Flink == NULL)
{
goto SdpFormatError;
}
nodeProto0 = CONTAINING_RECORD(nodeProtoDescList->u.sequence.Link.Flink, SDP_NODE, hdr.Link);
if(nodeProto0->hdr.Type != SDP_TYPE_SEQUENCE)
{
goto SdpFormatError;
}
//.........这里部分代码省略.........
示例15: FireShockEvtIoDeviceControl
VOID
FireShockEvtIoDeviceControl(
_In_ WDFQUEUE Queue,
_In_ WDFREQUEST Request,
_In_ size_t OutputBufferLength,
_In_ size_t InputBufferLength,
_In_ ULONG IoControlCode
)
/*++
Routine Description:
This event is invoked when the framework receives IRP_MJ_DEVICE_CONTROL request.
Arguments:
Queue - Handle to the framework queue object that is associated with the
I/O request.
Request - Handle to a framework request object.
OutputBufferLength - Size of the output buffer in bytes
InputBufferLength - Size of the input buffer in bytes
IoControlCode - I/O control code.
Return Value:
VOID
--*/
{
NTSTATUS status = STATUS_SUCCESS;
size_t bufferLength;
size_t transferred = 0;
PDEVICE_CONTEXT pDeviceContext;
PFIRESHOCK_GET_HOST_BD_ADDR pGetHostAddr;
PFIRESHOCK_GET_DEVICE_BD_ADDR pGetDeviceAddr;
PFIRESHOCK_SET_HOST_BD_ADDR pSetHostAddr;
PFIRESHOCK_GET_DEVICE_TYPE pGetDeviceType;
TraceEvents(TRACE_LEVEL_INFORMATION,
TRACE_QUEUE,
"%!FUNC! Queue 0x%p, Request 0x%p OutputBufferLength %d InputBufferLength %d IoControlCode %d",
Queue, Request, (int)OutputBufferLength, (int)InputBufferLength, IoControlCode);
pDeviceContext = DeviceGetContext(WdfIoQueueGetDevice(Queue));
switch (IoControlCode)
{
#pragma region IOCTL_FIRESHOCK_GET_HOST_BD_ADDR
case IOCTL_FIRESHOCK_GET_HOST_BD_ADDR:
TraceEvents(TRACE_LEVEL_INFORMATION,
TRACE_QUEUE, "IOCTL_FIRESHOCK_GET_HOST_BD_ADDR");
status = WdfRequestRetrieveOutputBuffer(
Request,
sizeof(FIRESHOCK_GET_HOST_BD_ADDR),
(LPVOID)&pGetHostAddr,
&bufferLength);
if (NT_SUCCESS(status) && OutputBufferLength == sizeof(FIRESHOCK_GET_HOST_BD_ADDR))
{
transferred = OutputBufferLength;
RtlCopyMemory(&pGetHostAddr->Host, &pDeviceContext->HostAddress, sizeof(BD_ADDR));
}
break;
#pragma endregion
#pragma region IOCTL_FIRESHOCK_GET_DEVICE_BD_ADDR
case IOCTL_FIRESHOCK_GET_DEVICE_BD_ADDR:
TraceEvents(TRACE_LEVEL_INFORMATION,
TRACE_QUEUE, "IOCTL_FIRESHOCK_GET_DEVICE_BD_ADDR");
status = WdfRequestRetrieveOutputBuffer(
Request,
sizeof(FIRESHOCK_GET_DEVICE_BD_ADDR),
(LPVOID)&pGetDeviceAddr,
&bufferLength);
if (NT_SUCCESS(status) && OutputBufferLength == sizeof(FIRESHOCK_GET_DEVICE_BD_ADDR))
{
transferred = OutputBufferLength;
RtlCopyMemory(&pGetDeviceAddr->Device, &pDeviceContext->DeviceAddress, sizeof(BD_ADDR));
}
break;
#pragma endregion
#pragma region IOCTL_FIRESHOCK_SET_HOST_BD_ADDR
case IOCTL_FIRESHOCK_SET_HOST_BD_ADDR:
//.........这里部分代码省略.........