I bet you see this quite often: Error code: 0xFFF00XXX blah, blah, blah if it does not help please contact your system administrator or, in case of Windows Media Player (WMP), your content provider. But what if you are that system administrator or content provider people should contact. What do you do then? You "Google" the error code and few things come up. You dismiss those search results that say to contact you and … nothing is left. It happened to me when I worked on DRM license acquisition for WMP. In this article, I would like to share my research about specific DRM error codes.
Recently, as I already mentioned, I have been working with Microsoft DRM. My task was to deliver a license to a user’s desktop from a license server. Only one license was allowed per media file. If a user is not eligible to receive anymore licenses the license server would send an HTTP response with 403 status code and nicely crafted error massage in its context. Please note that DRM license acquisition utilizes HTTP.
I thought I could just simply display the error message that came with the HTTP response to the user. It would provide a pleasant experience to the user by explaining nicely and clearly about the encountered problem. It will also make me happy, as I'll able to make a simple and elegant solution. "Not so fast cowboy" – stated the WMP API – "I will give you only an error code, no access to HTTP header or/and context whatsoever, gee, and now try to figure out what those error codes mean". I can still hear its giggling.
I decided to conduct a simple experiment. On every license request from a user’s desktop I would send a response from an HTTP server with different HTTP status code and see what error code WMP returns.
Here is the C code that I used to request DRM licenses:
#define CLEANLICOBJ pLicense->Release(); \
IRMGetLicense* pLicense = NULL;
HRESULT hr = CoCreateInstance(
CComBSTR bstrXMLDoc, bstrDRMVersion, bstrURL;
hr = pLicense->raw_GetDRMVersion(&bstrDRMVersion);
hr = pLicense->raw_GetSystemInfo(&bstrXMLDoc);
for( int i = 0; i < STATUSCODESMAX; i++ )
hr = pLicense->raw_GetLicenseFromURL(bstrXMLDoc, bstrURL);
Here is an excerpt of ASP.NET server side code:
protected void Page_Load(object sender, EventArgs e)
int code = Convert.ToInt32(Request["statuscode"]);
HttpStatusCode statusCode =
Response.StatusCode = statusCode.StatusCode;
Now this is the time for the error codes:
|Error Code||HTTP Status Code||HTTP Reason Phrase|
|0xC00D2EE3||405||Method Not Allowed|
|0xC00D2EF6||407||Proxy Authentication Required|
|0xC00D275E||413||Request Entity Too Large|
|0xC00D275E||414||Request-URI Too Large|
|0xC00D275E||415||Unsupported Media Type|
|0xC00D2EE2||500||Internal Server Error|
|0xC00D275E||505||HTTP Version not supported|
HTTP Status code 100 – "Continue" and 101 - "Switching Protocols" are not included as they would hang HTTP communication as they are suppose to.
The following error codes are worth noticing:
- 0xC00D2712: WMP has not received a license blob.
- 0xC00D2EFB: WMP likely has no credentials required to access to the server.
- 0xC00D2EE6: more likely to occur when WMP hits a wrong URL.
- 0xC00D2EE2: it is definitely time to contact the content provider!.
- 0xC00D275E: just very popular ;~).
I hope this article sheds some light on WMP error codes. Also you can find a sample of C code to request a license from a DRM server.
Please check these useful links for Windows Media Player error codes: