1 /* libusb-win32, Generic Windows USB Library
2  * Copyright (c) 2002-2005 Stephan Meyer <ste_meyer@web.de>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18 
19 
20 #include "libusb_driver.h"
21 
22 
get_configuration(libusb_device_t * dev,unsigned char * configuration,int * ret,int timeout)23 NTSTATUS get_configuration(libusb_device_t *dev,
24                            unsigned char *configuration, int *ret,
25                            int timeout)
26 {
27     NTSTATUS status = STATUS_SUCCESS;
28     URB urb;
29 
30 	USBMSG("timeout: %d\n", timeout);
31 
32     memset(&urb, 0, sizeof(URB));
33 
34     urb.UrbHeader.Function = URB_FUNCTION_GET_CONFIGURATION;
35     urb.UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST);
36     urb.UrbControlGetConfigurationRequest.TransferBufferLength = 1;
37     urb.UrbControlGetConfigurationRequest.TransferBuffer = configuration;
38 
39 
40     status = call_usbd(dev, &urb, IOCTL_INTERNAL_USB_SUBMIT_URB, timeout);
41 
42     if (!NT_SUCCESS(status) || !USBD_SUCCESS(urb.UrbHeader.Status))
43     {
44         USBERR("getting configuration failed: status: 0x%x, urb-status: 0x%x\n",
45                     status, urb.UrbHeader.Status);
46         *ret = 0;
47     }
48     else
49     {
50         USBMSG("current configuration is: %d\n",
51                       *configuration);
52         *ret = urb.UrbControlGetConfigurationRequest.TransferBufferLength;
53     }
54 
55     return status;
56 }
57