| /* |
| * 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() |