diff options
Diffstat (limited to 'host/windows/usb/driver/android_usb_file_object.cpp')
| -rw-r--r-- | host/windows/usb/driver/android_usb_file_object.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/host/windows/usb/driver/android_usb_file_object.cpp b/host/windows/usb/driver/android_usb_file_object.cpp new file mode 100644 index 000000000..e5ce0a26b --- /dev/null +++ b/host/windows/usb/driver/android_usb_file_object.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** \file + This file consists of implementation of class AndroidUsbFileObject that + encapsulates a common extension for all KMDF file object types. +*/ +#pragma data_seg() +#pragma code_seg() + +#include "precomp.h" +#include "android_usb_file_object.h" + +#pragma data_seg() +#pragma code_seg("PAGE") + +AndroidUsbFileObject::AndroidUsbFileObject(AndroidUsbFileObjectType fo_type, + AndroidUsbDeviceObject* dev_obj, + WDFFILEOBJECT wdf_fo) + : AndroidUsbWdfObject(AndroidUsbWdfObjectTypeFile), + file_type_(fo_type), + device_object_(dev_obj) { + ASSERT_IRQL_PASSIVE(); + ASSERT(NULL != dev_obj); + ASSERT(fo_type < AndroidUsbFileObjectTypeMax); + ASSERT(NULL != wdf_fo); + set_wdf_object(wdf_fo); +} + +#pragma code_seg() + +AndroidUsbFileObject::~AndroidUsbFileObject() { + ASSERT_IRQL_LOW_OR_DISPATCH(); +} + +#pragma code_seg("PAGE") + +NTSTATUS AndroidUsbFileObject::Initialize() { + ASSERT_IRQL_LOW(); + ASSERT(NULL != wdf_file()); + if (NULL == wdf_file()) + return STATUS_INTERNAL_ERROR; + + // Register context for this file object + return InitializeContext(); +} + +#pragma code_seg() + +void AndroidUsbFileObject::OnEvtIoRead(WDFREQUEST request, + size_t length) { + ASSERT_IRQL_LOW_OR_DISPATCH(); + ASSERT(WdfRequestGetFileObject(request) == wdf_file()); + // Complete zero reads with success + if (0 == length) { + WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); + return; + } + + WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); +} + +void AndroidUsbFileObject::OnEvtIoWrite(WDFREQUEST request, + size_t length) { + ASSERT_IRQL_LOW_OR_DISPATCH(); + ASSERT(WdfRequestGetFileObject(request) == wdf_file()); + // Complete zero writes with success + if (0 == length) { + WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); + return; + } + + WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); +} + +void AndroidUsbFileObject::OnEvtIoDeviceControl(WDFREQUEST request, + size_t output_buf_len, + size_t input_buf_len, + ULONG ioctl_code) { + ASSERT_IRQL_LOW_OR_DISPATCH(); + ASSERT(WdfRequestGetFileObject(request) == wdf_file()); + + WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); +} + +#pragma data_seg() +#pragma code_seg() |
