MB Interface Model Supplement
The Microsoft OS descriptor is broken up into the following segments:
- One Microsoft OS string descriptor
- One or more Microsoft OS feature descriptors
To support the OS descriptor, the device must implement the string descriptor. String Descriptor
The Microsoft OS string descriptor is a string that is stored at string index 0xEE. The format of this string is well defined.
The Microsoft OS String Descriptor is used to achieve the following objectives
- The presence of the Microsoft OS string descriptor indicates to the operating system that the device has information embedded in it, in the form of Microsoft OS feature descriptors.
- The Microsoft OS string descriptor has an embedded signature field that is used to differentiate it from random strings that might happen to be on a device at string index 0xEE.
- The Microsoft OS string descriptor also has an embedded version number that allows for future revisions of the Microsoft OS descriptor.
Only one Microsoft OS string descriptor is stored on a device. The following sections describe the structure of the Microsoft OS string descriptor and its retrieval procedure. Structure of the OS string
Here is the structure of the string descriptor:
String Descriptor Structure
Field | Length (Bytes) | Value | Description |
---|---|---|---|
bLength |
1 |
0x12 |
Length of the descriptor |
bDescriptorType |
1 |
0x03 |
String descriptor |
qwSignature |
14 |
"MSFT100" |
Signature field (4D00530046005400310030003000) |
bMS_VendorCode |
1 |
Vendor Code |
Vendor code to fetch other OS feature descriptors |
bPad |
1 |
0x00 |
Pad field |
The structure of the Microsoft OS string descriptor is fixed for version 1.00 and has an overall length of 18 bytes. The version number of the Microsoft OS string descriptor is listed in the qwSignature field. The information stored in the bMS_VendorCode field must be a single byte value. It will be used to retrieve Microsoft OS feature descriptors, and this byte value is used in the bmRequestType field described as follows:
Retrieving the OS string descriptor
To retrieve the information stored in the string, a standard GET_DESCRIPTOR request must be issued to the device. Here is the format of the request:
Standard Get_Descriptor String Request
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
1000 0000b |
GET_DESCRIPTOR |
0x03EE |
0x0000 |
0x12 |
Returns the string |
The bmRequestType field is a bitmap composed of three parts—direction of data transfer, descriptor type, and recipient. According to the USB specification, the value of bmRequestType is set to 1000 0000b (0x80).
For a GET_DESCRIPTOR request, the wValue field is split into two parts. The high byte stores the descriptor type and the low byte stores the descriptor index. To retrieve the Microsoft OS string descriptor, the high byte should be set to retrieve a string descriptor—0x03. Because the Microsoft OS string descriptor is always stored at index 0xEE, this string index should be stored in the lower byte of the wValue field.
The wIndex is used to store the language ID, but it must be set to zero for a Microsoft OS string descriptor.
The wLength field is used to indicate the length of the string descriptor to be retrieved. The device should respond to any valid range from 0x02–0xFF.
If a device does not have a valid descriptor at the corresponding address (0xEE), it will respond with a request error or stall. When devices do not respond with a stall, a single-ended zero reset will be issued to the device (to recover it, if it should go into an unknown state).
Verifying the integrity of the OS descriptor
Because vendors are allowed to use any string ID to store information, the operating system must verify that the string stored in index 0xEE is indeed the Microsoft OS string descriptor. To verify this, the following tests will be conducted. Failure of either will inhibit retrieval of the Microsoft OS feature descriptors.
- If a vendor stores a string in index location 0xEE, the operating system will retrieve the string and query it to see if it is the Microsoft OS string. This can be verified by comparing the signature field in the string to the signature field entry specified previously. A mismatch would prevent further parsing of the string.
- The second test will include a verification of the length of the string based on the version number specified in the signature field. The version number specified (in the string "MSFT100") is 1.00. This corresponds to an 18-byte string descriptor.
Microsoft OS string descriptor constraints
The following constraints apply to Microsoft OS string descriptors and their retrieval:
- To store information in compliance with the Microsoft OS descriptor specification, the device must have one and only Microsoft OS string descriptor that is in compliance with the information outlined in Microsoft OS Descriptors.
- A device vendor is free to use any value in the bMS_VendorCode field in the Microsoft OS string descriptor
Feature Descriptor
A feature descriptor is a fixed-format descriptor that has been defined for a specific purpose.
Retrieving an OS feature descriptor
To retrieve a Microsoft OS feature descriptor, a special GET_MS_DESCRIPTOR request needs to be issued to the device. Here is the format of the request:
Standard device request format
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
1100 0000b |
GET_MS_DESCRIPTOR |
X |
Feature Index |
Length |
Returns descriptor |
The bmRequestType field is a bitmap composed of three parts—direction of data transfer, descriptor type, and recipient—and is in accordance with the USB specification. The Microsoft OS feature descriptor is a vendor-specific descriptor and the direction of data transfer is from the device to the host. Therefore, the value of bmRequestType is set to 1100 0000b (0xC0).
The bRequest field is used to indicate the format of the request. To retrieve a Microsoft OS feature descriptor, the bRequest field should be populated with a special GET_MS_DESCRIPTOR byte. The value of this byte is indicated by the bMS_VendorCode, which is retrieved from the Microsoft string descriptor. For more information about the retrieval of the Microsoft OS string descriptor, see Retrieving the OS string descriptor.
The wValue field is put to special use and is broken up into a high byte and a low byte. The high byte is used to store the interface number. This is essential for storing feature descriptors on a per interface basis, especially for composite devices, or devices with multiple interfaces. In most cases, interface 0 will be used. The low byte is used to store a page number. This feature prevents descriptors from having a size boundary of 64 KB (a limit set by the size of the wLength field). A descriptor will be fetched with the page value initially set to zero. If a full descriptor (size is 64 KB) is received, the page value will be incremented by one and the request for the descriptor will be sent again (this time with the incremented page value). This process will repeat until a descriptor with a size less than 64 KB is received. Note that the maximum number of pages is 255, which places a limit of 16 MB on the descriptor size.
The wIndex field stores the feature index number for the Microsoft OS feature descriptor being retrieved. Microsoft will maintain this list of Microsoft OS feature descriptors and indexes. To learn more about Microsoft OS feature descriptors, see Microsoft OS Descriptors.
The wLength field specifies the length of the descriptor to be fetched. If the descriptor is longer than the number of bytes stated in the wLength field, only the initial bytes of the descriptor are returned. If it is shorter than the value specified in the wLength field, a short packet is returned.
If a particular OS descriptor is not present, the device will issue a request error or stall.
Microsoft OS feature descriptor constraints
The following constraints apply to Microsoft OS feature descriptors and their retrieval.
- All Microsoft OS feature descriptors are defined and standardized. Vendors are not allowed to modify, append, or create Microsoft OS feature descriptors without direct consent from Microsoft.
- All Microsoft OS feature descriptors will have a size and version number embedded in them. These values should always report correct information to the operating system.
- A device can have more than one Microsoft OS feature descriptor embedded in its firmware.
- Some Microsoft OS feature descriptors are stored on a per-interface level, while others are unique to the device. Device-level Microsoft OS feature descriptors should set the high byte of the wValue field as zero.
Structure of the feature descriptor
To identify itself as capable of supporting MBIM, a device must also support the extended configuration descriptor, which is one of the defined feature descriptors. The structure of this descriptor is as follows.
Header section
The header section stores information about the rest of the extended configuration descriptor. The dwLength field contains the length of the entire extended configuration descriptor. The header section also contains a version number, which will be initially set to 1.00 (0100H). Future revisions of this descriptor may be released at a later stage. Note that future versions of the extended configuration descriptor might also need to increase the number of entries in the header section, so please verify that this number is accurately stored in the device and read by the operating system.
Extended configuration descriptor header section
Offset | Field | Size | Value | Description |
---|---|---|---|---|
0 |
dwLength |
4 |
Unsigned DWORD |
The length field describes the length of the extended configuration descriptor, in bytes. |
4 |
bcdVersion |
2 |
BCD |
Extended configuration descriptor release number in Binary Coded Decimal (for example, version 1.00 is 0100H). |
6 |
wIndex |
2 |
WORD |
Fixed = 0x0004 |
8 |
bCount |
1 |
BYTE |
Total number of function sections that follow the header section = 0x01 |
9 |
RESERVED |
7 |
RESERVED |
Function section
The function section provides two important pieces of information. It groups consecutive interfaces that serve a similar purpose into function groups, and provides compatible and subcompatible IDs for each function.
Here is the format of the function section, including values that should be used by an MBIM device:
Extended configuration descriptor function section
Offset¹ | Field | Size | Value | Description |
---|---|---|---|---|
0 |
bFirstInterfaceNumber |
1 |
Byte |
Starting interface number for this function = 0x00 |
1 |
bInterfaceCount |
1 |
Byte |
Total number of Interfaces that must be included to from this function = 0x01 |
2 |
compatibleID |
8 |
Bytes |
Compatible ID |
10 |
subCompatibleID |
8 |
Bytes |
Subcompatible ID |
18 |
RESERVED |
6 |
RESERVED = 0 |
¹Offset of the custom property section has been reset to zero. To calculate the offset of a field from the beginning of the extended configuration descriptor, add the length of the sections that precede it.
Compatible and Subcompatible IDs based on the configuration exposing the MBIM function
bConfiguration | compatibleID | subCompatibleID |
---|---|---|
2 |
ALTRCFG (0x41 0x4C 0x54 0x52 0x43 0x46 0x47 0x00) |
20000000 (0x32 0x00 0x00 0x00 0x00 0x00 0x00 0x00) |
3 |
ALTRCFG (0x41 0x4C 0x54 0x52 0x43 0x46 0x47 0x00) |
30000000 (0x33 0x00 0x00 0x00 0x00 0x00 0x00 0x00) |
4 |
ALTRCFG (0x41 0x4C 0x54 0x52 0x43 0x46 0x47 0x00) |
40000000 (0x34 0x00 0x00 0x00 0x00 0x00 0x00 0x00) |
- bConfiguration refers to the bConfiguration value within the USB configuration descriptor of the configuration that exposes the MBIM function. bConfiguration cannot be 1 because that is the default configuration exposing only the CDROM function. bConfiguration cannot be greater than 4; that is, the MBIM function should be exposed within the first four configurations.
- compatibleID remains the same for all configurations. The subcompatibleID changes based on the configuration
Example
This table shows a sample multi-configuration scenario. The table lists the functions available in each configuration and the actions that different versions of the operating system takes for each of these configurations:
Example of a multi-configuration mobile broadband device
bConfiguration | 1 (Windows-7-Configuration) | 2 (IHV-NCM-1.0-Configuration) | 3 (Windows-8-Configuration) | 3 (IHV-NCM-2.0-Configuration) |
---|---|---|---|---|
Functions exposed |
CDROM SD |
CD-ROM SD NCM1.0 Modem TV GPS FP PC/SC smart card Voice Diag |
CD-ROM SD MBIM |
CD-ROM SD NCM2.0 Modem TV GPS FP PC/SC smart card Voice Diag |
The following tables show the values used by the Microsoft OS string descriptor and the Microsoft OS extended configuration feature descriptor for the previous sample’s multi-configuration scenario.
Example of a multi-configuration mobile broadband device
Field | Length (Bytes) | Value |
---|---|---|
bLength |
1 |
0x12 |
bDescriptorType |
1 |
0x03 |
qwSignature |
14 |
‘MSFT100’ 0x4D 0x00 0x53 0x00 0x46 0x00 0x54 0x00 0x31 0x00 0x30 0x00 0x30 0x00 |
bMS_VendorCode |
1 |
0xA5 |
bPad |
1 |
0x00 |
Example Microsoft OS extended configuration feature descriptor header
Offset | Field | Size | Value |
---|---|---|---|
0 |
dwLength |
4 |
16 |
4 |
bcdVersion |
2 |
0100H |
6 |
wIndex |
2 |
0x0004 |
8 |
bCount |
1 |
1 |
9 |
RESERVED |
7 |
Example Microsoft OS extended configuration feature descriptor function
Offset² | Field | Size | Value |
---|---|---|---|
0 |
bFirstInterfaceNumber |
1 |
|
1 |
bInterfaceCount |
1 |
|
2 |
compatibleID |
8 |
|
10 |
subCompatibleID |
8 |
|
18 |
RESERVED |
6 |
²Offset of the custom property section has been reset to zero. To calculate the offset of a field from the beginning of the extended configuration descriptor, add the length of the sections that precede it.