summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.hgtags1
-rwxr-xr-xBuildParams118
-rwxr-xr-xautobuild.xml184
-rwxr-xr-xbuild.sh144
-rwxr-xr-xdoc/LICENSE-logos.txt2
-rwxr-xr-xdoc/LICENSE-source.txt4
-rwxr-xr-xindra/CMakeLists.txt3
-rwxr-xr-xindra/cmake/run_build_test.py161
-rw-r--r--indra/cmake/windows-rcs.html15157
-rwxr-xr-xindra/doxygen/CMakeLists.txt28
-rw-r--r--indra/doxygen/Doxyfile.in1557
-rwxr-xr-xindra/llcommon/CMakeLists.txt2
-rw-r--r--indra/llcommon/llcallbacklist.cpp230
-rw-r--r--[-rwxr-xr-x]indra/llcommon/llcallbacklist.h (renamed from indra/newview/llcallbacklist.h)21
-rwxr-xr-xindra/llcommon/llmemory.h7
-rw-r--r--indra/llcommon/llmutex.h4
-rwxr-xr-xindra/llcommon/llstl.h4
-rwxr-xr-xindra/llcorehttp/CMakeLists.txt4
-rwxr-xr-xindra/llmath/llvolume.cpp25
-rwxr-xr-xindra/llmath/llvolume.h6
-rwxr-xr-xindra/llmath/m4math.cpp13
-rwxr-xr-xindra/llmath/m4math.h5
-rwxr-xr-xindra/llprimitive/CMakeLists.txt10
-rw-r--r--indra/llprimitive/lldaeloader.cpp2436
-rw-r--r--indra/llprimitive/lldaeloader.h107
-rwxr-xr-xindra/llprimitive/llmodel.cpp1313
-rwxr-xr-xindra/llprimitive/llmodel.h129
-rw-r--r--indra/llprimitive/llmodelloader.cpp640
-rw-r--r--indra/llprimitive/llmodelloader.h212
-rwxr-xr-xindra/llprimitive/lltextureentry.h4
-rwxr-xr-xindra/newview/CMakeLists.txt22
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rwxr-xr-xindra/newview/app_settings/settings.xml33
-rwxr-xr-xindra/newview/llappviewer.h19
-rw-r--r--[-rwxr-xr-x]indra/newview/llcallbacklist.cpp0
-rwxr-xr-xindra/newview/llcommandhandler.cpp12
-rwxr-xr-xindra/newview/lldrawpoolavatar.cpp8
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp3055
-rwxr-xr-xindra/newview/llfloatermodelpreview.h132
-rwxr-xr-xindra/newview/llmeshrepository.cpp375
-rwxr-xr-xindra/newview/llmeshrepository.h50
-rwxr-xr-xindra/newview/lltexturefetch.cpp3
-rwxr-xr-xindra/newview/llvovolume.cpp4
-rwxr-xr-xindra/newview/llwindowlistener.cpp4
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_model_preview.xml38
45 files changed, 22358 insertions, 3930 deletions
diff --git a/.hgtags b/.hgtags
index f05b8bd17a..0cc10b0100 100755
--- a/.hgtags
+++ b/.hgtags
@@ -507,3 +507,4 @@ d07f76c5b9860fb87924d00ca729f7d4532534d6 3.7.29-release
3f61ed662347dc7c6941b8266e72746a66d90e2a 3.8.1-release
3a62616f3dd8bd512fcdfd29ef033b2505b11213 3.8.2-release
60572f718879f786f6bc8b5c9373ebebf4693078 3.8.3-release
+27e3cf444c4cc645884960a61325a9ee0e9a2d0f 3.8.4-release
diff --git a/BuildParams b/BuildParams
index aeea3b1246..22b13ff6b6 100755
--- a/BuildParams
+++ b/BuildParams
@@ -77,121 +77,9 @@ additional_packages = "EDU"
EDU_sourceid = ""
EDU_viewer_channel_suffix = "edu"
-# Notifications - to configure email notices, add a setting like this:
-# <username>_<reponame>.email = <email-address>
+# Notifications - to configure email notices use the TeamCity parameter
+# setting screen for your project or build configuration to set the
+# environment variable 'email' to a space-separated list of email addresses
-# ========================================
-# mesh-development
-# ========================================
-mesh-development.viewer_channel = "Project Viewer - Mesh"
-mesh-development.viewer_grid = aditi
-mesh-development.build_debug_release_separately = true
-mesh-development.build_CYGWIN_Debug = false
-mesh-development.build_viewer_update_version_manager = false
-
-# ========================================
-# mesh-development-release-1-candidate
-# ========================================
-mesh-development-release-1-candidate.viewer_channel = "Project Viewer - Mesh"
-mesh-development-release-1-candidate.viewer_grid = agni
-mesh-development-release-1-candidate.build_debug_release_separately = true
-mesh-development-release-1-candidate.build_CYGWIN_Debug = false
-mesh-development-release-1-candidate.build_viewer_update_version_manager = false
-
-# ========================================
-# mesh-development-rc
-# ========================================
-mesh-development-rc.viewer_channel = "Project Viewer - Mesh"
-mesh-development-rc.viewer_grid = agni
-mesh-development-rc.build_debug_release_separately = true
-mesh-development-rc.build_CYGWIN_Debug = false
-mesh-development-rc.build_viewer_update_version_manager = false
-
-# ========================================
-# mesh-asset-deprecation
-# ========================================
-mesh-asset-deprecation.viewer_channel = "Project Viewer - Mesh Asset Deprecation"
-mesh-asset-deprecation.viewer_grid = aditi
-mesh-asset-deprecation.build_debug_release_separately = true
-mesh-asset-deprecation.build_CYGWIN_Debug = false
-mesh-asset-deprecation.build_viewer_update_version_manager = false
-
-# ========================================
-# viewer-mesh
-# ========================================
-
-viewer-mesh.build_viewer = true
-viewer-mesh.build_server = false
-viewer-mesh.build_Linux = true
-viewer-mesh.build_hg_bundle = true
-viewer-mesh.build_viewer_update_version_manager = false
-viewer-mesh.build_Debug = false
-viewer-mesh.build_RelWithDebInfo = false
-viewer-mesh.viewer_channel = "Project Viewer - Mesh"
-viewer-mesh.viewer_grid = aditi
-viewer-mesh.email = shining@lists.lindenlab.com
-
-# =================================================================
-# asset delivery 2010 projects
-# =================================================================
-viewer-asset-delivery.viewer_channel = "Second Life Development"
-viewer-asset-delivery.build_viewer_update_version_manager = false
-viewer-asset-delivery.email = monty@lindenlab.com
-viewer-asset-delivery.build_server = false
-viewer-asset-delivery.build_server_tests = false
-
-viewer-asset-delivery-metrics.viewer_channel = "Second Life Development"
-viewer-asset-delivery-metrics.build_viewer_update_version_manager = false
-viewer-asset-delivery-metrics.email = monty@lindenlab.com
-viewer-asset-delivery-metrics.build_server = false
-viewer-asset-delivery-metrics.build_server_tests = false
-
-# ========================================
-# Simon says
-# ========================================
-simon_viewer-dev-private.public_build = false
-simon_viewer-dev-private.email_status_this_is_os = false
-
-
-# ========================================
-# Vir
-# ========================================
-vir-project-1.viewer_channel = "Second Life Release"
-
-# ========================================
-# Merov
-# ========================================
-merov-viewer-maint-2287.viewer_channel = "Second Life Project Merchant Outbox"
-merov-viewer-maint-2287.login_channel = "Second Life Project Merchant Outbox"
-merov-viewer-maint-2287.build_viewer_update_version_manager = false
-merov-viewer-maint-2287.codeticket_add_context = false
-
-# ========================================
-# THX-1138 / Runway projects
-# ========================================
-viewer-thx1138-runway-shared.viewer_channel = "Project Viewer - THX-1138 Runway"
-viewer-thx1138-runway-shared.viewer_grid = uma
-viewer-thx1138-runway-shared.build_debug_release_separately = true
-viewer-thx1138-runway-shared.build_CYGWIN_Debug = false
-viewer-thx1138-runway-shared.build_viewer_update_version_manager = false
-
-viewer-thx1138.viewer_channel = "Project Viewer - THX-1138"
-viewer-thx1138.viewer_grid = uma
-viewer-thx1138.build_debug_release_separately = true
-viewer-thx1138.build_CYGWIN_Debug = false
-viewer-thx1138.build_viewer_update_version_manager = false
-
-runway-merge.viewer_channel = "Project Viewer - Runway Merge"
-runway-merge.viewer_grid = agni
-runway-merge.build_debug_release_separately = true
-runway-merge.build_CYGWIN_Debug = false
-runway-merge.build_viewer_update_version_manager = false
-
-runway.viewer_channel = "Project Viewer - Runway"
-runway.viewer_grid = agni
-runway.build_debug_release_separately = true
-runway.build_CYGWIN_Debug = false
-runway.build_viewer_update_version_manager = false
-# eof
diff --git a/autobuild.xml b/autobuild.xml
index 52d750f64d..9723372351 100755
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -22,9 +22,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>459cdc8d7c19a8025f98f61db95622ff</string>
+ <string>fe724581a16ff7bf3f2e261b8c4ee80e</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/sdl_3p-update-sdl/rev/297546/arch/Linux/installer/SDL-1.2.15-linux-297546.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/sdl_3p-update-sdl/rev/301425/arch/Linux/installer/SDL-1.2.15-linux-301425.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -212,9 +212,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>66849777a83cb69cec3c06b07da7cd3d</string>
+ <string>40bd4dd220749a7f0fc8e4d62e61b4a2</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/Darwin/installer/colladadom-2.3.297450-darwin-297450.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/301371/arch/Darwin/installer/colladadom-2.3.301371-darwin-301371.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -224,9 +224,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>d627c2a679f3afb8d3e090d42f53cd2e</string>
+ <string>7ff636034665555e4b3d918d86ef9566</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/Linux/installer/colladadom-2.3.297450-linux-297450.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/301371/arch/Linux/installer/colladadom-2.3.301371-linux-301371.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -236,16 +236,16 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>220897a1893a188aa9d31efb48909878</string>
+ <string>24e1fac1fd6feef7915c958687fd7c56</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/CYGWIN/installer/colladadom-2.3.297450-windows-297450.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/301371/arch/CYGWIN/installer/colladadom-2.3.301371-windows-301371.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
- <string>2.3.297450</string>
+ <string>2.3.301371</string>
</map>
<key>curl</key>
<map>
@@ -266,9 +266,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>d1c5125650a339a5209f429c70f4d395</string>
+ <string>89db4a1aa22599cf377ae49630b7b5b1</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/297172/arch/Darwin/installer/curl-7.38.0.297172-darwin-297172.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/301717/arch/Darwin/installer/curl-7.42.1.301717-darwin-301717.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -278,9 +278,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>ee6c089ee193e551040d610befc5d1c1</string>
+ <string>de9e0c855ff6ee30c9e027a70bbef032</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/297172/arch/Linux/installer/curl-7.38.0.297172-linux-297172.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/301717/arch/Linux/installer/curl-7.42.1.301717-linux-301717.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -290,16 +290,16 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>fdeca7cbc074a88d2701d74a31d21bd8</string>
+ <string>98d15713de8c439b7f54cc14f2df07ac</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/297172/arch/CYGWIN/installer/curl-7.38.0.297172-windows-297172.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/301717/arch/CYGWIN/installer/curl-7.42.1.301717-windows-301717.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
- <string>7.38.0.297172</string>
+ <string>7.42.1.301717</string>
</map>
<key>db</key>
<map>
@@ -850,9 +850,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>0bf69fbc829d964820b798a0494278c9</string>
+ <string>e294e6ca721e271b4bae8046cfbc3c9b</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Linux/installer/google_breakpad-1413.298033-linux-298033.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298127/arch/Linux/installer/google_breakpad-1413.298127-linux-298127.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1056,9 +1056,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>5c5b4820999ae9e398801d6a46f45897</string>
+ <string>0d586709c1a2e4cf433390bbdd2498ed</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/297312/arch/Darwin/installer/havok_source-2012.1-darwin-297312.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/301432/arch/Darwin/installer/havok_source-2012.1-darwin-301432.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1068,9 +1068,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>6b0f41ddddfa60d8424d8a2e0bc2077d</string>
+ <string>02c85c2c63c8d002b31382f866ca143b</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/296959/arch/Linux/installer/havok_source-2012.1-linux-296959.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/301432/arch/Linux/installer/havok_source-2012.1-linux-301432.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1080,9 +1080,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>ab30ae74a665950d73ea559f019ff358</string>
+ <string>ac8a27020182510fd404177e4a97b70f</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/297566/arch/CYGWIN/installer/havok_source-2012.1-windows-297566.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/301432/arch/CYGWIN/installer/havok_source-2012.1-windows-301432.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -1164,9 +1164,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>b25a4f480e07c670ffef00c3da578f87</string>
+ <string>8084ced172704ff09b364f7af82a2d6f</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297281/arch/Darwin/installer/jsoncpp-0.5.0.297281-darwin-297281.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297580/arch/Darwin/installer/jsoncpp-0.5.0.297580-darwin-297580.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1176,9 +1176,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>5b3b5dbf0c82c1046482a74ce9e11c38</string>
+ <string>910bf12e4b4635170e462b739887cda9</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297281/arch/Linux/installer/jsoncpp-0.5.0.297281-linux-297281.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297580/arch/Linux/installer/jsoncpp-0.5.0.297580-linux-297580.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1368,9 +1368,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>14cb5c8686a472e9e60179e46cd196f7</string>
+ <string>0d134c36fcd87d00d91c99291906dde9</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297708/arch/Darwin/installer/libpng-1.6.8.297708-darwin-297708.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/301387/arch/Darwin/installer/libpng-1.6.8.301387-darwin-301387.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@@ -1380,9 +1380,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>6dec32fc2527f8cafd616f9271ff3478</string>
+ <string>744e22c5fcaaf3483a60e29f217daa9c</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297051/arch/Linux/installer/libpng-1.6.8.297051-linux-297051.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/301387/arch/Linux/installer/libpng-1.6.8.301387-linux-301387.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -1392,16 +1392,16 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>09eb65e66e0230ab01e57e643647a4f1</string>
+ <string>391158e9b5d92a8b69aeb7478144d2de</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297708/arch/CYGWIN/installer/libpng-1.6.8.297708-windows-297708.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/301387/arch/CYGWIN/installer/libpng-1.6.8.301387-windows-301387.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
- <string>1.6.8.297708</string>
+ <string>1.6.8.301387</string>
</map>
<key>libuuid</key>
<map>
@@ -1814,9 +1814,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>b1245d467d5914a266efa16afeb55406</string>
+ <string>65f58cc0b17ebd29fe2b8bccc6bcbf64</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/297553/arch/Linux/installer/open_libndofdev-0.3-linux-297553.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/301464/arch/Linux/installer/open_libndofdev-0.3-linux-301464.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@@ -2393,6 +2393,10 @@
</map>
<key>configure</key>
<map>
+ <key>arguments</key>
+ <array>
+ <string>../indra</string>
+ </array>
<key>command</key>
<string>cmake</string>
<key>options</key>
@@ -2429,11 +2433,12 @@
</map>
<key>Release</key>
<map>
- <key>build</key>
- <map>
- </map>
<key>configure</key>
<map>
+ <key>arguments</key>
+ <array>
+ <string>../indra</string>
+ </array>
<key>command</key>
<string>cmake</string>
<key>options</key>
@@ -2468,6 +2473,25 @@
<key>name</key>
<string>ReleaseOS</string>
</map>
+ <key>Doxygen</key>
+ <map>
+ <key>build</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <string>Doxyfile</string>
+ </array>
+ <key>command</key>
+ <string>doxygen</string>
+ </map>
+ <key>configure</key>
+ <map>
+ <key>command</key>
+ <string>cmake</string>
+ </map>
+ <key>name</key>
+ <string>Doxygen</string>
+ </map>
</map>
<key>name</key>
<string>common</string>
@@ -2478,6 +2502,28 @@
<string>build-darwin-i386</string>
<key>configurations</key>
<map>
+ <key>Doxygen</key>
+ <map>
+ <key>build</key>
+ <map>
+ </map>
+ <key>configure</key>
+ <map>
+ <key>options</key>
+ <array>
+ <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
+ <string>-DWORD_SIZE:STRING=32</string>
+ <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+ <string>-DINSTALL_PROPRIETARY=TRUE</string>
+ </array>
+ <key>arguments</key>
+ <array>
+ <string>../indra</string>
+ </array>
+ </map>
+ <key>name</key>
+ <string>Doxygen</string>
+ </map>
<key>RelWithDebInfo</key>
<map>
<key>build</key>
@@ -2496,10 +2542,6 @@
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
@@ -2554,10 +2596,6 @@
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
@@ -2602,6 +2640,26 @@
<string>build-linux-i686</string>
<key>configurations</key>
<map>
+ <key>Doxygen</key>
+ <map>
+ <key>build</key>
+ <map>
+ </map>
+ <key>configure</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <string>../indra</string>
+ </array>
+ <key>options</key>
+ <array>
+ <string>-G</string>
+ <string>'Unix Makefiles'</string>
+ </array>
+ </map>
+ <key>name</key>
+ <string>Doxygen</string>
+ </map>
<key>RelWithDebInfo</key>
<map>
<key>build</key>
@@ -2615,10 +2673,6 @@
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
@@ -2665,10 +2719,6 @@
</map>
<key>configure</key>
<map>
- <key>arguments</key>
- <array>
- <string>../indra</string>
- </array>
<key>options</key>
<array>
<string>-G</string>
@@ -2768,16 +2818,11 @@
<string>SecondLife.sln</string>
</array>
<key>command</key>
- <string>msbuild.exe</string>
+ <string>devenv</string>
<key>options</key>
<array>
- <string>/p:Configuration=RelWithDebInfo</string>
- <string>/p:Platform=Win32</string>
- <string>/t:Build</string>
- <string>/p:useenv=true</string>
- <string>/verbosity:minimal</string>
- <string>/toolsversion:4.0</string>
- <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+ <string>/build</string>
+ <string>"RelWithDebInfo|Win32"</string>
</array>
</map>
<key>configure</key>
@@ -2854,16 +2899,11 @@
<string>SecondLife.sln</string>
</array>
<key>command</key>
- <string>msbuild.exe</string>
+ <string>devenv</string>
<key>options</key>
<array>
- <string>/p:Configuration=Release</string>
- <string>/p:Platform=Win32</string>
- <string>/t:Build</string>
- <string>/p:useenv=true</string>
- <string>/verbosity:minimal</string>
- <string>/toolsversion:4.0</string>
- <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+ <string>/build</string>
+ <string>"Release|Win32"</string>
</array>
</map>
<key>configure</key>
diff --git a/build.sh b/build.sh
index b66d1a0705..821d38a844 100755
--- a/build.sh
+++ b/build.sh
@@ -1,10 +1,13 @@
#!/bin/sh
-# This is a the master build script - it is intended to be run by the Linden
-# Lab build farm
-# It is called by a wrapper script in the shared repository which sets up
-# the environment from the various BuildParams files and does all the build
-# result post-processing.
+# This is the custom build script for the viewer
+#
+# It must be run by the Linden Lab build farm shared buildscript because
+# it relies on the environment that sets up, functions it provides, and
+# the build result post-processing it does.
+#
+# The shared buildscript build.sh invokes this because it is named 'build.sh',
+# which is the default custom build script name in buildscripts/hg/BuildParams
#
# PLEASE NOTE:
#
@@ -12,7 +15,6 @@
# Cygwin can be tricky....
# * The special style in which python is invoked is intentional to permit
# use of a native python install on windows - which requires paths in DOS form
-# * This script relies heavily on parameters defined in BuildParams
check_for()
{
@@ -94,13 +96,11 @@ installer_CYGWIN()
pre_build()
{
local variant="$1"
- begin_section "Pre$variant"
+ begin_section "Configure $variant"
[ -n "$master_message_template_checkout" ] \
&& [ -r "$master_message_template_checkout/message_template.msg" ] \
&& template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
- check_for "Confirm dictionaries are installed before 'autobuild configure'" ${build_dir}/packages/dictionaries
-
"$autobuild" configure -c $variant -- \
-DPACKAGE:BOOL=ON \
-DRELEASE_CRASH_REPORTING:BOOL=ON \
@@ -109,7 +109,7 @@ pre_build()
-DLL_TESTS:BOOL="$run_tests" \
-DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url
- end_section "Pre$variant"
+ end_section "Configure $variant"
}
package_llphysicsextensions_tpv()
@@ -134,7 +134,7 @@ package_llphysicsextensions_tpv()
echo "${autobuild_package_filename}" > $build_dir/llphysicsextensions_package
fi
else
- echo "Do not provide llphysicsextensions_tpv for $variant"
+ record_event "Do not provide llphysicsextensions_tpv for $variant"
llphysicsextensions_package=""
fi
end_section "PhysicsExtensions_TPV"
@@ -146,16 +146,15 @@ build()
local variant="$1"
if $build_viewer
then
- begin_section "Viewer$variant"
-
"$autobuild" build --no-configure -c $variant
build_ok=$?
- end_section "Viewer$variant"
# Run build extensions
if [ $build_ok -eq 0 -a -d ${build_dir}/packages/build-extensions ]; then
for extension in ${build_dir}/packages/build-extensions/*.sh; do
+ begin_section "Extension $extension"
. $extension
+ end_section "Extension $extension"
if [ $build_ok -ne 0 ]; then
break
fi
@@ -174,28 +173,6 @@ build()
fi
}
-# This is called from the branch independent script upon completion of all platform builds.
-build_docs()
-{
- begin_section "Building Documentation"
- begin_section "Autobuild metadata"
- if [ -r "$build_dir/autobuild-package.xml" ]
- then
- upload_item docs "$build_dir/autobuild-package.xml" text/xml
- else
- record_event "no metadata at '$build_dir/autobuild-package.xml'"
- fi
- end_section "Autobuild metadata"
- if [ "$arch" != "Linux" ]
- then
- record_dependencies_graph # defined in build.sh
- else
- echo "TBD - skipping linux graph (probable python version dependency)" 1>&2
- fi
- end_section "Building Documentation"
-}
-
-
# Check to see if we were invoked from the wrapper, if not, re-exec ourselves from there
if [ "x$arch" = x ]
then
@@ -207,7 +184,7 @@ then
cat <<EOF
This script, if called in a development environment, requires that the branch
independent build script repository be checked out next to this repository.
-This repository is located at http://hg.lindenlab.com/parabuild/buildscripts
+This repository is located at http://bitbucket.org/lindenlabinternal/sl-buildscripts
EOF
exit 1
fi
@@ -246,70 +223,54 @@ do
# Only the last built arch is available for upload
last_built_variant="$variant"
- begin_section "Do$variant"
+ begin_section "$variant"
build_dir=`build_dir_$arch $variant`
build_dir_stubs="$build_dir/win_setup/$variant"
- begin_section "PreClean"
+ begin_section "Initialize Build Directory"
rm -rf "$build_dir"
- end_section "PreClean"
-
mkdir -p "$build_dir"
mkdir -p "$build_dir/tmp"
+ end_section "Initialize Build Directory"
if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1
then
- if $build_link_parallel
- then
- begin_section BuildParallel
- ( build "$variant" "$build_dir" > "$build_dir/build.log" 2>&1 ) &
- build_processes="$build_processes $!"
- end_section BuildParallel
- else
- begin_section "Build$variant"
+ begin_section "Build $variant"
build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
if `cat "$build_dir/build_ok"`
then
- echo so far so good.
+ if [ "$variant" == "Release" -o "$variant" == "Doxygen" ]
+ then
+ if [ -r "$build_dir/autobuild-package.xml" ]
+ then
+ begin_section "Autobuild metadata"
+ upload_item docs "$build_dir/autobuild-package.xml" text/xml
+ if [ "$arch" != "Linux" ]
+ then
+ record_dependencies_graph # defined in buildscripts/hg/bin/build.sh
+ else
+ record_event "TBD - no dependency graph for linux (probable python version dependency)" 1>&2
+ fi
+ end_section "Autobuild metadata"
+ else
+ record_event "no autobuild metadata at '$build_dir/autobuild-package.xml'"
+ fi
+ else
+ record_event "do not record autobuild metadata for $variant"
+ fi
else
- record_failure "Build of \"$variant\" failed."
+ record_failure "Build of \"$variant\" failed."
fi
- end_section "Build$variant"
- fi
- else
- record_failure "Build Prep for \"$variant\" failed."
+ end_section "Build $variant"
+ fi
+ end_section "$variant"
+ if ! $succeeded
+ then
+ record_event "remaining variants skipped due to $variant failure"
+ break
fi
- end_section "Do$variant"
done
-build_docs
-
-# If we are building variants in parallel, wait, then collect results.
-# This requires that the build dirs are variant specific
-if $build_link_parallel && [ x"$build_processes" != x ]
-then
- begin_section WaitParallel
- wait $build_processes
- for variant in $variants
- do
- eval '$build_'"$variant" || continue
- eval '$build_'"$arch"_"$variant" || continue
-
- begin_section "Build$variant"
- build_dir=`build_dir_$arch $variant`
- build_dir_stubs="$build_dir/win_setup/$variant"
- tee -a $build_log < "$build_dir/build.log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
- if `cat "$build_dir/build_ok"`
- then
- echo so far so good.
- else
- record_failure "Parallel build of \"$variant\" failed."
- fi
- end_section "Build$variant"
- done
- end_section WaitParallel
-fi
-
# build debian package
if [ "$arch" == "Linux" ]
then
@@ -376,7 +337,7 @@ then
end_section "Upload Debian Repository"
else
- echo skipping debian build
+ echo debian build not enabled
fi
else
echo skipping debian build due to failed build.
@@ -438,6 +399,17 @@ then
echo "No llphysicsextensions_package"
fi
;;
+ Doxygen)
+ if [ -r "$build_dir/doxygen_warnings.log" ]
+ then
+ record_event "Doxygen warnings generated; see doxygen_warnings.log"
+ upload_item log "$build_dir/doxygen_warnings.log" binary/octet-stream
+ fi
+ if [ -d "$build_dir/doxygen/html" ]
+ then
+ (cd "$build_dir/doxygen/html"; tar cjf "$build_dir/viewer-doxygen.tar.bz2" .)
+ upload_item docs "$build_dir/viewer-doxygen.tar.bz2" binary/octet-stream
+ fi
*)
echo "Skipping mapfile for $last_built_variant"
;;
@@ -446,7 +418,9 @@ then
# Run upload extensions
if [ -d ${build_dir}/packages/upload-extensions ]; then
for extension in ${build_dir}/packages/upload-extensions/*.sh; do
+ begin_section "Upload Extenstion $extension"
. $extension
+ end_section "Upload Extenstion $extension"
done
fi
diff --git a/doc/LICENSE-logos.txt b/doc/LICENSE-logos.txt
index e63c48e542..66f8745f4f 100755
--- a/doc/LICENSE-logos.txt
+++ b/doc/LICENSE-logos.txt
@@ -11,7 +11,7 @@ summary, see http://creativecommons.org/licenses/by-sa/3.0/.
Notwithstanding the foregoing, all of Linden Lab's trademarks, including
but not limited to the Second Life brand name and Second Life Eye-in-Hand
logo, are subject to our trademark policy at
-http://secondlife.com/corporate/trademark/.
+http://secondlife.com/corporate/brand/trademark/.
If you distribute any copies or adaptations of the Second Life viewer
artwork or any other works in these files, you must include this Notice
diff --git a/doc/LICENSE-source.txt b/doc/LICENSE-source.txt
index 407402265e..3de5123415 100755
--- a/doc/LICENSE-source.txt
+++ b/doc/LICENSE-source.txt
@@ -7,7 +7,9 @@ you under the terms of the GNU Lesser General Public License, version 2.1
("LGPL"), unless you have obtained a separate licensing agreement
("Other License"), formally executed by you and Linden Lab. Terms of
the GPL can be found in doc/LGPL-license.txt in this distribution, or
-online at http://secondlife.com/developers/opensource/lgplv2_1
+online at
+
+https://wiki.secondlife.com/wiki/Linden_Lab_Official:GNU_Lesser_General_Public_License,_version_2.1
By copying, modifying or distributing this software, you acknowledge
that you have read and understood your obligations described above,
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index 10692402a5..1e1d6dc585 100755
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -91,8 +91,11 @@ endif (LINUX)
add_subdirectory(${VIEWER_PREFIX}newview)
add_dependencies(viewer secondlife-bin)
+add_subdirectory(${VIEWER_PREFIX}doxygen EXCLUDE_FROM_ALL)
+
if (LL_TESTS)
# Define after the custom targets are created so
# individual apps can add themselves as dependencies
add_subdirectory(${INTEGRATION_TESTS_PREFIX}integration_tests)
endif (LL_TESTS)
+
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 582185e5ab..a79d09a9ea 100755
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -47,6 +47,8 @@ $/LicenseInfo$
import os
import sys
import errno
+import HTMLParser
+import re
import signal
import subprocess
@@ -148,15 +150,158 @@ def translate_rc(rc):
if rc >= 0:
return "terminated with rc %s" % rc
- # Negative rc means the child was terminated by signal -rc.
- rc = -rc
- for attr in dir(signal):
- if attr.startswith('SIG') and getattr(signal, attr) == rc:
- strc = attr
- break
+ if sys.platform.startswith("win"):
+ # From http://stackoverflow.com/questions/20629027/process-finished-with-exit-code-1073741571
+ # [-1073741571] is the signed integer representation of Microsoft's
+ # "stack overflow/stack exhaustion" error code 0xC00000FD.
+ # Anytime you see strange, large negative exit codes in windows, convert
+ # them to hex and then look them up in the ntstatus error codes
+ # http://msdn.microsoft.com/en-us/library/cc704588.aspx
+
+ # Python bends over backwards to give you all the integer precision
+ # you need, avoiding truncation. But only with 32-bit signed ints is
+ # -1073741571 equivalent to 0xC00000FD! Explicitly truncate before
+ # converting.
+ hexrc = "0x%X" % (rc & 0xFFFFFFFF)
+ # At this point, we're only trying to format the rc to make it easier
+ # for a human being to understand. Any exception here -- file doesn't
+ # exist, HTML parsing error, unrecognized table structure, unknown key
+ # -- should NOT kill the script! It should only cause us to shrug and
+ # present our caller with the best information available.
+ try:
+ table = get_windows_table()
+ symbol, desc = table[hexrc]
+ except Exception, err:
+ print >>sys.stderr, "(%s -- carrying on)" % err
+ return "terminated with rc %s (%s)" % (rc, hexrc)
+ else:
+ return "terminated with rc %s: %s: %s" % (hexrc, symbol, desc)
+
else:
- strc = str(rc)
- return "terminated by signal %s" % strc
+ # On Posix, negative rc means the child was terminated by signal -rc.
+ rc = -rc
+ for attr in dir(signal):
+ if attr.startswith('SIG') and getattr(signal, attr) == rc:
+ strc = attr
+ break
+ else:
+ strc = str(rc)
+ return "terminated by signal %s" % strc
+
+class TableParser(HTMLParser.HTMLParser):
+ """
+ This HTMLParser subclass is designed to parse the table we know exists
+ in windows-rcs.html, hopefully without building in too much knowledge of
+ the specific way that table is currently formatted.
+ """
+ # regular expression matching any string containing only whitespace
+ whitespace = re.compile(r'\s*$')
+
+ def __init__(self):
+ # Because Python 2.x's HTMLParser is an old-style class, we must use
+ # old-style syntax to forward the __init__() call -- not super().
+ HTMLParser.HTMLParser.__init__(self)
+ # this will collect all the data, eventually
+ self.table = []
+ # Stack whose top (last item) indicates where to append current
+ # element data. When empty, don't collect data at all.
+ self.dest = []
+
+ def handle_starttag(self, tag, attrs):
+ if tag == "table":
+ # This is the outermost tag we recognize. Collect nested elements
+ # within self.table.
+ self.dest.append(self.table)
+ elif tag in ("tr", "td"):
+ # Nested elements whose contents we want to capture as sublists.
+ # To the list currently designated by the top of the dest stack,
+ # append a new empty sublist.
+ self.dest[-1].append([])
+ # Now push THAT new, empty list as the new top of the dest stack.
+ self.dest.append(self.dest[-1][-1])
+ elif tag == "p":
+ # We could handle <p> ... </p> just like <tr> or <td>, but that
+ # introduces an unnecessary extra level of nesting. Just skip.
+ pass
+ else:
+ # For any tag we don't recognize (notably <th>), push a new, empty
+ # list to the top of the dest stack. This new list is NOT
+ # referenced by anything in self.table; thus, when we pop it, any
+ # data we've collected inside that list will be discarded.
+ self.dest.append([])
+
+ def handle_endtag(self, tag):
+ # Because we avoid pushing self.dest for <p> in handle_starttag(), we
+ # must refrain from popping it for </p> here.
+ if tag != "p":
+ # For everything else, including unrecognized tags, pop the dest
+ # stack, reverting to outer collection.
+ self.dest.pop()
+
+ def handle_startendtag(self, tag, attrs):
+ # The table of interest contains <td> entries of the form:
+ # <p>0x00000000<br />STATUS_SUCCESS</p>
+ # The <br/> is very useful -- we definitely want two different data
+ # items for "0x00000000" and "STATUS_SUCCESS" -- but we don't need or
+ # want it to push, then discard, an empty list as it would if we let
+ # the default HTMLParser.handle_startendtag() call handle_starttag()
+ # followed by handle_endtag(). Just ignore <br/> or any other
+ # singleton tag.
+ pass
+
+ def handle_data(self, data):
+ # Outside the <table> of interest, self.dest is empty. Do not bother
+ # collecting data when self.dest is empty.
+ # HTMLParser calls handle_data() with every chunk of whitespace
+ # between tags. That would be lovely if our eventual goal was to
+ # reconstitute the original input stream with its existing formatting,
+ # but for us, whitespace only clutters the table. Ignore it.
+ if self.dest and not self.whitespace.match(data):
+ # Here we're within our <table> and we have non-whitespace data.
+ # Append it to the list designated by the top of the dest stack.
+ self.dest[-1].append(data)
+
+# cache for get_windows_table()
+_windows_table = None
+
+def get_windows_table():
+ global _windows_table
+ # If we already loaded _windows_table, no need to load it all over again.
+ if _windows_table:
+ return _windows_table
+
+ # windows-rcs.html was fetched on 2015-03-24 with the following command:
+ # curl -o windows-rcs.html \
+ # https://msdn.microsoft.com/en-us/library/cc704588.aspx
+ parser = TableParser()
+ with open(os.path.join(os.path.dirname(__file__), "windows-rcs.html")) as hf:
+ # We tried feeding the file data to TableParser in chunks, to avoid
+ # buffering the entire file as a single string. Unfortunately its
+ # handle_data() cannot tell the difference between distinct calls
+ # separated by HTML tags, and distinct calls necessitated by a chunk
+ # boundary. Sigh! Read in the whole file. At the time this was
+ # written, it was only 500KB anyway.
+ parser.feed(hf.read())
+ parser.close()
+ table = parser.table
+
+ # With our parser, any <tr><th>...</th></tr> row leaves a table entry
+ # consisting only of an empty list. Remove any such.
+ while table and not table[0]:
+ table.pop(0)
+
+ # We expect rows of the form:
+ # [['0x00000000', 'STATUS_SUCCESS'],
+ # ['The operation completed successfully.']]
+ # The latter list will have multiple entries if Microsoft embedded <br/>
+ # or <p> ... </p> in the text, in which case joining with '\n' is
+ # appropriate.
+ # Turn that into a dict whose key is the hex string, and whose value is
+ # the pair (symbol, desc).
+ _windows_table = dict((key, (symbol, '\n'.join(desc)))
+ for (key, symbol), desc in table)
+
+ return _windows_table
if __name__ == "__main__":
from optparse import OptionParser
diff --git a/indra/cmake/windows-rcs.html b/indra/cmake/windows-rcs.html
new file mode 100644
index 0000000000..da2fbcdaef
--- /dev/null
+++ b/indra/cmake/windows-rcs.html
@@ -0,0 +1,15157 @@
+<!DOCTYPE html>
+
+<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml" lang="en">
+ <head><meta name="Search.MSHKeywordA" content="596a1078-e883-4972-9bbc-49e60bebca55" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSHAttr.DCSext.appliesToProduct" content="Windows" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSHAttr.DCSext.MSDNLibOpenProtocol" content="WINDOWS" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSHAttr.Locale" content="en-us" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSHAttr.AssetID" content="596a1078-e883-4972-9bbc-49e60bebca55" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSHAttr.TopicType" content="kbRef" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.Microsoft.Help.Id" content="596a1078-e883-4972-9bbc-49e60bebca55" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="ms310241" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="ms310241MSDN10" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="cc203350" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="cc203350PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="ee815853" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="ee815853PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="ee939280" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="ee939280PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="dn781106" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="dn781106PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="ee914698" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="ee914698PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="ee914688" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="ee914688PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="ee914687" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="ee914687PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategory" content="cc704588" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.MSCategoryV" content="cc704588PROT20" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.TocNodeId" content="cc704588" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHKeywordA" content="596a1078-e883-4972-9bbc-49e60bebca55" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHAttr" content="DCSext.appliesToProduct:Windows" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHAttr" content="DCSext.MSDNLibOpenProtocol:WINDOWS" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHAttr" content="Locale:en-us" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHAttr" content="AssetID:596a1078-e883-4972-9bbc-49e60bebca55" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHAttr" content="TopicType:kbRef" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Microsoft.Help.Id" content="596a1078-e883-4972-9bbc-49e60bebca55" xmlns:c="urn:msdn-com:mtps/2004/1/common" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSHAttr" content="Rating:58.871" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.Rating" content="58.870967" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.Rating.FiveStarScale" content="2.94354835" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="MSMETANRatingMSMETAV" content="58.870967" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="TotalHelpfulVotes" content="17" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="TotalVotes" content="31" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="HasCodeSamples" content="false" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.RootTocId" content="ms310241" xmlns="http://www.w3.org/1999/xhtml" />
+<meta name="Search.library.Url" content="https://msdn.microsoft.com/en-us/library/cc704588.aspx" xmlns="http://www.w3.org/1999/xhtml" /><link rel="canonical" href="https://msdn.microsoft.com/en-us/library/cc704588.aspx" />
+ <title>2.3.1 NTSTATUS values</title>
+
+
+
+
+
+<meta name="DCS.dcsuri" content="/en-us/library/cc704588(d=default,l=en-us,v=prot.20).aspx" />
+
+<meta name="NormalizedUrl" content="https://msdn.microsoft.com/en-us/library/cc704588(d=default,l=en-us,v=prot.20).aspx" />
+
+<meta name="ms.normalizedurl" content="https://msdn.microsoft.com/en-us/library/cc704588(d=default,l=en-us,v=prot.20).aspx" />
+
+<meta name="DCSext.appliesToProduct" content="Windows" />
+
+<meta name="DCSext.MSDNLibOpenProtocol" content="WINDOWS" />
+
+<meta name="VotingContextUrl" content="https://msdn.microsoft.com/en-us/library/cc704588(d=default,l=en-us,v=prot.20).aspx" />
+
+<meta name="MN" content="FB361394-9:41:50 AM" />
+
+<meta name="Search.ShortId" content="cc704588" />
+
+<meta name="ms.shortidmsdn" content="cc704588" />
+
+<meta name="Ms.Locale" content="en-us" />
+
+<meta name="ms.prodver" content="PROT.20" />
+
+<meta name="ms.contentlang" content="EN" />
+
+<meta name="ms.lang" content="EN" />
+
+<meta name="ms.loc" content="US" />
+
+<meta name="ms.sitever" content="2015.02.26.3" />
+
+<meta name="ms.assetid" content="596a1078-e883-4972-9bbc-49e60bebca55" />
+
+<meta name="ms.auth" content="0" />
+
+
+
+
+
+
+
+
+
+ <link rel="stylesheet" type="text/css" href="https://i-msdn.sec.s-msft.com/Combined.css?resources=0:Topic,0:CodeSnippet,0:ProgrammingSelector,0:ExpandableCollapsibleArea,1:CommunityContent,0:TopicNotInScope,0:FeedViewerBasic,0:ImageSprite,2:Header,2:HeaderFooterSprite,3:LinkList,4:PrintExportButton,1:Toc,1:NavigationResize,1:LibraryMemberFilter,2:Footer,3:FooterSock,3:Base,5:Msdn;/Areas/Epx/Content/Css:0,/Areas/Library/Content:1,/Areas/Centers/Themes/StandardDevCenter/Content:2,/Areas/Epx/Themes/Base/Content:3,/Areas/Library/Themes/Base/Content:4,/Areas/Library/Themes/Msdn/Content:5&amp;amp;v=AA60BEA00AEACA3B8F447C4DD8D8022E" /></head>
+ <body class="library ">
+ <div id="page">
+
+
+
+
+
+
+
+
+ <link type="text/css" rel="stylesheet" />
+
+ <input type="hidden" id="isHeaderBleeding" value="true" />
+ <div id="ux-header" dir="ltr" class="ltr msdn">
+
+
+ <header>
+ <span id="moveDrawer"></span>
+ <span id="singleCol"></span>
+ <span id="doubleCol"></span>
+
+ <div class="row">
+ <div class="top">
+ <div class="left">
+
+ <a class="msdnLogoImg" href="https://msdn.microsoft.com/en-us">
+ <img src="https://i-msdn.sec.s-msft.com/Areas/Centers/Themes/StandardDevCenter/Content/Images/microsoftLogoForHeader.png?v=635605659908771441" />
+ </a>
+ </div>
+
+ <div class="right">
+ <div id="signIn">
+
+<a class="scarabLink" href="https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=12&amp;ct=1427215310&amp;rver=6.0.5276.0&amp;wp=MCMBI&amp;wlcxt=MSDN%24MSDN%24MSDN&amp;wreply=https%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fcc704588.aspx&amp;lc=1033&amp;id=254354&amp;mkt=en-US" title="Sign in">Sign in</a></div>
+
+
+
+ <div class="auxNav">
+ <div data-fragmentName="Subscriptions" id="Fragment_Subscriptions" xmlns="http://www.w3.org/1999/xhtml">
+ <a href="https://msdn.microsoft.com/subscriptions/manage/hh442900" id="Subscriptions_2153_1" xmlns="http://www.w3.org/1999/xhtml">MSDN subscriptions</a>
+</div>
+ <div data-fragmentName="GetTools" id="Fragment_GetTools" xmlns="http://www.w3.org/1999/xhtml">
+ <a href="http://go.microsoft.com/fwlink/?LinkId=309297&amp;clcid=0x409&amp;slcid=0x409&amp;campaign=o~msft~msdn~gettools-header~dn308572" id="GetTools_2153_3" xmlns="http://www.w3.org/1999/xhtml">Get tools</a>
+</div>
+ <div data-fragmentName="SocialLinks" id="Fragment_SocialLinks" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <ul class="links horizontal">
+ <li>
+ <a href="http://www.facebook.com/microsoftdeveloper" target="_blank" id="SocialLinks_2152_4" class="facebook" xmlns="http://www.w3.org/1999/xhtml">http://www.facebook.com/microsoftdeveloper</a>
+ </li>
+ <li>
+ <a href="https://twitter.com/msdev" target="_blank" id="SocialLinks_2152_5" class="twitter" xmlns="http://www.w3.org/1999/xhtml">https://twitter.com/msdev</a>
+ </li>
+ <li>
+ <a href="http://plus.google.com/111221966647232053570/" target="_blank" id="SocialLinks_2152_6" class="googlePlus" xmlns="http://www.w3.org/1999/xhtml">http://plus.google.com/111221966647232053570/</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ </div>
+ </div>
+ </div>
+
+ <div class="bottom">
+ <div class="left">
+ <div data-fragmentName="SiteLogo" id="Fragment_SiteLogo" xmlns="http://www.w3.org/1999/xhtml">
+ <div class="LinkWithImage topImage">
+ <a id="SiteLogo_2152_1" href="https://msdn.microsoft.com">
+ <img id="msdnLogo-black" src="https://i-msdn.sec.s-msft.com/en-us/msdn/ux/library/dn610975.msdnLogo-black.jpg?Segments=%2flibrary&amp;isLibrary=true&amp;isMtpsRequest=true&amp;HideProfileLink=true" xmlns="" />
+ <span></span>
+ </a>
+ </div>
+</div>
+ <div id="drawer">
+ <div class="toc">
+
+ <nav>
+ <ul class="navL1">
+ <li class="inactive toggle">
+ <a href="javascript:void(0)" title="Technologies">Technologies</a>
+ <ul class="navL2">
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/cloud-app-development-msdn" title="Cloud">Cloud</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/mobile-app-development-msdn" title="Mobile">Mobile</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/web-app-development-msdn" title="Web">Web</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/business-and-productivity-app-development-msdn" title="Business">Business</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/big-data-development-msdn" title="Data">Data</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/games-development-msdn" title="Gaming">Gaming</a>
+
+
+ </li>
+ </ul>
+ </li>
+ <li class="inactive toggle">
+ <a href="javascript:void(0)" title="Downloads">Downloads</a>
+ <ul class="navL2">
+ <li class="inactive">
+ <a href="https://www.visualstudio.com/downloads/download-visual-studio-vs" title="Visual Studio">Visual Studio</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/subscriptions" title="MSDN subscriptions">MSDN subscriptions</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/microsoft-sdks-msdn" title="SDKs">SDKs</a>
+
+
+ </li>
+ </ul>
+ </li>
+ <li class="inactive toggle">
+ <a href="javascript:void(0)" title="Programs">Programs</a>
+ <ul class="navL2">
+ <li class="inactive">
+ <a href="https://www.microsoft.com/bizspark" title="BizSpark">BizSpark</a>
+
+
+ </li>
+ <li class="inactive toggle">
+ <a href="javascript:void(0)" title="Students">Students</a>
+
+ <ul class="navL3">
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/student-developer-program" title="Develop apps">Develop apps</a>
+ </li>
+ <li class="inactive">
+ <a href="http://blogs.msdn.com/b/microsoft_student_developer_blog" title="Blog">Blog</a>
+ </li>
+ </ul>
+
+ </li>
+ <li class="inactive toggle">
+ <a href="javascript:void(0)" title="Architects">Architects</a>
+
+ <ul class="navL3">
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/architects-overview-msdn" title="Overview">Overview</a>
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/architects-case-studies-msdn" title="Case studies">Case studies</a>
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/architects-blueprints-msdn" title="Blueprints">Blueprints</a>
+ </li>
+ <li class="inactive">
+ <a href="http://blogs.msdn.com/b/msarchitecture/" title="Blog">Blog</a>
+ </li>
+ <li class="inactive">
+ <a href="http://social.msdn.microsoft.com/forums/en-us/home?brandignore=true&amp;sort=relevancedesc&amp;searchterm=architecture+or+architect" title="Forums">Forums</a>
+ </li>
+ </ul>
+
+ </li>
+ <li class="inactive">
+ <a href="http://events.msdn.microsoft.com/" title="Events">Events</a>
+
+
+ </li>
+ </ul>
+ </li>
+ <li class="inactive toggle">
+ <a href="javascript:void(0)" title="Community">Community</a>
+ <ul class="navL2">
+ <li class="inactive">
+ <a href="https://social.msdn.microsoft.com/forums/" title="Forums">Forums</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="http://blogs.msdn.com/b/developer-tools/" title="Blogs">Blogs</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="http://tech-advisors.msdn.microsoft.com/en-us" title="Tech Advisors">Tech Advisors</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="http://channel9.msdn.com/" title="Channel 9">Channel 9</a>
+
+
+ </li>
+ </ul>
+ </li>
+ <li class="inactive current toggle">
+ <a href="javascript:void(0)" title="Documentation">Documentation</a>
+ <ul class="navL2">
+ <li class="inactive current">
+ <a href="https://msdn.microsoft.com/library" title="APIs and reference">APIs and reference</a>
+
+
+ </li>
+ <li class="inactive">
+ <a href="https://msdn.microsoft.com/developer-centers-msdn" title="Dev centers">Dev centers</a>
+
+
+ </li>
+ </ul>
+ </li>
+ <li class="inactive">
+ <a href="https://code.msdn.microsoft.com/" title="Samples">Samples</a>
+ </li>
+ </ul>
+ </nav>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="right">
+ <div data-fragmentName="SearchBox" id="Fragment_SearchBox" xmlns="http://www.w3.org/1999/xhtml">
+ <div class="SearchBox">
+ <form id="HeaderSearchForm" name="HeaderSearchForm" method="get" onsubmit="return Epx.Controls.SearchBox.searchBoxOnSubmit(this);">
+ <input id="HeaderSearchTextBox" name="query" type="text" maxlength="200" onfocus="Epx.Controls.SearchBox.watermarkFocus(event, this.title)" onblur="Epx.Controls.SearchBox.watermarkBlur(event, this.title)" />
+ <button id="HeaderSearchButton" value="" type="submit" class="header-search-button"></button>
+ </form>
+
+
+ </div>
+</div>
+ <a id="grip" href="javascript:void(0)"></a>
+ </div>
+ </div>
+ </div>
+ </header>
+ </div>
+
+
+
+
+ <div class="printExportMenus ltr">
+ <a id="isd_printABook" href="/en-us/library/export/help/?returnUrl=%2fen-us%2flibrary%2fcc704588.aspx">
+ Export (<span class="count">0</span>)
+ </a>
+ <a id="isd_print" href="https://msdn.microsoft.com/en-us/library/cc704588(d=printer).aspx" rel="nofollow">
+ Print
+ </a>
+ </div>
+
+
+ <div class="printExportMenus ltr">
+ <a id="expandCollapseAll" accesskey="e" href="javascript:void(0)" title="Expand/Collapse all sections by pressing Ctrl + Shift + e">Expand All</a>
+ </div>
+
+
+
+
+ <div id="body">
+
+
+
+
+
+
+
+
+
+ <div id="leftNav">
+
+
+
+<div id="tocnav">
+
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/ms123401.aspx" id="ms310241_MSDN.10_en-us" mtpsaliasid="" mtpsassetid="5DDC0A78-6B2C-43E3-9C56-55F45C0DFFA5_MSDN.10_en-us" mtpsshortid="ms123401_MSDN.10_en-us" title="MSDN Library">MSDN Library</a> </div>
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/dd208104(v=prot.10).aspx" id="cc203350_PROT.20_en-us" mtpsaliasid="" mtpsassetid="3589baea-5b22-48f2-9d43-f5bea4960ddb_PROT.20_en-us" mtpsshortid="dd208104_PROT.10_en-us" title="Open Specifications">Open Specifications</a> </div>
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/gg685446.aspx" id="ee815853_PROT.20_en-us" mtpsaliasid="" mtpsassetid="9a3ae8a2-02e5-4d05-874a-b3551405d8f9_PROT.20_en-us" mtpsshortid="gg685446_MSDN.10_en-us" title="Protocols">Protocols</a> </div>
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/cc216517.aspx" id="ee939280_PROT.20_en-us" mtpsaliasid="" mtpsassetid="92b33e19-6fff-496b-86c3-d168206f9845_PROT.20_en-us" mtpsshortid="cc216517_PROT.20_en-us" title="Windows Protocols">Windows Protocols</a> </div>
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/cc216516.aspx" id="dn781106_PROT.20_en-us" mtpsaliasid="" mtpsassetid="1593dc07-6116-4e9e-8aeb-85c7438fab0a_PROT.20_en-us" mtpsshortid="cc216516_PROT.20_en-us" title="References">References</a> </div>
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/cc231196.aspx" id="ee914698_PROT.20_en-us" mtpsaliasid="" mtpsassetid="1bc92ddf-b79e-413c-bbaa-99a5281a6c90_PROT.20_en-us" mtpsshortid="cc231196_PROT.20_en-us" title="[MS-ERREF]: Windows Error Codes">[MS-ERREF]: Windows Error Codes</a> </div>
+ <div class="toclevel0" data-toclevel="0">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/cc231210.aspx" id="ee914688_PROT.20_en-us" mtpsaliasid="" mtpsassetid="32cce05d-3a39-4c7e-8f66-5e788e1107cf_PROT.20_en-us" mtpsshortid="cc231210_PROT.20_en-us" title="2 Structures">2 Structures</a> </div>
+ <div class="toclevel1" data-toclevel="1">
+<a data-tochassubtree="true" href="https://msdn.microsoft.com/en-us/library/cc231200.aspx" id="ee914687_PROT.20_en-us" mtpsaliasid="" mtpsassetid="87fba13e-bf06-450e-83b1-9241dc81e781_PROT.20_en-us" mtpsshortid="cc231200_PROT.20_en-us" title="2.3 NTSTATUS">2.3 NTSTATUS</a> </div>
+ <div class="toclevel2 current" data-toclevel="2">
+<a href="https://msdn.microsoft.com/en-us/library/cc704588.aspx" mtpsaliasid="" mtpsassetid="" mtpsshortid="" title="2.3.1 NTSTATUS values">2.3.1 NTSTATUS values</a> </div>
+</div>
+
+
+
+
+
+
+ <div id="toc-resizable-ew" class="toc-resizable-ew"></div>
+
+
+<a id="NavigationResize" href="javascript:void(0)">
+ <img class="cl_nav_resize_open" src="https://i-msdn.sec.s-msft.com/Areas/Epx/Content/Images/ImageSprite.png?v=635605659960334597" title="Expand" alt="Expand" />
+ <img class="cl_nav_resize_close" src="https://i-msdn.sec.s-msft.com/Areas/Epx/Content/Images/ImageSprite.png?v=635605659960334597" title="Minimize" alt="Minimize" />
+</a>
+
+
+
+ </div>
+<div id="content" class="content">
+
+
+
+
+
+
+
+
+<div xmlns="http://www.w3.org/1999/xhtml">
+<div class="topic" xmlns="http://www.w3.org/1999/xhtml" xmlns:mtps="http://msdn2.microsoft.com/mtps">
+ <h1 class="title">2.3.1 NTSTATUS values</h1>
+
+ <div id="mainSection">
+ <div id="mainBody">
+ <div id="sectionSection0" class="section">
+ <p>By combining the NTSTATUS into a single 32-bit numbering space, the following NTSTATUS values are defined. Most values also have a defined default message that can be used to map the value to a human-readable text message. When this is done, the NTSTATUS value is also known as a <a href="https://msdn.microsoft.com/en-us/library/2ac5d774-07c9-4de4-a2a8-6baa333455fa#message_identifier">message identifier</a>. </p>
+ <p>This document provides the common usage details of the NTSTATUS values; individual protocol specifications may provide expanded or modified definitions.</p>
+ <p>In the following descriptions, a percentage sign that is followed by one or more alphanumeric characters (for example, "%1" or "%hs") indicates a variable that is replaced by text at the time the value is returned. </p>
+ <p />
+ <table class="FixedWidth-40-60">
+ <tr>
+ <th id="ShadedCell">
+ Return value/code
+ </th>
+ <th id="ShadedCell1">
+ Description
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000000<br />STATUS_SUCCESS</p>
+ </td>
+ <td>
+ <p>The operation completed successfully. </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000000<br />STATUS_WAIT_0</p>
+ </td>
+ <td>
+ <p>The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000001<br />STATUS_WAIT_1</p>
+ </td>
+ <td>
+ <p>The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000002<br />STATUS_WAIT_2</p>
+ </td>
+ <td>
+ <p>The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000003<br />STATUS_WAIT_3</p>
+ </td>
+ <td>
+ <p>The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000003F<br />STATUS_WAIT_63</p>
+ </td>
+ <td>
+ <p>The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000080<br />STATUS_ABANDONED</p>
+ </td>
+ <td>
+ <p>The caller attempted to wait for a mutex that has been abandoned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000080<br />STATUS_ABANDONED_WAIT_0</p>
+ </td>
+ <td>
+ <p>The caller attempted to wait for a mutex that has been abandoned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x000000BF<br />STATUS_ABANDONED_WAIT_63</p>
+ </td>
+ <td>
+ <p>The caller attempted to wait for a mutex that has been abandoned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x000000C0<br />STATUS_USER_APC</p>
+ </td>
+ <td>
+ <p>A user-mode APC was delivered before the given Interval expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000101<br />STATUS_ALERTED</p>
+ </td>
+ <td>
+ <p>The delay completed because the thread was alerted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000102<br />STATUS_TIMEOUT</p>
+ </td>
+ <td>
+ <p>The given Timeout interval expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000103<br />STATUS_PENDING</p>
+ </td>
+ <td>
+ <p>The operation that was requested is pending completion.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000104<br />STATUS_REPARSE</p>
+ </td>
+ <td>
+ <p>A reparse should be performed by the Object Manager because the name of the file resulted in a symbolic link.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000105<br />STATUS_MORE_ENTRIES</p>
+ </td>
+ <td>
+ <p>Returned by enumeration APIs to indicate more information is available to successive calls.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000106<br />STATUS_NOT_ALL_ASSIGNED</p>
+ </td>
+ <td>
+ <p>Indicates not all privileges or groups that are referenced are assigned to the caller. This allows, for example, all privileges to be disabled without having to know exactly which privileges are assigned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000107<br />STATUS_SOME_NOT_MAPPED</p>
+ </td>
+ <td>
+ <p>Some of the information to be translated has not been translated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000108<br />STATUS_OPLOCK_BREAK_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>An open/create operation completed while an opportunistic lock (oplock) break is underway.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000109<br />STATUS_VOLUME_MOUNTED</p>
+ </td>
+ <td>
+ <p>A new volume has been mounted by a file system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000010A<br />STATUS_RXACT_COMMITTED</p>
+ </td>
+ <td>
+ <p>This success level status indicates that the transaction state already exists for the registry subtree but that a transaction commit was previously aborted. The commit has now been completed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000010B<br />STATUS_NOTIFY_CLEANUP</p>
+ </td>
+ <td>
+ <p>Indicates that a notify change request has been completed due to closing the handle that made the notify change request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000010C<br />STATUS_NOTIFY_ENUM_DIR</p>
+ </td>
+ <td>
+ <p>Indicates that a notify change request is being completed and that the information is not being returned in the caller's buffer. The caller now needs to enumerate the files to find the changes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000010D<br />STATUS_NO_QUOTAS_FOR_ACCOUNT</p>
+ </td>
+ <td>
+ <p>{No Quotas} No system quota limits are specifically set for this account.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000010E<br />STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED</p>
+ </td>
+ <td>
+ <p>{Connect Failure on Primary Transport} An attempt was made to connect to the remote server %hs on the primary transport, but the connection failed. The computer WAS able to connect on a secondary transport.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000110<br />STATUS_PAGE_FAULT_TRANSITION</p>
+ </td>
+ <td>
+ <p>The page fault was a transition fault.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000111<br />STATUS_PAGE_FAULT_DEMAND_ZERO</p>
+ </td>
+ <td>
+ <p>The page fault was a demand zero fault.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000112<br />STATUS_PAGE_FAULT_COPY_ON_WRITE</p>
+ </td>
+ <td>
+ <p>The page fault was a demand zero fault.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000113<br />STATUS_PAGE_FAULT_GUARD_PAGE</p>
+ </td>
+ <td>
+ <p>The page fault was a demand zero fault.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000114<br />STATUS_PAGE_FAULT_PAGING_FILE</p>
+ </td>
+ <td>
+ <p>The page fault was satisfied by reading from a secondary storage device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000115<br />STATUS_CACHE_PAGE_LOCKED</p>
+ </td>
+ <td>
+ <p>The cached page was locked during operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000116<br />STATUS_CRASH_DUMP</p>
+ </td>
+ <td>
+ <p>The crash dump exists in a paging file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000117<br />STATUS_BUFFER_ALL_ZEROS</p>
+ </td>
+ <td>
+ <p>The specified buffer contains all zeros.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000118<br />STATUS_REPARSE_OBJECT</p>
+ </td>
+ <td>
+ <p>A reparse should be performed by the Object Manager because the name of the file resulted in a symbolic link.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000119<br />STATUS_RESOURCE_REQUIREMENTS_CHANGED</p>
+ </td>
+ <td>
+ <p>The device has succeeded a query-stop and its resource requirements have changed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000120<br />STATUS_TRANSLATION_COMPLETE</p>
+ </td>
+ <td>
+ <p>The translator has translated these resources into the global space and no additional translations should be performed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000121<br />STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY</p>
+ </td>
+ <td>
+ <p>The directory service evaluated group memberships locally, because it was unable to contact a global catalog server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000122<br />STATUS_NOTHING_TO_TERMINATE</p>
+ </td>
+ <td>
+ <p>A process being terminated has no threads to terminate.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000123<br />STATUS_PROCESS_NOT_IN_JOB</p>
+ </td>
+ <td>
+ <p>The specified process is not part of a job.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000124<br />STATUS_PROCESS_IN_JOB</p>
+ </td>
+ <td>
+ <p>The specified process is part of a job.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000125<br />STATUS_VOLSNAP_HIBERNATE_READY</p>
+ </td>
+ <td>
+ <p>{Volume Shadow Copy Service} The system is now ready for hibernation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000126<br />STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY</p>
+ </td>
+ <td>
+ <p>A file system or file system filter driver has successfully completed an FsFilter operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000127<br />STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED</p>
+ </td>
+ <td>
+ <p>The specified interrupt vector was already connected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000128<br />STATUS_INTERRUPT_STILL_CONNECTED</p>
+ </td>
+ <td>
+ <p>The specified interrupt vector is still connected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000129<br />STATUS_PROCESS_CLONED</p>
+ </td>
+ <td>
+ <p>The current process is a cloned process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000012A<br />STATUS_FILE_LOCKED_WITH_ONLY_READERS</p>
+ </td>
+ <td>
+ <p>The file was locked and all users of the file can only read.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x0000012B<br />STATUS_FILE_LOCKED_WITH_WRITERS</p>
+ </td>
+ <td>
+ <p>The file was locked and at least one user of the file can write.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000202<br />STATUS_RESOURCEMANAGER_READ_ONLY</p>
+ </td>
+ <td>
+ <p>The specified ResourceManager made no changes or updates to the resource under this transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00000367<br />STATUS_WAIT_FOR_OPLOCK</p>
+ </td>
+ <td>
+ <p>An operation is blocked and waiting for an oplock.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00010001<br />DBG_EXCEPTION_HANDLED</p>
+ </td>
+ <td>
+ <p>Debugger handled the exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x00010002<br />DBG_CONTINUE</p>
+ </td>
+ <td>
+ <p>The debugger continued.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x001C0001<br />STATUS_FLT_IO_COMPLETE</p>
+ </td>
+ <td>
+ <p>The IO was completed by a filter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000467<br />STATUS_FILE_NOT_AVAILABLE</p>
+ </td>
+ <td>
+ <p>The file is temporarily unavailable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000721<br />STATUS_CALLBACK_RETURNED_THREAD_AFFINITY</p>
+ </td>
+ <td>
+ <p>A threadpool worker thread entered a callback at thread affinity %p and exited at affinity %p.</p>
+ <p>This is unexpected, indicating that the callback missed restoring the priority.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000000<br />STATUS_OBJECT_NAME_EXISTS</p>
+ </td>
+ <td>
+ <p>{Object Exists} An attempt was made to create an object but the object name already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000001<br />STATUS_THREAD_WAS_SUSPENDED</p>
+ </td>
+ <td>
+ <p>{Thread Suspended} A thread termination occurred while the thread was suspended. The thread resumed, and termination proceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000002<br />STATUS_WORKING_SET_LIMIT_RANGE</p>
+ </td>
+ <td>
+ <p>{Working Set Range Error} An attempt was made to set the working set minimum or maximum to values that are outside the allowable range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000003<br />STATUS_IMAGE_NOT_AT_BASE</p>
+ </td>
+ <td>
+ <p>{Image Relocated} An image file could not be mapped at the address that is specified in the image file. Local fixes must be performed on this image.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000004<br />STATUS_RXACT_STATE_CREATED</p>
+ </td>
+ <td>
+ <p>This informational level status indicates that a specified registry subtree transaction state did not yet exist and had to be created.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000005<br />STATUS_SEGMENT_NOTIFICATION</p>
+ </td>
+ <td>
+ <p>{Segment Load} A virtual DOS machine (VDM) is loading, unloading, or moving an MS-DOS or Win16 program segment image. An exception is raised so that a debugger can load, unload, or track symbols and breakpoints within these 16-bit segments.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000006<br />STATUS_LOCAL_USER_SESSION_KEY</p>
+ </td>
+ <td>
+ <p>{Local Session Key} A user session key was requested for a local remote procedure call (RPC) connection. The session key that is returned is a constant value and not unique to this connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000007<br />STATUS_BAD_CURRENT_DIRECTORY</p>
+ </td>
+ <td>
+ <p>{Invalid Current Directory} The process cannot switch to the startup current directory %hs. Select OK to set the current directory to %hs, or select CANCEL to exit.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000008<br />STATUS_SERIAL_MORE_WRITES</p>
+ </td>
+ <td>
+ <p>{Serial IOCTL Complete} A serial I/O operation was completed by another write to a serial port. (The IOCTL_SERIAL_XOFF_COUNTER reached zero.)</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000009<br />STATUS_REGISTRY_RECOVERED</p>
+ </td>
+ <td>
+ <p>{Registry Recovery} One of the files that contains the system registry data had to be recovered by using a log or alternate copy. The recovery was successful.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000000A<br />STATUS_FT_READ_RECOVERY_FROM_BACKUP</p>
+ </td>
+ <td>
+ <p>{Redundant Read} To satisfy a read request, the Windows NT fault-tolerant file system successfully read the requested data from a redundant copy. This was done because the file system encountered a failure on a member of the fault-tolerant volume but was unable to reassign the failing area of the device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000000B<br />STATUS_FT_WRITE_RECOVERY</p>
+ </td>
+ <td>
+ <p>{Redundant Write} To satisfy a write request, the Windows NT fault-tolerant file system successfully wrote a redundant copy of the information. This was done because the file system encountered a failure on a member of the fault-tolerant volume but was unable to reassign the failing area of the device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000000C<br />STATUS_SERIAL_COUNTER_TIMEOUT</p>
+ </td>
+ <td>
+ <p>{Serial IOCTL Timeout} A serial I/O operation completed because the time-out period expired. (The IOCTL_SERIAL_XOFF_COUNTER had not reached zero.)</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000000D<br />STATUS_NULL_LM_PASSWORD</p>
+ </td>
+ <td>
+ <p>{Password Too Complex} The Windows password is too complex to be converted to a LAN Manager password. The LAN Manager password that returned is a NULL string.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000000E<br />STATUS_IMAGE_MACHINE_TYPE_MISMATCH</p>
+ </td>
+ <td>
+ <p>{Machine Type Mismatch} The image file %hs is valid but is for a machine type other than the current machine. Select OK to continue, or CANCEL to fail the DLL load.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000000F<br />STATUS_RECEIVE_PARTIAL</p>
+ </td>
+ <td>
+ <p>{Partial Data Received} The network transport returned partial data to its client. The remaining data will be sent later.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000010<br />STATUS_RECEIVE_EXPEDITED</p>
+ </td>
+ <td>
+ <p>{Expedited Data Received} The network transport returned data to its client that was marked as expedited by the remote system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000011<br />STATUS_RECEIVE_PARTIAL_EXPEDITED</p>
+ </td>
+ <td>
+ <p>{Partial Expedited Data Received} The network transport returned partial data to its client and this data was marked as expedited by the remote system. The remaining data will be sent later.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000012<br />STATUS_EVENT_DONE</p>
+ </td>
+ <td>
+ <p>{TDI Event Done} The TDI indication has completed successfully.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000013<br />STATUS_EVENT_PENDING</p>
+ </td>
+ <td>
+ <p>{TDI Event Pending} The TDI indication has entered the pending state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000014<br />STATUS_CHECKING_FILE_SYSTEM</p>
+ </td>
+ <td>
+ <p>Checking file system on %wZ.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000015<br />STATUS_FATAL_APP_EXIT</p>
+ </td>
+ <td>
+ <p>{Fatal Application Exit} %hs</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000016<br />STATUS_PREDEFINED_HANDLE</p>
+ </td>
+ <td>
+ <p>The specified registry key is referenced by a predefined handle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000017<br />STATUS_WAS_UNLOCKED</p>
+ </td>
+ <td>
+ <p>{Page Unlocked} The page protection of a locked page was changed to 'No Access' and the page was unlocked from memory and from the process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000018<br />STATUS_SERVICE_NOTIFICATION</p>
+ </td>
+ <td>
+ <p>%hs</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000019<br />STATUS_WAS_LOCKED</p>
+ </td>
+ <td>
+ <p>{Page Locked} One of the pages to lock was already locked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000001A<br />STATUS_LOG_HARD_ERROR</p>
+ </td>
+ <td>
+ <p>Application popup: %1 : %2</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000001B<br />STATUS_ALREADY_WIN32</p>
+ </td>
+ <td>
+ <p>A Win32 process already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000001C<br />STATUS_WX86_UNSIMULATE</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000001D<br />STATUS_WX86_CONTINUE</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000001E<br />STATUS_WX86_SINGLE_STEP</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000001F<br />STATUS_WX86_BREAKPOINT</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000020<br />STATUS_WX86_EXCEPTION_CONTINUE</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000021<br />STATUS_WX86_EXCEPTION_LASTCHANCE</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000022<br />STATUS_WX86_EXCEPTION_CHAIN</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000023<br />STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE</p>
+ </td>
+ <td>
+ <p>{Machine Type Mismatch} The image file %hs is valid but is for a machine type other than the current machine.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000024<br />STATUS_NO_YIELD_PERFORMED</p>
+ </td>
+ <td>
+ <p>A yield execution was performed and no thread was available to run.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000025<br />STATUS_TIMER_RESUME_IGNORED</p>
+ </td>
+ <td>
+ <p>The resume flag to a timer API was ignored.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000026<br />STATUS_ARBITRATION_UNHANDLED</p>
+ </td>
+ <td>
+ <p>The arbiter has deferred arbitration of these resources to its parent.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000027<br />STATUS_CARDBUS_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The device has detected a CardBus card in its slot.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000028<br />STATUS_WX86_CREATEWX86TIB</p>
+ </td>
+ <td>
+ <p>An exception status code that is used by the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000029<br />STATUS_MP_PROCESSOR_MISMATCH</p>
+ </td>
+ <td>
+ <p>The CPUs in this multiprocessor system are not all the same revision level. To use all processors, the operating system restricts itself to the features of the least capable processor in the system. If problems occur with this system, contact the CPU manufacturer to see if this mix of processors is supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000002A<br />STATUS_HIBERNATED</p>
+ </td>
+ <td>
+ <p>The system was put into hibernation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000002B<br />STATUS_RESUME_HIBERNATION</p>
+ </td>
+ <td>
+ <p>The system was resumed from hibernation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000002C<br />STATUS_FIRMWARE_UPDATED</p>
+ </td>
+ <td>
+ <p>
+ Windows has detected that the system firmware (BIOS) was updated [previous firmware date = %2, current firmware date %3].</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000002D<br />STATUS_DRIVERS_LEAKING_LOCKED_PAGES</p>
+ </td>
+ <td>
+ <p>A device driver is leaking locked I/O pages and is causing system degradation. The system has automatically enabled the tracking code to try and catch the culprit.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000002E<br />STATUS_MESSAGE_RETRIEVED</p>
+ </td>
+ <td>
+ <p>The ALPC message being canceled has already been retrieved from the queue on the other side.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4000002F<br />STATUS_SYSTEM_POWERSTATE_TRANSITION</p>
+ </td>
+ <td>
+ <p>The system power state is transitioning from %2 to %3.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000030<br />STATUS_ALPC_CHECK_COMPLETION_LIST</p>
+ </td>
+ <td>
+ <p>The receive operation was successful. Check the ALPC completion list for the received message.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000031<br />STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION</p>
+ </td>
+ <td>
+ <p>The system power state is transitioning from %2 to %3 but could enter %4.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000032<br />STATUS_ACCESS_AUDIT_BY_POLICY</p>
+ </td>
+ <td>
+ <p>Access to %1 is monitored by policy rule %2.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000033<br />STATUS_ABANDON_HIBERFILE</p>
+ </td>
+ <td>
+ <p>A valid hibernation file has been invalidated and should be abandoned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000034<br />STATUS_BIZRULES_NOT_ENABLED</p>
+ </td>
+ <td>
+ <p>Business rule scripts are disabled for the calling application.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000294<br />STATUS_WAKE_SYSTEM</p>
+ </td>
+ <td>
+ <p>The system has awoken.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40000370<br />STATUS_DS_SHUTTING_DOWN</p>
+ </td>
+ <td>
+ <p>The directory service is shutting down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010001<br />DBG_REPLY_LATER</p>
+ </td>
+ <td>
+ <p>Debugger will reply later.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010002<br />DBG_UNABLE_TO_PROVIDE_HANDLE</p>
+ </td>
+ <td>
+ <p>Debugger cannot provide a handle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010003<br />DBG_TERMINATE_THREAD</p>
+ </td>
+ <td>
+ <p>Debugger terminated the thread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010004<br />DBG_TERMINATE_PROCESS</p>
+ </td>
+ <td>
+ <p>Debugger terminated the process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010005<br />DBG_CONTROL_C</p>
+ </td>
+ <td>
+ <p>Debugger obtained control of C.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010006<br />DBG_PRINTEXCEPTION_C</p>
+ </td>
+ <td>
+ <p>Debugger printed an exception on control C.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010007<br />DBG_RIPEXCEPTION</p>
+ </td>
+ <td>
+ <p>Debugger received a RIP exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010008<br />DBG_CONTROL_BREAK</p>
+ </td>
+ <td>
+ <p>Debugger received a control break.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40010009<br />DBG_COMMAND_EXCEPTION</p>
+ </td>
+ <td>
+ <p>Debugger command communication exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40020056<br />RPC_NT_UUID_LOCAL_ONLY</p>
+ </td>
+ <td>
+ <p>A <a href="https://msdn.microsoft.com/en-us/library/513bb0aa-c8d8-456f-8a31-4e200ca7970c#uuid">UUID</a> that is valid only on this computer has been allocated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x400200AF<br />RPC_NT_SEND_INCOMPLETE</p>
+ </td>
+ <td>
+ <p>Some data remains to be sent in the request buffer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x400A0004<br />STATUS_CTX_CDM_CONNECT</p>
+ </td>
+ <td>
+ <p>The Client Drive Mapping Service has connected on Terminal Connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x400A0005<br />STATUS_CTX_CDM_DISCONNECT</p>
+ </td>
+ <td>
+ <p>The Client Drive Mapping Service has disconnected on Terminal Connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x4015000D<br />STATUS_SXS_RELEASE_ACTIVATION_CONTEXT</p>
+ </td>
+ <td>
+ <p>A kernel mode component is releasing a reference on an activation context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40190034<br />STATUS_RECOVERY_NOT_NEEDED</p>
+ </td>
+ <td>
+ <p>The transactional resource manager is already consistent. Recovery is not needed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40190035<br />STATUS_RM_ALREADY_STARTED</p>
+ </td>
+ <td>
+ <p>The transactional resource manager has already been started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401A000C<br />STATUS_LOG_NO_RESTART</p>
+ </td>
+ <td>
+ <p>The log service encountered a log stream with no restart area.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401B00EC<br />STATUS_VIDEO_DRIVER_DEBUG_REPORT_REQUEST</p>
+ </td>
+ <td>
+ <p>{Display Driver Recovered From Failure} The %hs display driver has detected a failure and recovered from it. Some graphical operations may have failed. The next time you restart the machine, a dialog box appears, giving you an opportunity to upload data about this failure to Microsoft.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E000A<br />STATUS_GRAPHICS_PARTIAL_DATA_POPULATED</p>
+ </td>
+ <td>
+ <p>The specified buffer is not big enough to contain the entire requested dataset. Partial data is populated up to the size of the buffer.</p>
+ <p>The caller needs to provide a buffer of the size as specified in the partially populated buffer's content (interface specific).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E0117<br />STATUS_GRAPHICS_DRIVER_MISMATCH</p>
+ </td>
+ <td>
+ <p>The kernel driver detected a version mismatch between it and the user mode driver.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E0307<br />STATUS_GRAPHICS_MODE_NOT_PINNED</p>
+ </td>
+ <td>
+ <p>No mode is pinned on the specified VidPN source/target.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E031E<br />STATUS_GRAPHICS_NO_PREFERRED_MODE</p>
+ </td>
+ <td>
+ <p>The specified mode set does not specify a preference for one of its modes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E034B<br />STATUS_GRAPHICS_DATASET_IS_EMPTY</p>
+ </td>
+ <td>
+ <p>The specified dataset (for example, mode set, frequency range set, descriptor set, or topology) is empty.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E034C<br />STATUS_GRAPHICS_NO_MORE_ELEMENTS_IN_DATASET</p>
+ </td>
+ <td>
+ <p>The specified dataset (for example, mode set, frequency range set, descriptor set, or topology) does not contain any more elements.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E0351<br />STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_PINNED</p>
+ </td>
+ <td>
+ <p>The specified content transformation is not pinned on the specified VidPN present path.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E042F<br />STATUS_GRAPHICS_UNKNOWN_CHILD_STATUS</p>
+ </td>
+ <td>
+ <p>The child device presence was not reliably detected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E0437<br />STATUS_GRAPHICS_LEADLINK_START_DEFERRED</p>
+ </td>
+ <td>
+ <p>Starting the lead adapter in a linked configuration has been temporarily deferred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E0439<br />STATUS_GRAPHICS_POLLING_TOO_FREQUENTLY</p>
+ </td>
+ <td>
+ <p>The display adapter is being polled for children too frequently at the same polling level.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x401E043A<br />STATUS_GRAPHICS_START_DEFERRED</p>
+ </td>
+ <td>
+ <p>Starting the adapter has been temporarily deferred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x40230001<br />STATUS_NDIS_INDICATION_REQUIRED</p>
+ </td>
+ <td>
+ <p>The request will be completed later by an NDIS status indication.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000001<br />STATUS_GUARD_PAGE_VIOLATION</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Guard Page Exception A page of memory that marks the end of a data structure, such as a stack or an array, has been accessed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000002<br />STATUS_DATATYPE_MISALIGNMENT</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Alignment Fault A data type misalignment was detected in a load or store instruction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000003<br />STATUS_BREAKPOINT</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Breakpoint A breakpoint has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000004<br />STATUS_SINGLE_STEP</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Single Step A single step or trace operation has just been completed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000005<br />STATUS_BUFFER_OVERFLOW</p>
+ </td>
+ <td>
+ <p>{Buffer Overflow} The data was too large to fit into the specified buffer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000006<br />STATUS_NO_MORE_FILES</p>
+ </td>
+ <td>
+ <p>{No More Files} No more files were found which match the file specification.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000007<br />STATUS_WAKE_SYSTEM_DEBUGGER</p>
+ </td>
+ <td>
+ <p>{Kernel Debugger Awakened} The system debugger was awakened by an interrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000000A<br />STATUS_HANDLES_CLOSED</p>
+ </td>
+ <td>
+ <p>{Handles Closed} Handles to objects have been automatically closed because of the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000000B<br />STATUS_NO_INHERITANCE</p>
+ </td>
+ <td>
+ <p>{Non-Inheritable ACL} An access control list (ACL) contains no components that can be inherited.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000000C<br />STATUS_GUID_SUBSTITUTION_MADE</p>
+ </td>
+ <td>
+ <p>{GUID Substitution} During the translation of a globally unique identifier (GUID) to a Windows security ID (SID), no administratively defined GUID prefix was found. A substitute prefix was used, which will not compromise system security. However, this may provide a more restrictive access than intended.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000000D<br />STATUS_PARTIAL_COPY</p>
+ </td>
+ <td>
+ <p>Because of protection conflicts, not all the requested bytes could be copied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000000E<br />STATUS_DEVICE_PAPER_EMPTY</p>
+ </td>
+ <td>
+ <p>{Out of Paper} The printer is out of paper.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000000F<br />STATUS_DEVICE_POWERED_OFF</p>
+ </td>
+ <td>
+ <p>{Device Power Is Off} The printer power has been turned off.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000010<br />STATUS_DEVICE_OFF_LINE</p>
+ </td>
+ <td>
+ <p>{Device Offline} The printer has been taken offline.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000011<br />STATUS_DEVICE_BUSY</p>
+ </td>
+ <td>
+ <p>{Device Busy} The device is currently busy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000012<br />STATUS_NO_MORE_EAS</p>
+ </td>
+ <td>
+ <p>{No More EAs} No more extended attributes (EAs) were found for the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000013<br />STATUS_INVALID_EA_NAME</p>
+ </td>
+ <td>
+ <p>{Illegal EA} The specified extended attribute (EA) name contains at least one illegal character.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000014<br />STATUS_EA_LIST_INCONSISTENT</p>
+ </td>
+ <td>
+ <p>{Inconsistent EA List} The extended attribute (EA) list is inconsistent.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000015<br />STATUS_INVALID_EA_FLAG</p>
+ </td>
+ <td>
+ <p>{Invalid EA Flag} An invalid extended attribute (EA) flag was set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000016<br />STATUS_VERIFY_REQUIRED</p>
+ </td>
+ <td>
+ <p>{Verifying Disk} The media has changed and a verify operation is in progress; therefore, no reads or writes may be performed to the device, except those that are used in the verify operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000017<br />STATUS_EXTRANEOUS_INFORMATION</p>
+ </td>
+ <td>
+ <p>{Too Much Information} The specified access control list (ACL) contained more information than was expected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000018<br />STATUS_RXACT_COMMIT_NECESSARY</p>
+ </td>
+ <td>
+ <p>This warning level status indicates that the transaction state already exists for the registry subtree, but that a transaction commit was previously aborted. The commit has NOT been completed but has not been rolled back either; therefore, it may still be committed, if needed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000001A<br />STATUS_NO_MORE_ENTRIES</p>
+ </td>
+ <td>
+ <p>{No More Entries} No more entries are available from an enumeration operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000001B<br />STATUS_FILEMARK_DETECTED</p>
+ </td>
+ <td>
+ <p>{Filemark Found} A filemark was detected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000001C<br />STATUS_MEDIA_CHANGED</p>
+ </td>
+ <td>
+ <p>{Media Changed} The media may have changed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000001D<br />STATUS_BUS_RESET</p>
+ </td>
+ <td>
+ <p>{I/O Bus Reset} An I/O bus reset was detected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000001E<br />STATUS_END_OF_MEDIA</p>
+ </td>
+ <td>
+ <p>{End of Media} The end of the media was encountered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000001F<br />STATUS_BEGINNING_OF_MEDIA</p>
+ </td>
+ <td>
+ <p>The beginning of a tape or partition has been detected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000020<br />STATUS_MEDIA_CHECK</p>
+ </td>
+ <td>
+ <p>{Media Changed} The media may have changed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000021<br />STATUS_SETMARK_DETECTED</p>
+ </td>
+ <td>
+ <p>A tape access reached a set mark.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000022<br />STATUS_NO_DATA_DETECTED</p>
+ </td>
+ <td>
+ <p>During a tape access, the end of the data written is reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000023<br />STATUS_REDIRECTOR_HAS_OPEN_HANDLES</p>
+ </td>
+ <td>
+ <p>The redirector is in use and cannot be unloaded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000024<br />STATUS_SERVER_HAS_OPEN_HANDLES</p>
+ </td>
+ <td>
+ <p>The server is in use and cannot be unloaded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000025<br />STATUS_ALREADY_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>The specified connection has already been disconnected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000026<br />STATUS_LONGJUMP</p>
+ </td>
+ <td>
+ <p>A long jump has been executed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000027<br />STATUS_CLEANER_CARTRIDGE_INSTALLED</p>
+ </td>
+ <td>
+ <p>A cleaner cartridge is present in the tape library.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000028<br />STATUS_PLUGPLAY_QUERY_VETOED</p>
+ </td>
+ <td>
+ <p>The Plug and Play query operation was not successful.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000029<br />STATUS_UNWIND_CONSOLIDATE</p>
+ </td>
+ <td>
+ <p>A frame consolidation has been executed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000002A<br />STATUS_REGISTRY_HIVE_RECOVERED</p>
+ </td>
+ <td>
+ <p>{Registry Hive Recovered} The registry hive (file): %hs was corrupted and it has been recovered. Some data might have been lost.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000002B<br />STATUS_DLL_MIGHT_BE_INSECURE</p>
+ </td>
+ <td>
+ <p>The application is attempting to run executable code from the module %hs. This may be insecure. An alternative, %hs, is available. Should the application use the secure module %hs?</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000002C<br />STATUS_DLL_MIGHT_BE_INCOMPATIBLE</p>
+ </td>
+ <td>
+ <p>The application is loading executable code from the module %hs. This is secure but may be incompatible with previous releases of the operating system. An alternative, %hs, is available. Should the application use the secure module %hs?</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x8000002D<br />STATUS_STOPPED_ON_SYMLINK</p>
+ </td>
+ <td>
+ <p>The create operation stopped after reaching a symbolic link.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000288<br />STATUS_DEVICE_REQUIRES_CLEANING</p>
+ </td>
+ <td>
+ <p>The device has indicated that cleaning is necessary.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000289<br />STATUS_DEVICE_DOOR_OPEN</p>
+ </td>
+ <td>
+ <p>The device has indicated that its door is open. Further operations require it closed and secured.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80000803<br />STATUS_DATA_LOST_REPAIR</p>
+ </td>
+ <td>
+ <p>
+ Windows discovered a corruption in the file %hs. This file has now been repaired. Check if any data in the file was lost because of the corruption.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80010001<br />DBG_EXCEPTION_NOT_HANDLED</p>
+ </td>
+ <td>
+ <p>Debugger did not handle the exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80130001<br />STATUS_CLUSTER_NODE_ALREADY_UP</p>
+ </td>
+ <td>
+ <p>The cluster node is already up.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80130002<br />STATUS_CLUSTER_NODE_ALREADY_DOWN</p>
+ </td>
+ <td>
+ <p>The cluster node is already down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80130003<br />STATUS_CLUSTER_NETWORK_ALREADY_ONLINE</p>
+ </td>
+ <td>
+ <p>The cluster network is already online.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80130004<br />STATUS_CLUSTER_NETWORK_ALREADY_OFFLINE</p>
+ </td>
+ <td>
+ <p>The cluster network is already offline.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80130005<br />STATUS_CLUSTER_NODE_ALREADY_MEMBER</p>
+ </td>
+ <td>
+ <p>The cluster node is already a member of the cluster.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80190009<br />STATUS_COULD_NOT_RESIZE_LOG</p>
+ </td>
+ <td>
+ <p>The log could not be set to the requested size.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80190029<br />STATUS_NO_TXF_METADATA</p>
+ </td>
+ <td>
+ <p>There is no transaction metadata on the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80190031<br />STATUS_CANT_RECOVER_WITH_HANDLE_OPEN</p>
+ </td>
+ <td>
+ <p>The file cannot be recovered because there is a handle still open on it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80190041<br />STATUS_TXF_METADATA_ALREADY_PRESENT</p>
+ </td>
+ <td>
+ <p>Transaction metadata is already present on this file and cannot be superseded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80190042<br />STATUS_TRANSACTION_SCOPE_CALLBACKS_NOT_SET</p>
+ </td>
+ <td>
+ <p>A transaction scope could not be entered because the scope handler has not been initialized.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x801B00EB<br />STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD_RECOVERED</p>
+ </td>
+ <td>
+ <p>{Display Driver Stopped Responding and recovered} The %hs display driver has stopped working normally. The recovery had been performed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x801C0001<br />STATUS_FLT_BUFFER_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>{Buffer too small} The buffer is too small to contain the entry. No information has been written to the buffer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80210001<br />STATUS_FVE_PARTIAL_METADATA</p>
+ </td>
+ <td>
+ <p>Volume metadata read or write is incomplete.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0x80210002<br />STATUS_FVE_TRANSIENT_STATE</p>
+ </td>
+ <td>
+ <p>BitLocker encryption keys were ignored because the volume was in a transient state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000001<br />STATUS_UNSUCCESSFUL</p>
+ </td>
+ <td>
+ <p>{Operation Failed} The requested operation was unsuccessful.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000002<br />STATUS_NOT_IMPLEMENTED</p>
+ </td>
+ <td>
+ <p>{Not Implemented} The requested operation is not implemented.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000003<br />STATUS_INVALID_INFO_CLASS</p>
+ </td>
+ <td>
+ <p>{Invalid Parameter} The specified information class is not a valid information class for the specified object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000004<br />STATUS_INFO_LENGTH_MISMATCH</p>
+ </td>
+ <td>
+ <p>The specified information record length does not match the length that is required for the specified information class.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000005<br />STATUS_ACCESS_VIOLATION</p>
+ </td>
+ <td>
+ <p>The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000006<br />STATUS_IN_PAGE_ERROR</p>
+ </td>
+ <td>
+ <p>The instruction at 0x%08lx referenced memory at 0x%08lx. The required data was not placed into memory because of an I/O error status of 0x%08lx.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000007<br />STATUS_PAGEFILE_QUOTA</p>
+ </td>
+ <td>
+ <p>The page file quota for the process has been exhausted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000008<br />STATUS_INVALID_HANDLE</p>
+ </td>
+ <td>
+ <p>An invalid HANDLE was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000009<br />STATUS_BAD_INITIAL_STACK</p>
+ </td>
+ <td>
+ <p>An invalid initial stack was specified in a call to NtCreateThread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000000A<br />STATUS_BAD_INITIAL_PC</p>
+ </td>
+ <td>
+ <p>An invalid initial start address was specified in a call to NtCreateThread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000000B<br />STATUS_INVALID_CID</p>
+ </td>
+ <td>
+ <p>An invalid client ID was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000000C<br />STATUS_TIMER_NOT_CANCELED</p>
+ </td>
+ <td>
+ <p>An attempt was made to cancel or set a timer that has an associated APC and the specified thread is not the thread that originally set the timer with an associated APC routine.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000000D<br />STATUS_INVALID_PARAMETER</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000000E<br />STATUS_NO_SUCH_DEVICE</p>
+ </td>
+ <td>
+ <p>A device that does not exist was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000000F<br />STATUS_NO_SUCH_FILE</p>
+ </td>
+ <td>
+ <p>{File Not Found} The file %hs does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000010<br />STATUS_INVALID_DEVICE_REQUEST</p>
+ </td>
+ <td>
+ <p>The specified request is not a valid operation for the target device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000011<br />STATUS_END_OF_FILE</p>
+ </td>
+ <td>
+ <p>The end-of-file marker has been reached. There is no valid data in the file beyond this marker.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000012<br />STATUS_WRONG_VOLUME</p>
+ </td>
+ <td>
+ <p>{Wrong Volume} The wrong volume is in the drive. Insert volume %hs into drive %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000013<br />STATUS_NO_MEDIA_IN_DEVICE</p>
+ </td>
+ <td>
+ <p>{No Disk} There is no disk in the drive. Insert a disk into drive %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000014<br />STATUS_UNRECOGNIZED_MEDIA</p>
+ </td>
+ <td>
+ <p>{Unknown Disk Format} The disk in drive %hs is not formatted properly. Check the disk, and reformat it, if needed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000015<br />STATUS_NONEXISTENT_SECTOR</p>
+ </td>
+ <td>
+ <p>{Sector Not Found} The specified sector does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000016<br />STATUS_MORE_PROCESSING_REQUIRED</p>
+ </td>
+ <td>
+ <p>{Still Busy} The specified I/O request packet (IRP) cannot be disposed of because the I/O operation is not complete.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000017<br />STATUS_NO_MEMORY</p>
+ </td>
+ <td>
+ <p>{Not Enough Quota} Not enough virtual memory or paging file quota is available to complete the specified operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000018<br />STATUS_CONFLICTING_ADDRESSES</p>
+ </td>
+ <td>
+ <p>{Conflicting Address Range} The specified address range conflicts with the address space.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000019<br />STATUS_NOT_MAPPED_VIEW</p>
+ </td>
+ <td>
+ <p>The address range to unmap is not a mapped view.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000001A<br />STATUS_UNABLE_TO_FREE_VM</p>
+ </td>
+ <td>
+ <p>The virtual memory cannot be freed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000001B<br />STATUS_UNABLE_TO_DELETE_SECTION</p>
+ </td>
+ <td>
+ <p>The specified section cannot be deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000001C<br />STATUS_INVALID_SYSTEM_SERVICE</p>
+ </td>
+ <td>
+ <p>An invalid system service was specified in a system service call.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000001D<br />STATUS_ILLEGAL_INSTRUCTION</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Illegal Instruction An attempt was made to execute an illegal instruction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000001E<br />STATUS_INVALID_LOCK_SEQUENCE</p>
+ </td>
+ <td>
+ <p>{Invalid Lock Sequence} An attempt was made to execute an invalid lock sequence.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000001F<br />STATUS_INVALID_VIEW_SIZE</p>
+ </td>
+ <td>
+ <p>{Invalid Mapping} An attempt was made to create a view for a section that is bigger than the section.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000020<br />STATUS_INVALID_FILE_FOR_SECTION</p>
+ </td>
+ <td>
+ <p>{Bad File} The attributes of the specified mapping file for a section of memory cannot be read.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000021<br />STATUS_ALREADY_COMMITTED</p>
+ </td>
+ <td>
+ <p>{Already Committed} The specified address range is already committed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000022<br />STATUS_ACCESS_DENIED</p>
+ </td>
+ <td>
+ <p>{Access Denied} A process has requested access to an object but has not been granted those access rights.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000023<br />STATUS_BUFFER_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>{Buffer Too Small} The buffer is too small to contain the entry. No information has been written to the buffer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000024<br />STATUS_OBJECT_TYPE_MISMATCH</p>
+ </td>
+ <td>
+ <p>{Wrong Type} There is a mismatch between the type of object that is required by the requested operation and the type of object that is specified in the request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000025<br />STATUS_NONCONTINUABLE_EXCEPTION</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Cannot Continue Windows cannot continue from this exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000026<br />STATUS_INVALID_DISPOSITION</p>
+ </td>
+ <td>
+ <p>An invalid exception disposition was returned by an exception handler.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000027<br />STATUS_UNWIND</p>
+ </td>
+ <td>
+ <p>Unwind exception code.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000028<br />STATUS_BAD_STACK</p>
+ </td>
+ <td>
+ <p>An invalid or unaligned stack was encountered during an unwind operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000029<br />STATUS_INVALID_UNWIND_TARGET</p>
+ </td>
+ <td>
+ <p>An invalid unwind target was encountered during an unwind operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000002A<br />STATUS_NOT_LOCKED</p>
+ </td>
+ <td>
+ <p>An attempt was made to unlock a page of memory that was not locked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000002B<br />STATUS_PARITY_ERROR</p>
+ </td>
+ <td>
+ <p>A device parity error on an I/O operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000002C<br />STATUS_UNABLE_TO_DECOMMIT_VM</p>
+ </td>
+ <td>
+ <p>An attempt was made to decommit uncommitted virtual memory.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000002D<br />STATUS_NOT_COMMITTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to change the attributes on memory that has not been committed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000002E<br />STATUS_INVALID_PORT_ATTRIBUTES</p>
+ </td>
+ <td>
+ <p>Invalid object attributes specified to NtCreatePort or invalid port attributes specified to NtConnectPort.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000002F<br />STATUS_PORT_MESSAGE_TOO_LONG</p>
+ </td>
+ <td>
+ <p>The length of the message that was passed to NtRequestPort or NtRequestWaitReplyPort is longer than the maximum message that is allowed by the port.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000030<br />STATUS_INVALID_PARAMETER_MIX</p>
+ </td>
+ <td>
+ <p>An invalid combination of parameters was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000031<br />STATUS_INVALID_QUOTA_LOWER</p>
+ </td>
+ <td>
+ <p>An attempt was made to lower a quota limit below the current usage.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000032<br />STATUS_DISK_CORRUPT_ERROR</p>
+ </td>
+ <td>
+ <p>{Corrupt Disk} The file system structure on the disk is corrupt and unusable. Run the Chkdsk utility on the volume %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000033<br />STATUS_OBJECT_NAME_INVALID</p>
+ </td>
+ <td>
+ <p>The object name is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000034<br />STATUS_OBJECT_NAME_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The object name is not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000035<br />STATUS_OBJECT_NAME_COLLISION</p>
+ </td>
+ <td>
+ <p>The object name already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000037<br />STATUS_PORT_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to send a message to a disconnected communication port.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000038<br />STATUS_DEVICE_ALREADY_ATTACHED</p>
+ </td>
+ <td>
+ <p>An attempt was made to attach to a device that was already attached to another device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000039<br />STATUS_OBJECT_PATH_INVALID</p>
+ </td>
+ <td>
+ <p>The object path component was not a directory object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000003A<br />STATUS_OBJECT_PATH_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Path Not Found} The path %hs does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000003B<br />STATUS_OBJECT_PATH_SYNTAX_BAD</p>
+ </td>
+ <td>
+ <p>The object path component was not a directory object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000003C<br />STATUS_DATA_OVERRUN</p>
+ </td>
+ <td>
+ <p>{Data Overrun} A data overrun error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000003D<br />STATUS_DATA_LATE_ERROR</p>
+ </td>
+ <td>
+ <p>{Data Late} A data late error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000003E<br />STATUS_DATA_ERROR</p>
+ </td>
+ <td>
+ <p>{Data Error} An error occurred in reading or writing data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000003F<br />STATUS_CRC_ERROR</p>
+ </td>
+ <td>
+ <p>{Bad CRC} A cyclic redundancy check (CRC) checksum error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000040<br />STATUS_SECTION_TOO_BIG</p>
+ </td>
+ <td>
+ <p>{Section Too Large} The specified section is too big to map the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000041<br />STATUS_PORT_CONNECTION_REFUSED</p>
+ </td>
+ <td>
+ <p>The NtConnectPort request is refused.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000042<br />STATUS_INVALID_PORT_HANDLE</p>
+ </td>
+ <td>
+ <p>The type of port handle is invalid for the operation that is requested.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000043<br />STATUS_SHARING_VIOLATION</p>
+ </td>
+ <td>
+ <p>A file cannot be opened because the share access flags are incompatible.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000044<br />STATUS_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>Insufficient quota exists to complete the operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000045<br />STATUS_INVALID_PAGE_PROTECTION</p>
+ </td>
+ <td>
+ <p>The specified page protection was not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000046<br />STATUS_MUTANT_NOT_OWNED</p>
+ </td>
+ <td>
+ <p>An attempt to release a mutant object was made by a thread that was not the owner of the mutant object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000047<br />STATUS_SEMAPHORE_LIMIT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>An attempt was made to release a semaphore such that its maximum count would have been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000048<br />STATUS_PORT_ALREADY_SET</p>
+ </td>
+ <td>
+ <p>An attempt was made to set the DebugPort or ExceptionPort of a process, but a port already exists in the process, or an attempt was made to set the CompletionPort of a file but a port was already set in the file, or an attempt was made to set the associated completion port of an ALPC port but it is already set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000049<br />STATUS_SECTION_NOT_IMAGE</p>
+ </td>
+ <td>
+ <p>An attempt was made to query image information on a section that does not map an image.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000004A<br />STATUS_SUSPEND_COUNT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>An attempt was made to suspend a thread whose suspend count was at its maximum.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000004B<br />STATUS_THREAD_IS_TERMINATING</p>
+ </td>
+ <td>
+ <p>An attempt was made to suspend a thread that has begun termination.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000004C<br />STATUS_BAD_WORKING_SET_LIMIT</p>
+ </td>
+ <td>
+ <p>An attempt was made to set the working set limit to an invalid value (for example, the minimum greater than maximum).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000004D<br />STATUS_INCOMPATIBLE_FILE_MAP</p>
+ </td>
+ <td>
+ <p>A section was created to map a file that is not compatible with an already existing section that maps the same file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000004E<br />STATUS_SECTION_PROTECTION</p>
+ </td>
+ <td>
+ <p>A view to a section specifies a protection that is incompatible with the protection of the initial view.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000004F<br />STATUS_EAS_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>An operation involving EAs failed because the file system does not support EAs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000050<br />STATUS_EA_TOO_LARGE</p>
+ </td>
+ <td>
+ <p>An EA operation failed because the EA set is too large.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000051<br />STATUS_NONEXISTENT_EA_ENTRY</p>
+ </td>
+ <td>
+ <p>An EA operation failed because the name or EA index is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000052<br />STATUS_NO_EAS_ON_FILE</p>
+ </td>
+ <td>
+ <p>The file for which EAs were requested has no EAs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000053<br />STATUS_EA_CORRUPT_ERROR</p>
+ </td>
+ <td>
+ <p>The EA is corrupt and cannot be read.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000054<br />STATUS_FILE_LOCK_CONFLICT</p>
+ </td>
+ <td>
+ <p>A requested read/write cannot be granted due to a conflicting file lock.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000055<br />STATUS_LOCK_NOT_GRANTED</p>
+ </td>
+ <td>
+ <p>A requested file lock cannot be granted due to other existing locks.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000056<br />STATUS_DELETE_PENDING</p>
+ </td>
+ <td>
+ <p>A non-close operation has been requested of a file object that has a delete pending.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000057<br />STATUS_CTL_FILE_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to set the control attribute on a file. This attribute is not supported in the destination file system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000058<br />STATUS_UNKNOWN_REVISION</p>
+ </td>
+ <td>
+ <p>Indicates a revision number that was encountered or specified is not one that is known by the service. It may be a more recent revision than the service is aware of.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000059<br />STATUS_REVISION_MISMATCH</p>
+ </td>
+ <td>
+ <p>Indicates that two revision levels are incompatible.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000005A<br />STATUS_INVALID_OWNER</p>
+ </td>
+ <td>
+ <p>Indicates a particular security ID may not be assigned as the owner of an object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000005B<br />STATUS_INVALID_PRIMARY_GROUP</p>
+ </td>
+ <td>
+ <p>Indicates a particular security ID may not be assigned as the primary group of an object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000005C<br />STATUS_NO_IMPERSONATION_TOKEN</p>
+ </td>
+ <td>
+ <p>An attempt has been made to operate on an impersonation token by a thread that is not currently impersonating a client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000005D<br />STATUS_CANT_DISABLE_MANDATORY</p>
+ </td>
+ <td>
+ <p>A mandatory group may not be disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000005E<br />STATUS_NO_LOGON_SERVERS</p>
+ </td>
+ <td>
+ <p>No logon servers are currently available to service the logon request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000005F<br />STATUS_NO_SUCH_LOGON_SESSION</p>
+ </td>
+ <td>
+ <p>A specified logon session does not exist. It may already have been terminated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000060<br />STATUS_NO_SUCH_PRIVILEGE</p>
+ </td>
+ <td>
+ <p>A specified privilege does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000061<br />STATUS_PRIVILEGE_NOT_HELD</p>
+ </td>
+ <td>
+ <p>A required privilege is not held by the client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000062<br />STATUS_INVALID_ACCOUNT_NAME</p>
+ </td>
+ <td>
+ <p>The name provided is not a properly formed account name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000063<br />STATUS_USER_EXISTS</p>
+ </td>
+ <td>
+ <p>The specified account already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000064<br />STATUS_NO_SUCH_USER</p>
+ </td>
+ <td>
+ <p>The specified account does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000065<br />STATUS_GROUP_EXISTS</p>
+ </td>
+ <td>
+ <p>The specified group already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000066<br />STATUS_NO_SUCH_GROUP</p>
+ </td>
+ <td>
+ <p>The specified group does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000067<br />STATUS_MEMBER_IN_GROUP</p>
+ </td>
+ <td>
+ <p>The specified user account is already in the specified group account. Also used to indicate a group cannot be deleted because it contains a member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000068<br />STATUS_MEMBER_NOT_IN_GROUP</p>
+ </td>
+ <td>
+ <p>The specified user account is not a member of the specified group account.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000069<br />STATUS_LAST_ADMIN</p>
+ </td>
+ <td>
+ <p>Indicates the requested operation would disable or delete the last remaining administration account. This is not allowed to prevent creating a situation in which the system cannot be administrated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000006A<br />STATUS_WRONG_PASSWORD</p>
+ </td>
+ <td>
+ <p>When trying to update a password, this return status indicates that the value provided as the current password is not correct.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000006B<br />STATUS_ILL_FORMED_PASSWORD</p>
+ </td>
+ <td>
+ <p>When trying to update a password, this return status indicates that the value provided for the new password contains values that are not allowed in passwords.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000006C<br />STATUS_PASSWORD_RESTRICTION</p>
+ </td>
+ <td>
+ <p>When trying to update a password, this status indicates that some password update rule has been violated. For example, the password may not meet length criteria.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000006D<br />STATUS_LOGON_FAILURE</p>
+ </td>
+ <td>
+ <p>The attempted logon is invalid. This is either due to a bad username or authentication information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000006E<br />STATUS_ACCOUNT_RESTRICTION</p>
+ </td>
+ <td>
+ <p>Indicates a referenced user name and authentication information are valid, but some user account restriction has prevented successful authentication (such as time-of-day restrictions).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000006F<br />STATUS_INVALID_LOGON_HOURS</p>
+ </td>
+ <td>
+ <p>The user account has time restrictions and may not be logged onto at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000070<br />STATUS_INVALID_WORKSTATION</p>
+ </td>
+ <td>
+ <p>The user account is restricted so that it may not be used to log on from the source workstation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000071<br />STATUS_PASSWORD_EXPIRED</p>
+ </td>
+ <td>
+ <p>The user account password has expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000072<br />STATUS_ACCOUNT_DISABLED</p>
+ </td>
+ <td>
+ <p>The referenced account is currently disabled and may not be logged on to.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000073<br />STATUS_NONE_MAPPED</p>
+ </td>
+ <td>
+ <p>None of the information to be translated has been translated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000074<br />STATUS_TOO_MANY_LUIDS_REQUESTED</p>
+ </td>
+ <td>
+ <p>The number of LUIDs requested may not be allocated with a single allocation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000075<br />STATUS_LUIDS_EXHAUSTED</p>
+ </td>
+ <td>
+ <p>Indicates there are no more LUIDs to allocate.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000076<br />STATUS_INVALID_SUB_AUTHORITY</p>
+ </td>
+ <td>
+ <p>Indicates the sub-authority value is invalid for the particular use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000077<br />STATUS_INVALID_ACL</p>
+ </td>
+ <td>
+ <p>Indicates the ACL structure is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000078<br />STATUS_INVALID_SID</p>
+ </td>
+ <td>
+ <p>Indicates the SID structure is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000079<br />STATUS_INVALID_SECURITY_DESCR</p>
+ </td>
+ <td>
+ <p>Indicates the SECURITY_DESCRIPTOR structure is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000007A<br />STATUS_PROCEDURE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Indicates the specified procedure address cannot be found in the DLL.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000007B<br />STATUS_INVALID_IMAGE_FORMAT</p>
+ </td>
+ <td>
+ <p>{Bad Image} %hs is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000007C<br />STATUS_NO_TOKEN</p>
+ </td>
+ <td>
+ <p>An attempt was made to reference a token that does not exist. This is typically done by referencing the token that is associated with a thread when the thread is not impersonating a client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000007D<br />STATUS_BAD_INHERITANCE_ACL</p>
+ </td>
+ <td>
+ <p>Indicates that an attempt to build either an inherited ACL or ACE was not successful. This can be caused by a number of things. One of the more probable causes is the replacement of a CreatorId with a SID that did not fit into the ACE or ACL.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000007E<br />STATUS_RANGE_NOT_LOCKED</p>
+ </td>
+ <td>
+ <p>The range specified in NtUnlockFile was not locked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000007F<br />STATUS_DISK_FULL</p>
+ </td>
+ <td>
+ <p>An operation failed because the disk was full.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000080<br />STATUS_SERVER_DISABLED</p>
+ </td>
+ <td>
+ <p>The GUID allocation server is disabled at the moment.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000081<br />STATUS_SERVER_NOT_DISABLED</p>
+ </td>
+ <td>
+ <p>The GUID allocation server is enabled at the moment.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000082<br />STATUS_TOO_MANY_GUIDS_REQUESTED</p>
+ </td>
+ <td>
+ <p>Too many GUIDs were requested from the allocation server at once.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000083<br />STATUS_GUIDS_EXHAUSTED</p>
+ </td>
+ <td>
+ <p>The GUIDs could not be allocated because the Authority Agent was exhausted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000084<br />STATUS_INVALID_ID_AUTHORITY</p>
+ </td>
+ <td>
+ <p>The value provided was an invalid value for an identifier authority.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000085<br />STATUS_AGENTS_EXHAUSTED</p>
+ </td>
+ <td>
+ <p>No more authority agent values are available for the particular identifier authority value.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000086<br />STATUS_INVALID_VOLUME_LABEL</p>
+ </td>
+ <td>
+ <p>An invalid volume label has been specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000087<br />STATUS_SECTION_NOT_EXTENDED</p>
+ </td>
+ <td>
+ <p>A mapped section could not be extended.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000088<br />STATUS_NOT_MAPPED_DATA</p>
+ </td>
+ <td>
+ <p>Specified section to flush does not map a data file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000089<br />STATUS_RESOURCE_DATA_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Indicates the specified image file did not contain a resource section.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000008A<br />STATUS_RESOURCE_TYPE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Indicates the specified resource type cannot be found in the image file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000008B<br />STATUS_RESOURCE_NAME_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Indicates the specified resource name cannot be found in the image file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000008C<br />STATUS_ARRAY_BOUNDS_EXCEEDED</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Array bounds exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000008D<br />STATUS_FLOAT_DENORMAL_OPERAND</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point denormal operand.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000008E<br />STATUS_FLOAT_DIVIDE_BY_ZERO</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point division by zero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000008F<br />STATUS_FLOAT_INEXACT_RESULT</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point inexact result.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000090<br />STATUS_FLOAT_INVALID_OPERATION</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point invalid operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000091<br />STATUS_FLOAT_OVERFLOW</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point overflow.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000092<br />STATUS_FLOAT_STACK_CHECK</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point stack check.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000093<br />STATUS_FLOAT_UNDERFLOW</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Floating-point underflow.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000094<br />STATUS_INTEGER_DIVIDE_BY_ZERO</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Integer division by zero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000095<br />STATUS_INTEGER_OVERFLOW</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Integer overflow.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000096<br />STATUS_PRIVILEGED_INSTRUCTION</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Privileged instruction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000097<br />STATUS_TOO_MANY_PAGING_FILES</p>
+ </td>
+ <td>
+ <p>An attempt was made to install more paging files than the system supports.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000098<br />STATUS_FILE_INVALID</p>
+ </td>
+ <td>
+ <p>The volume for a file has been externally altered such that the opened file is no longer valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000099<br />STATUS_ALLOTTED_SPACE_EXCEEDED</p>
+ </td>
+ <td>
+ <p>When a block of memory is allotted for future updates, such as the memory allocated to hold discretionary access control and primary group information, successive updates may exceed the amount of memory originally allotted. Because a quota may already have been charged to several processes that have handles to the object, it is not reasonable to alter the size of the allocated memory. Instead, a request that requires more memory than has been allotted must fail and the STATUS_ALLOTTED_SPACE_EXCEEDED error returned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000009A<br />STATUS_INSUFFICIENT_RESOURCES</p>
+ </td>
+ <td>
+ <p>Insufficient system resources exist to complete the API.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000009B<br />STATUS_DFS_EXIT_PATH_FOUND</p>
+ </td>
+ <td>
+ <p>An attempt has been made to open a DFS exit path control file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000009C<br />STATUS_DEVICE_DATA_ERROR</p>
+ </td>
+ <td>
+ <p>There are bad blocks (sectors) on the hard disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000009D<br />STATUS_DEVICE_NOT_CONNECTED</p>
+ </td>
+ <td>
+ <p>There is bad cabling, non-termination, or the controller is not able to obtain access to the hard disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000009F<br />STATUS_FREE_VM_NOT_AT_BASE</p>
+ </td>
+ <td>
+ <p>Virtual memory cannot be freed because the base address is not the base of the region and a region size of zero was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A0<br />STATUS_MEMORY_NOT_ALLOCATED</p>
+ </td>
+ <td>
+ <p>An attempt was made to free virtual memory that is not allocated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A1<br />STATUS_WORKING_SET_QUOTA</p>
+ </td>
+ <td>
+ <p>The working set is not big enough to allow the requested pages to be locked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A2<br />STATUS_MEDIA_WRITE_PROTECTED</p>
+ </td>
+ <td>
+ <p>{Write Protect Error} The disk cannot be written to because it is write-protected. Remove the write protection from the volume %hs in drive %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A3<br />STATUS_DEVICE_NOT_READY</p>
+ </td>
+ <td>
+ <p>{Drive Not Ready} The drive is not ready for use; its door may be open. Check drive %hs and make sure that a disk is inserted and that the drive door is closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A4<br />STATUS_INVALID_GROUP_ATTRIBUTES</p>
+ </td>
+ <td>
+ <p>The specified attributes are invalid or are incompatible with the attributes for the group as a whole.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A5<br />STATUS_BAD_IMPERSONATION_LEVEL</p>
+ </td>
+ <td>
+ <p>A specified impersonation level is invalid. Also used to indicate that a required impersonation level was not provided.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A6<br />STATUS_CANT_OPEN_ANONYMOUS</p>
+ </td>
+ <td>
+ <p>An attempt was made to open an anonymous-level token. Anonymous tokens may not be opened.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A7<br />STATUS_BAD_VALIDATION_CLASS</p>
+ </td>
+ <td>
+ <p>The validation information class requested was invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A8<br />STATUS_BAD_TOKEN_TYPE</p>
+ </td>
+ <td>
+ <p>The type of a token object is inappropriate for its attempted use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000A9<br />STATUS_BAD_MASTER_BOOT_RECORD</p>
+ </td>
+ <td>
+ <p>The type of a token object is inappropriate for its attempted use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000AA<br />STATUS_INSTRUCTION_MISALIGNMENT</p>
+ </td>
+ <td>
+ <p>An attempt was made to execute an instruction at an unaligned address and the host system does not support unaligned instruction references.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000AB<br />STATUS_INSTANCE_NOT_AVAILABLE</p>
+ </td>
+ <td>
+ <p>The maximum named pipe instance count has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000AC<br />STATUS_PIPE_NOT_AVAILABLE</p>
+ </td>
+ <td>
+ <p>An instance of a named pipe cannot be found in the listening state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000AD<br />STATUS_INVALID_PIPE_STATE</p>
+ </td>
+ <td>
+ <p>The named pipe is not in the connected or closing state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000AE<br />STATUS_PIPE_BUSY</p>
+ </td>
+ <td>
+ <p>The specified pipe is set to complete operations and there are current I/O operations queued so that it cannot be changed to queue operations.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000AF<br />STATUS_ILLEGAL_FUNCTION</p>
+ </td>
+ <td>
+ <p>The specified handle is not open to the server end of the named pipe.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B0<br />STATUS_PIPE_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>The specified named pipe is in the disconnected state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B1<br />STATUS_PIPE_CLOSING</p>
+ </td>
+ <td>
+ <p>The specified named pipe is in the closing state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B2<br />STATUS_PIPE_CONNECTED</p>
+ </td>
+ <td>
+ <p>The specified named pipe is in the connected state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B3<br />STATUS_PIPE_LISTENING</p>
+ </td>
+ <td>
+ <p>The specified named pipe is in the listening state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B4<br />STATUS_INVALID_READ_MODE</p>
+ </td>
+ <td>
+ <p>The specified named pipe is not in message mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B5<br />STATUS_IO_TIMEOUT</p>
+ </td>
+ <td>
+ <p>{Device Timeout} The specified I/O operation on %hs was not completed before the time-out period expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B6<br />STATUS_FILE_FORCED_CLOSED</p>
+ </td>
+ <td>
+ <p>The specified file has been closed by another process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B7<br />STATUS_PROFILING_NOT_STARTED</p>
+ </td>
+ <td>
+ <p>Profiling is not started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B8<br />STATUS_PROFILING_NOT_STOPPED</p>
+ </td>
+ <td>
+ <p>Profiling is not stopped.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000B9<br />STATUS_COULD_NOT_INTERPRET</p>
+ </td>
+ <td>
+ <p>The passed ACL did not contain the minimum required information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000BA<br />STATUS_FILE_IS_A_DIRECTORY</p>
+ </td>
+ <td>
+ <p>The file that was specified as a target is a directory, and the caller specified that it could be anything but a directory.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000BB<br />STATUS_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The request is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000BC<br />STATUS_REMOTE_NOT_LISTENING</p>
+ </td>
+ <td>
+ <p>This remote computer is not listening.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000BD<br />STATUS_DUPLICATE_NAME</p>
+ </td>
+ <td>
+ <p>A duplicate name exists on the network.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000BE<br />STATUS_BAD_NETWORK_PATH</p>
+ </td>
+ <td>
+ <p>The network path cannot be located.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000BF<br />STATUS_NETWORK_BUSY</p>
+ </td>
+ <td>
+ <p>The network is busy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C0<br />STATUS_DEVICE_DOES_NOT_EXIST</p>
+ </td>
+ <td>
+ <p>This device does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C1<br />STATUS_TOO_MANY_COMMANDS</p>
+ </td>
+ <td>
+ <p>The network BIOS command limit has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C2<br />STATUS_ADAPTER_HARDWARE_ERROR</p>
+ </td>
+ <td>
+ <p>An I/O adapter hardware error has occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C3<br />STATUS_INVALID_NETWORK_RESPONSE</p>
+ </td>
+ <td>
+ <p>The network responded incorrectly.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C4<br />STATUS_UNEXPECTED_NETWORK_ERROR</p>
+ </td>
+ <td>
+ <p>An unexpected network error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C5<br />STATUS_BAD_REMOTE_ADAPTER</p>
+ </td>
+ <td>
+ <p>The remote adapter is not compatible.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C6<br />STATUS_PRINT_QUEUE_FULL</p>
+ </td>
+ <td>
+ <p>The print queue is full.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C7<br />STATUS_NO_SPOOL_SPACE</p>
+ </td>
+ <td>
+ <p>Space to store the file that is waiting to be printed is not available on the server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C8<br />STATUS_PRINT_CANCELLED</p>
+ </td>
+ <td>
+ <p>The requested print file has been canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000C9<br />STATUS_NETWORK_NAME_DELETED</p>
+ </td>
+ <td>
+ <p>The network name was deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000CA<br />STATUS_NETWORK_ACCESS_DENIED</p>
+ </td>
+ <td>
+ <p>Network access is denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000CB<br />STATUS_BAD_DEVICE_TYPE</p>
+ </td>
+ <td>
+ <p>{Incorrect Network Resource Type} The specified device type (LPT, for example) conflicts with the actual device type on the remote resource.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000CC<br />STATUS_BAD_NETWORK_NAME</p>
+ </td>
+ <td>
+ <p>{Network Name Not Found} The specified share name cannot be found on the remote server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000CD<br />STATUS_TOO_MANY_NAMES</p>
+ </td>
+ <td>
+ <p>The name limit for the network adapter card of the local computer was exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000CE<br />STATUS_TOO_MANY_SESSIONS</p>
+ </td>
+ <td>
+ <p>The network BIOS session limit was exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000CF<br />STATUS_SHARING_PAUSED</p>
+ </td>
+ <td>
+ <p>File sharing has been temporarily paused.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D0<br />STATUS_REQUEST_NOT_ACCEPTED</p>
+ </td>
+ <td>
+ <p>No more connections can be made to this remote computer at this time because the computer has already accepted the maximum number of connections.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D1<br />STATUS_REDIRECTOR_PAUSED</p>
+ </td>
+ <td>
+ <p>Print or disk redirection is temporarily paused.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D2<br />STATUS_NET_WRITE_FAULT</p>
+ </td>
+ <td>
+ <p>A network data fault occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D3<br />STATUS_PROFILING_AT_LIMIT</p>
+ </td>
+ <td>
+ <p>The number of active profiling objects is at the maximum and no more may be started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D4<br />STATUS_NOT_SAME_DEVICE</p>
+ </td>
+ <td>
+ <p>{Incorrect Volume} The destination file of a rename request is located on a different device than the source of the rename request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D5<br />STATUS_FILE_RENAMED</p>
+ </td>
+ <td>
+ <p>The specified file has been renamed and thus cannot be modified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D6<br />STATUS_VIRTUAL_CIRCUIT_CLOSED</p>
+ </td>
+ <td>
+ <p>{Network Request Timeout} The session with a remote server has been disconnected because the time-out interval for a request has expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D7<br />STATUS_NO_SECURITY_ON_OBJECT</p>
+ </td>
+ <td>
+ <p>Indicates an attempt was made to operate on the security of an object that does not have security associated with it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D8<br />STATUS_CANT_WAIT</p>
+ </td>
+ <td>
+ <p>Used to indicate that an operation cannot continue without blocking for I/O.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000D9<br />STATUS_PIPE_EMPTY</p>
+ </td>
+ <td>
+ <p>Used to indicate that a read operation was done on an empty pipe.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000DA<br />STATUS_CANT_ACCESS_DOMAIN_INFO</p>
+ </td>
+ <td>
+ <p>Configuration information could not be read from the domain controller, either because the machine is unavailable or access has been denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000DB<br />STATUS_CANT_TERMINATE_SELF</p>
+ </td>
+ <td>
+ <p>Indicates that a thread attempted to terminate itself by default (called NtTerminateThread with NULL) and it was the last thread in the current process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000DC<br />STATUS_INVALID_SERVER_STATE</p>
+ </td>
+ <td>
+ <p>Indicates the Sam Server was in the wrong state to perform the desired operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000DD<br />STATUS_INVALID_DOMAIN_STATE</p>
+ </td>
+ <td>
+ <p>Indicates the domain was in the wrong state to perform the desired operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000DE<br />STATUS_INVALID_DOMAIN_ROLE</p>
+ </td>
+ <td>
+ <p>This operation is only allowed for the primary domain controller of the domain.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000DF<br />STATUS_NO_SUCH_DOMAIN</p>
+ </td>
+ <td>
+ <p>The specified domain did not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E0<br />STATUS_DOMAIN_EXISTS</p>
+ </td>
+ <td>
+ <p>The specified domain already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E1<br />STATUS_DOMAIN_LIMIT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>An attempt was made to exceed the limit on the number of domains per server for this release.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E2<br />STATUS_OPLOCK_NOT_GRANTED</p>
+ </td>
+ <td>
+ <p>An error status returned when the opportunistic lock (oplock) request is denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E3<br />STATUS_INVALID_OPLOCK_PROTOCOL</p>
+ </td>
+ <td>
+ <p>An error status returned when an invalid opportunistic lock (oplock) acknowledgment is received by a file system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E4<br />STATUS_INTERNAL_DB_CORRUPTION</p>
+ </td>
+ <td>
+ <p>This error indicates that the requested operation cannot be completed due to a catastrophic media failure or an on-disk data structure corruption.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E5<br />STATUS_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An internal error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E6<br />STATUS_GENERIC_NOT_MAPPED</p>
+ </td>
+ <td>
+ <p>Indicates generic access types were contained in an access mask which should already be mapped to non-generic access types.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E7<br />STATUS_BAD_DESCRIPTOR_FORMAT</p>
+ </td>
+ <td>
+ <p>Indicates a security descriptor is not in the necessary format (absolute or self-relative).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E8<br />STATUS_INVALID_USER_BUFFER</p>
+ </td>
+ <td>
+ <p>An access to a user buffer failed at an expected point in time. This code is defined because the caller does not want to accept STATUS_ACCESS_VIOLATION in its filter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000E9<br />STATUS_UNEXPECTED_IO_ERROR</p>
+ </td>
+ <td>
+ <p>If an I/O error that is not defined in the standard FsRtl filter is returned, it is converted to the following error, which is guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000EA<br />STATUS_UNEXPECTED_MM_CREATE_ERR</p>
+ </td>
+ <td>
+ <p>If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000EB<br />STATUS_UNEXPECTED_MM_MAP_ERROR</p>
+ </td>
+ <td>
+ <p>If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000EC<br />STATUS_UNEXPECTED_MM_EXTEND_ERR</p>
+ </td>
+ <td>
+ <p>If an MM error that is not defined in the standard FsRtl filter is returned, it is converted to one of the following errors, which are guaranteed to be in the filter. In this case, information is lost; however, the filter correctly handles the exception.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000ED<br />STATUS_NOT_LOGON_PROCESS</p>
+ </td>
+ <td>
+ <p>The requested action is restricted for use by logon processes only. The calling process has not registered as a logon process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000EE<br />STATUS_LOGON_SESSION_EXISTS</p>
+ </td>
+ <td>
+ <p>An attempt has been made to start a new session manager or LSA logon session by using an ID that is already in use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000EF<br />STATUS_INVALID_PARAMETER_1</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the first argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F0<br />STATUS_INVALID_PARAMETER_2</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the second argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F1<br />STATUS_INVALID_PARAMETER_3</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the third argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F2<br />STATUS_INVALID_PARAMETER_4</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the fourth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F3<br />STATUS_INVALID_PARAMETER_5</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the fifth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F4<br />STATUS_INVALID_PARAMETER_6</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the sixth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F5<br />STATUS_INVALID_PARAMETER_7</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the seventh argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F6<br />STATUS_INVALID_PARAMETER_8</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the eighth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F7<br />STATUS_INVALID_PARAMETER_9</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the ninth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F8<br />STATUS_INVALID_PARAMETER_10</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the tenth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000F9<br />STATUS_INVALID_PARAMETER_11</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the eleventh argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000FA<br />STATUS_INVALID_PARAMETER_12</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a service or function as the twelfth argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000FB<br />STATUS_REDIRECTOR_NOT_STARTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to access a network file, but the network software was not yet started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000FC<br />STATUS_REDIRECTOR_STARTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to start the redirector, but the redirector has already been started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000FD<br />STATUS_STACK_OVERFLOW</p>
+ </td>
+ <td>
+ <p>A new guard page for the stack cannot be created.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000FE<br />STATUS_NO_SUCH_PACKAGE</p>
+ </td>
+ <td>
+ <p>A specified authentication package is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00000FF<br />STATUS_BAD_FUNCTION_TABLE</p>
+ </td>
+ <td>
+ <p>A malformed function table was encountered during an unwind operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000100<br />STATUS_VARIABLE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Indicates the specified environment variable name was not found in the specified environment block.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000101<br />STATUS_DIRECTORY_NOT_EMPTY</p>
+ </td>
+ <td>
+ <p>Indicates that the directory trying to be deleted is not empty.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000102<br />STATUS_FILE_CORRUPT_ERROR</p>
+ </td>
+ <td>
+ <p>{Corrupt File} The file or directory %hs is corrupt and unreadable. Run the Chkdsk utility.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000103<br />STATUS_NOT_A_DIRECTORY</p>
+ </td>
+ <td>
+ <p>A requested opened file is not a directory.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000104<br />STATUS_BAD_LOGON_SESSION_STATE</p>
+ </td>
+ <td>
+ <p>The logon session is not in a state that is consistent with the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000105<br />STATUS_LOGON_SESSION_COLLISION</p>
+ </td>
+ <td>
+ <p>An internal LSA error has occurred. An authentication package has requested the creation of a logon session but the ID of an already existing logon session has been specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000106<br />STATUS_NAME_TOO_LONG</p>
+ </td>
+ <td>
+ <p>A specified name string is too long for its intended use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000107<br />STATUS_FILES_OPEN</p>
+ </td>
+ <td>
+ <p>The user attempted to force close the files on a redirected drive, but there were opened files on the drive, and the user did not specify a sufficient level of force.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000108<br />STATUS_CONNECTION_IN_USE</p>
+ </td>
+ <td>
+ <p>The user attempted to force close the files on a redirected drive, but there were opened directories on the drive, and the user did not specify a sufficient level of force.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000109<br />STATUS_MESSAGE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>RtlFindMessage could not locate the requested message ID in the message table resource.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000010A<br />STATUS_PROCESS_IS_TERMINATING</p>
+ </td>
+ <td>
+ <p>An attempt was made to duplicate an object handle into or out of an exiting process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000010B<br />STATUS_INVALID_LOGON_TYPE</p>
+ </td>
+ <td>
+ <p>Indicates an invalid value has been provided for the LogonType requested.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000010C<br />STATUS_NO_GUID_TRANSLATION</p>
+ </td>
+ <td>
+ <p>Indicates that an attempt was made to assign protection to a file system file or directory and one of the SIDs in the security descriptor could not be translated into a GUID that could be stored by the file system. This causes the protection attempt to fail, which may cause a file creation attempt to fail.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000010D<br />STATUS_CANNOT_IMPERSONATE</p>
+ </td>
+ <td>
+ <p>Indicates that an attempt has been made to impersonate via a named pipe that has not yet been read from.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000010E<br />STATUS_IMAGE_ALREADY_LOADED</p>
+ </td>
+ <td>
+ <p>Indicates that the specified image is already loaded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000117<br />STATUS_NO_LDT</p>
+ </td>
+ <td>
+ <p>Indicates that an attempt was made to change the size of the LDT for a process that has no LDT.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000118<br />STATUS_INVALID_LDT_SIZE</p>
+ </td>
+ <td>
+ <p>Indicates that an attempt was made to grow an LDT by setting its size, or that the size was not an even number of selectors.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000119<br />STATUS_INVALID_LDT_OFFSET</p>
+ </td>
+ <td>
+ <p>Indicates that the starting value for the LDT information was not an integral multiple of the selector size.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000011A<br />STATUS_INVALID_LDT_DESCRIPTOR</p>
+ </td>
+ <td>
+ <p>Indicates that the user supplied an invalid descriptor when trying to set up LDT descriptors.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000011B<br />STATUS_INVALID_IMAGE_NE_FORMAT</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format. It appears to be NE format.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000011C<br />STATUS_RXACT_INVALID_STATE</p>
+ </td>
+ <td>
+ <p>Indicates that the transaction state of a registry subtree is incompatible with the requested operation. For example, a request has been made to start a new transaction with one already in progress, or a request has been made to apply a transaction when one is not currently in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000011D<br />STATUS_RXACT_COMMIT_FAILURE</p>
+ </td>
+ <td>
+ <p>Indicates an error has occurred during a registry transaction commit. The database has been left in an unknown, but probably inconsistent, state. The state of the registry transaction is left as COMMITTING.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000011E<br />STATUS_MAPPED_FILE_SIZE_ZERO</p>
+ </td>
+ <td>
+ <p>An attempt was made to map a file of size zero with the maximum size specified as zero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000011F<br />STATUS_TOO_MANY_OPENED_FILES</p>
+ </td>
+ <td>
+ <p>Too many files are opened on a remote server. This error should only be returned by the Windows redirector on a remote drive.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000120<br />STATUS_CANCELLED</p>
+ </td>
+ <td>
+ <p>The I/O request was canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000121<br />STATUS_CANNOT_DELETE</p>
+ </td>
+ <td>
+ <p>An attempt has been made to remove a file or directory that cannot be deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000122<br />STATUS_INVALID_COMPUTER_NAME</p>
+ </td>
+ <td>
+ <p>Indicates a name that was specified as a remote computer name is syntactically invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000123<br />STATUS_FILE_DELETED</p>
+ </td>
+ <td>
+ <p>An I/O request other than close was performed on a file after it was deleted, which can only happen to a request that did not complete before the last handle was closed via NtClose.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000124<br />STATUS_SPECIAL_ACCOUNT</p>
+ </td>
+ <td>
+ <p>Indicates an operation that is incompatible with built-in accounts has been attempted on a built-in (special) SAM account. For example, built-in accounts cannot be deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000125<br />STATUS_SPECIAL_GROUP</p>
+ </td>
+ <td>
+ <p>The operation requested may not be performed on the specified group because it is a built-in special group.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000126<br />STATUS_SPECIAL_USER</p>
+ </td>
+ <td>
+ <p>The operation requested may not be performed on the specified user because it is a built-in special user.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000127<br />STATUS_MEMBERS_PRIMARY_GROUP</p>
+ </td>
+ <td>
+ <p>Indicates a member cannot be removed from a group because the group is currently the member's primary group.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000128<br />STATUS_FILE_CLOSED</p>
+ </td>
+ <td>
+ <p>An I/O request other than close and several other special case operations was attempted using a file object that had already been closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000129<br />STATUS_TOO_MANY_THREADS</p>
+ </td>
+ <td>
+ <p>Indicates a process has too many threads to perform the requested action. For example, assignment of a primary token may only be performed when a process has zero or one threads.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000012A<br />STATUS_THREAD_NOT_IN_PROCESS</p>
+ </td>
+ <td>
+ <p>An attempt was made to operate on a thread within a specific process, but the specified thread is not in the specified process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000012B<br />STATUS_TOKEN_ALREADY_IN_USE</p>
+ </td>
+ <td>
+ <p>An attempt was made to establish a token for use as a primary token but the token is already in use. A token can only be the primary token of one process at a time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000012C<br />STATUS_PAGEFILE_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The page file quota was exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000012D<br />STATUS_COMMITMENT_LIMIT</p>
+ </td>
+ <td>
+ <p>{Out of Virtual Memory} Your system is low on virtual memory. To ensure that Windows runs correctly, increase the size of your virtual memory paging file. For more information, see Help.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000012E<br />STATUS_INVALID_IMAGE_LE_FORMAT</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format: it appears to be LE format.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000012F<br />STATUS_INVALID_IMAGE_NOT_MZ</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format: it did not have an initial MZ.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000130<br />STATUS_INVALID_IMAGE_PROTECT</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format: it did not have a proper e_lfarlc in the MZ header.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000131<br />STATUS_INVALID_IMAGE_WIN_16</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format: it appears to be a 16-bit Windows image.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000132<br />STATUS_LOGON_SERVER_CONFLICT</p>
+ </td>
+ <td>
+ <p>The Netlogon service cannot start because another Netlogon service running in the domain conflicts with the specified role.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000133<br />STATUS_TIME_DIFFERENCE_AT_DC</p>
+ </td>
+ <td>
+ <p>The time at the primary domain controller is different from the time at the backup domain controller or member server by too large an amount.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000134<br />STATUS_SYNCHRONIZATION_REQUIRED</p>
+ </td>
+ <td>
+ <p>The SAM database on a Windows Server is significantly out of synchronization with the copy on the domain controller. A complete synchronization is required.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000135<br />STATUS_DLL_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Unable To Locate Component} This application has failed to start because %hs was not found. Reinstalling the application may fix this problem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000136<br />STATUS_OPEN_FAILED</p>
+ </td>
+ <td>
+ <p>The NtCreateFile API failed. This error should never be returned to an application; it is a place holder for the Windows LAN Manager Redirector to use in its internal error-mapping routines.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000137<br />STATUS_IO_PRIVILEGE_FAILED</p>
+ </td>
+ <td>
+ <p>{Privilege Failed} The I/O permissions for the process could not be changed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000138<br />STATUS_ORDINAL_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Ordinal Not Found} The ordinal %ld could not be located in the dynamic link library %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000139<br />STATUS_ENTRYPOINT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Entry Point Not Found} The procedure entry point %hs could not be located in the dynamic link library %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000013A<br />STATUS_CONTROL_C_EXIT</p>
+ </td>
+ <td>
+ <p>{Application Exit by CTRL+C} The application terminated as a result of a CTRL+C.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000013B<br />STATUS_LOCAL_DISCONNECT</p>
+ </td>
+ <td>
+ <p>{Virtual Circuit Closed} The network transport on your computer has closed a network connection. There may or may not be I/O requests outstanding.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000013C<br />STATUS_REMOTE_DISCONNECT</p>
+ </td>
+ <td>
+ <p>{Virtual Circuit Closed} The network transport on a remote computer has closed a network connection. There may or may not be I/O requests outstanding.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000013D<br />STATUS_REMOTE_RESOURCES</p>
+ </td>
+ <td>
+ <p>{Insufficient Resources on Remote Computer} The remote computer has insufficient resources to complete the network request. For example, the remote computer may not have enough available memory to carry out the request at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000013E<br />STATUS_LINK_FAILED</p>
+ </td>
+ <td>
+ <p>{Virtual Circuit Closed} An existing connection (virtual circuit) has been broken at the remote computer. There is probably something wrong with the network software protocol or the network hardware on the remote computer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000013F<br />STATUS_LINK_TIMEOUT</p>
+ </td>
+ <td>
+ <p>{Virtual Circuit Closed} The network transport on your computer has closed a network connection because it had to wait too long for a response from the remote computer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000140<br />STATUS_INVALID_CONNECTION</p>
+ </td>
+ <td>
+ <p>The connection handle that was given to the transport was invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000141<br />STATUS_INVALID_ADDRESS</p>
+ </td>
+ <td>
+ <p>The address handle that was given to the transport was invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000142<br />STATUS_DLL_INIT_FAILED</p>
+ </td>
+ <td>
+ <p>{DLL Initialization Failed} Initialization of the dynamic link library %hs failed. The process is terminating abnormally.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000143<br />STATUS_MISSING_SYSTEMFILE</p>
+ </td>
+ <td>
+ <p>{Missing System File} The required system file %hs is bad or missing.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000144<br />STATUS_UNHANDLED_EXCEPTION</p>
+ </td>
+ <td>
+ <p>{Application Error} The exception %s (0x%08lx) occurred in the application at location 0x%08lx.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000145<br />STATUS_APP_INIT_FAILURE</p>
+ </td>
+ <td>
+ <p>{Application Error} The application failed to initialize properly (0x%lx). Click OK to terminate the application.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000146<br />STATUS_PAGEFILE_CREATE_FAILED</p>
+ </td>
+ <td>
+ <p>{Unable to Create Paging File} The creation of the paging file %hs failed (%lx). The requested size was %ld.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000147<br />STATUS_NO_PAGEFILE</p>
+ </td>
+ <td>
+ <p>{No Paging File Specified} No paging file was specified in the system configuration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000148<br />STATUS_INVALID_LEVEL</p>
+ </td>
+ <td>
+ <p>{Incorrect System Call Level} An invalid level was passed into the specified system call.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000149<br />STATUS_WRONG_PASSWORD_CORE</p>
+ </td>
+ <td>
+ <p>{Incorrect Password to LAN Manager Server} You specified an incorrect password to a LAN Manager 2.x or MS-NET server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000014A<br />STATUS_ILLEGAL_FLOAT_CONTEXT</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} A real-mode application issued a floating-point instruction and floating-point hardware is not present.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000014B<br />STATUS_PIPE_BROKEN</p>
+ </td>
+ <td>
+ <p>The pipe operation has failed because the other end of the pipe has been closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000014C<br />STATUS_REGISTRY_CORRUPT</p>
+ </td>
+ <td>
+ <p>{The Registry Is Corrupt} The structure of one of the files that contains registry data is corrupt; the image of the file in memory is corrupt; or the file could not be recovered because the alternate copy or log was absent or corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000014D<br />STATUS_REGISTRY_IO_FAILED</p>
+ </td>
+ <td>
+ <p>An I/O operation initiated by the Registry failed and cannot be recovered. The registry could not read in, write out, or flush one of the files that contain the system's image of the registry.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000014E<br />STATUS_NO_EVENT_PAIR</p>
+ </td>
+ <td>
+ <p>An event pair synchronization operation was performed using the thread-specific client/server event pair object, but no event pair object was associated with the thread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000014F<br />STATUS_UNRECOGNIZED_VOLUME</p>
+ </td>
+ <td>
+ <p>The volume does not contain a recognized file system. Be sure that all required file system drivers are loaded and that the volume is not corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000150<br />STATUS_SERIAL_NO_DEVICE_INITED</p>
+ </td>
+ <td>
+ <p>No serial device was successfully initialized. The serial driver will unload.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000151<br />STATUS_NO_SUCH_ALIAS</p>
+ </td>
+ <td>
+ <p>The specified local group does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000152<br />STATUS_MEMBER_NOT_IN_ALIAS</p>
+ </td>
+ <td>
+ <p>The specified account name is not a member of the group.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000153<br />STATUS_MEMBER_IN_ALIAS</p>
+ </td>
+ <td>
+ <p>The specified account name is already a member of the group.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000154<br />STATUS_ALIAS_EXISTS</p>
+ </td>
+ <td>
+ <p>The specified local group already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000155<br />STATUS_LOGON_NOT_GRANTED</p>
+ </td>
+ <td>
+ <p>A requested type of logon (for example, interactive, network, and service) is not granted by the local security policy of the target system. Ask the system administrator to grant the necessary form of logon.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000156<br />STATUS_TOO_MANY_SECRETS</p>
+ </td>
+ <td>
+ <p>The maximum number of secrets that may be stored in a single system was exceeded. The length and number of secrets is limited to satisfy U.S. State Department export restrictions.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000157<br />STATUS_SECRET_TOO_LONG</p>
+ </td>
+ <td>
+ <p>The length of a secret exceeds the maximum allowable length. The length and number of secrets is limited to satisfy U.S. State Department export restrictions.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000158<br />STATUS_INTERNAL_DB_ERROR</p>
+ </td>
+ <td>
+ <p>The local security authority (LSA) database contains an internal inconsistency.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000159<br />STATUS_FULLSCREEN_MODE</p>
+ </td>
+ <td>
+ <p>The requested operation cannot be performed in full-screen mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000015A<br />STATUS_TOO_MANY_CONTEXT_IDS</p>
+ </td>
+ <td>
+ <p>During a logon attempt, the user's security context accumulated too many security IDs. This is a very unusual situation. Remove the user from some global or local groups to reduce the number of security IDs to incorporate into the security context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000015B<br />STATUS_LOGON_TYPE_NOT_GRANTED</p>
+ </td>
+ <td>
+ <p>A user has requested a type of logon (for example, interactive or network) that has not been granted. An administrator has control over who may logon interactively and through the network.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000015C<br />STATUS_NOT_REGISTRY_FILE</p>
+ </td>
+ <td>
+ <p>The system has attempted to load or restore a file into the registry, and the specified file is not in the format of a registry file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000015D<br />STATUS_NT_CROSS_ENCRYPTION_REQUIRED</p>
+ </td>
+ <td>
+ <p>An attempt was made to change a user password in the security account manager without providing the necessary Windows cross-encrypted password.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000015E<br />STATUS_DOMAIN_CTRLR_CONFIG_ERROR</p>
+ </td>
+ <td>
+ <p>A Windows Server has an incorrect configuration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000015F<br />STATUS_FT_MISSING_MEMBER</p>
+ </td>
+ <td>
+ <p>An attempt was made to explicitly access the secondary copy of information via a device control to the fault tolerance driver and the secondary copy is not present in the system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000160<br />STATUS_ILL_FORMED_SERVICE_ENTRY</p>
+ </td>
+ <td>
+ <p>A configuration registry node that represents a driver service entry was ill-formed and did not contain the required value entries.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000161<br />STATUS_ILLEGAL_CHARACTER</p>
+ </td>
+ <td>
+ <p>An illegal character was encountered. For a multibyte character set, this includes a lead byte without a succeeding trail byte. For the Unicode character set this includes the characters 0xFFFF and 0xFFFE.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000162<br />STATUS_UNMAPPABLE_CHARACTER</p>
+ </td>
+ <td>
+ <p>No mapping for the Unicode character exists in the target multibyte code page.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000163<br />STATUS_UNDEFINED_CHARACTER</p>
+ </td>
+ <td>
+ <p>The Unicode character is not defined in the Unicode character set that is installed on the system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000164<br />STATUS_FLOPPY_VOLUME</p>
+ </td>
+ <td>
+ <p>The paging file cannot be created on a floppy disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000165<br />STATUS_FLOPPY_ID_MARK_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Floppy Disk Error} While accessing a floppy disk, an ID address mark was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000166<br />STATUS_FLOPPY_WRONG_CYLINDER</p>
+ </td>
+ <td>
+ <p>{Floppy Disk Error} While accessing a floppy disk, the track address from the sector ID field was found to be different from the track address that is maintained by the controller.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000167<br />STATUS_FLOPPY_UNKNOWN_ERROR</p>
+ </td>
+ <td>
+ <p>{Floppy Disk Error} The floppy disk controller reported an error that is not recognized by the floppy disk driver.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000168<br />STATUS_FLOPPY_BAD_REGISTERS</p>
+ </td>
+ <td>
+ <p>{Floppy Disk Error} While accessing a floppy-disk, the controller returned inconsistent results via its registers.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000169<br />STATUS_DISK_RECALIBRATE_FAILED</p>
+ </td>
+ <td>
+ <p>{Hard Disk Error} While accessing the hard disk, a recalibrate operation failed, even after retries.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000016A<br />STATUS_DISK_OPERATION_FAILED</p>
+ </td>
+ <td>
+ <p>{Hard Disk Error} While accessing the hard disk, a disk operation failed even after retries.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000016B<br />STATUS_DISK_RESET_FAILED</p>
+ </td>
+ <td>
+ <p>{Hard Disk Error} While accessing the hard disk, a disk controller reset was needed, but even that failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000016C<br />STATUS_SHARED_IRQ_BUSY</p>
+ </td>
+ <td>
+ <p>An attempt was made to open a device that was sharing an interrupt request (IRQ) with other devices. At least one other device that uses that IRQ was already opened. Two concurrent opens of devices that share an IRQ and only work via interrupts is not supported for the particular bus type that the devices use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000016D<br />STATUS_FT_ORPHANING</p>
+ </td>
+ <td>
+ <p>{FT Orphaning} A disk that is part of a fault-tolerant volume can no longer be accessed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000016E<br />STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT</p>
+ </td>
+ <td>
+ <p>The basic input/output system (BIOS) failed to connect a system interrupt to the device or bus for which the device is connected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000172<br />STATUS_PARTITION_FAILURE</p>
+ </td>
+ <td>
+ <p>The tape could not be partitioned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000173<br />STATUS_INVALID_BLOCK_LENGTH</p>
+ </td>
+ <td>
+ <p>When accessing a new tape of a multi-volume partition, the current blocksize is incorrect.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000174<br />STATUS_DEVICE_NOT_PARTITIONED</p>
+ </td>
+ <td>
+ <p>The tape partition information could not be found when loading a tape.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000175<br />STATUS_UNABLE_TO_LOCK_MEDIA</p>
+ </td>
+ <td>
+ <p>An attempt to lock the eject media mechanism failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000176<br />STATUS_UNABLE_TO_UNLOAD_MEDIA</p>
+ </td>
+ <td>
+ <p>An attempt to unload media failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000177<br />STATUS_EOM_OVERFLOW</p>
+ </td>
+ <td>
+ <p>The physical end of tape was detected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000178<br />STATUS_NO_MEDIA</p>
+ </td>
+ <td>
+ <p>{No Media} There is no media in the drive. Insert media into drive %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000017A<br />STATUS_NO_SUCH_MEMBER</p>
+ </td>
+ <td>
+ <p>A member could not be added to or removed from the local group because the member does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000017B<br />STATUS_INVALID_MEMBER</p>
+ </td>
+ <td>
+ <p>A new member could not be added to a local group because the member has the wrong account type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000017C<br />STATUS_KEY_DELETED</p>
+ </td>
+ <td>
+ <p>An illegal operation was attempted on a registry key that has been marked for deletion.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000017D<br />STATUS_NO_LOG_SPACE</p>
+ </td>
+ <td>
+ <p>The system could not allocate the required space in a registry log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000017E<br />STATUS_TOO_MANY_SIDS</p>
+ </td>
+ <td>
+ <p>Too many SIDs have been specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000017F<br />STATUS_LM_CROSS_ENCRYPTION_REQUIRED</p>
+ </td>
+ <td>
+ <p>An attempt was made to change a user password in the security account manager without providing the necessary LM cross-encrypted password.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000180<br />STATUS_KEY_HAS_CHILDREN</p>
+ </td>
+ <td>
+ <p>An attempt was made to create a symbolic link in a registry key that already has subkeys or values.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000181<br />STATUS_CHILD_MUST_BE_VOLATILE</p>
+ </td>
+ <td>
+ <p>An attempt was made to create a stable subkey under a volatile parent key.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000182<br />STATUS_DEVICE_CONFIGURATION_ERROR</p>
+ </td>
+ <td>
+ <p>The I/O device is configured incorrectly or the configuration parameters to the driver are incorrect.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000183<br />STATUS_DRIVER_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An error was detected between two drivers or within an I/O driver.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000184<br />STATUS_INVALID_DEVICE_STATE</p>
+ </td>
+ <td>
+ <p>The device is not in a valid state to perform this request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000185<br />STATUS_IO_DEVICE_ERROR</p>
+ </td>
+ <td>
+ <p>The I/O device reported an I/O error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000186<br />STATUS_DEVICE_PROTOCOL_ERROR</p>
+ </td>
+ <td>
+ <p>A protocol error was detected between the driver and the device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000187<br />STATUS_BACKUP_CONTROLLER</p>
+ </td>
+ <td>
+ <p>This operation is only allowed for the primary domain controller of the domain.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000188<br />STATUS_LOG_FILE_FULL</p>
+ </td>
+ <td>
+ <p>The log file space is insufficient to support this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000189<br />STATUS_TOO_LATE</p>
+ </td>
+ <td>
+ <p>A write operation was attempted to a volume after it was dismounted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000018A<br />STATUS_NO_TRUST_LSA_SECRET</p>
+ </td>
+ <td>
+ <p>The workstation does not have a trust secret for the primary domain in the local LSA database.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000018B<br />STATUS_NO_TRUST_SAM_ACCOUNT</p>
+ </td>
+ <td>
+ <p>The SAM database on the Windows Server does not have a computer account for this workstation trust relationship.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000018C<br />STATUS_TRUSTED_DOMAIN_FAILURE</p>
+ </td>
+ <td>
+ <p>The logon request failed because the trust relationship between the primary domain and the trusted domain failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000018D<br />STATUS_TRUSTED_RELATIONSHIP_FAILURE</p>
+ </td>
+ <td>
+ <p>The logon request failed because the trust relationship between this workstation and the primary domain failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000018E<br />STATUS_EVENTLOG_FILE_CORRUPT</p>
+ </td>
+ <td>
+ <p>The Eventlog log file is corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000018F<br />STATUS_EVENTLOG_CANT_START</p>
+ </td>
+ <td>
+ <p>No Eventlog log file could be opened. The Eventlog service did not start.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000190<br />STATUS_TRUST_FAILURE</p>
+ </td>
+ <td>
+ <p>The network logon failed. This may be because the validation authority cannot be reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000191<br />STATUS_MUTANT_LIMIT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>An attempt was made to acquire a mutant such that its maximum count would have been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000192<br />STATUS_NETLOGON_NOT_STARTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to logon, but the NetLogon service was not started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000193<br />STATUS_ACCOUNT_EXPIRED</p>
+ </td>
+ <td>
+ <p>The user account has expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000194<br />STATUS_POSSIBLE_DEADLOCK</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Possible deadlock condition.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000195<br />STATUS_NETWORK_CREDENTIAL_CONFLICT</p>
+ </td>
+ <td>
+ <p>Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000196<br />STATUS_REMOTE_SESSION_LIMIT</p>
+ </td>
+ <td>
+ <p>An attempt was made to establish a session to a network server, but there are already too many sessions established to that server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000197<br />STATUS_EVENTLOG_FILE_CHANGED</p>
+ </td>
+ <td>
+ <p>The log file has changed between reads.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000198<br />STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT</p>
+ </td>
+ <td>
+ <p>The account used is an interdomain trust account. Use your global user account or local user account to access this server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000199<br />STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT</p>
+ </td>
+ <td>
+ <p>The account used is a computer account. Use your global user account or local user account to access this server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000019A<br />STATUS_NOLOGON_SERVER_TRUST_ACCOUNT</p>
+ </td>
+ <td>
+ <p>The account used is a server trust account. Use your global user account or local user account to access this server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000019B<br />STATUS_DOMAIN_TRUST_INCONSISTENT</p>
+ </td>
+ <td>
+ <p>The name or SID of the specified domain is inconsistent with the trust information for that domain.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000019C<br />STATUS_FS_DRIVER_REQUIRED</p>
+ </td>
+ <td>
+ <p>A volume has been accessed for which a file system driver is required that has not yet been loaded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000019D<br />STATUS_IMAGE_ALREADY_LOADED_AS_DLL</p>
+ </td>
+ <td>
+ <p>Indicates that the specified image is already loaded as a DLL.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000019E<br />STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING</p>
+ </td>
+ <td>
+ <p>Short name settings may not be changed on this volume due to the global registry setting.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000019F<br />STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME</p>
+ </td>
+ <td>
+ <p>Short names are not enabled on this volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00001A0<br />STATUS_SECURITY_STREAM_IS_INCONSISTENT</p>
+ </td>
+ <td>
+ <p>The security stream for the given volume is in an inconsistent state. Please run CHKDSK on the volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00001A1<br />STATUS_INVALID_LOCK_RANGE</p>
+ </td>
+ <td>
+ <p>A requested file lock operation cannot be processed due to an invalid byte range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00001A2<br />STATUS_INVALID_ACE_CONDITION</p>
+ </td>
+ <td>
+ <p>The specified access control entry (ACE) contains an invalid condition.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00001A3<br />STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT</p>
+ </td>
+ <td>
+ <p>The subsystem needed to support the image type is not present.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00001A4<br />STATUS_NOTIFICATION_GUID_ALREADY_DEFINED</p>
+ </td>
+ <td>
+ <p>The specified file already has a notification GUID associated with it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000201<br />STATUS_NETWORK_OPEN_RESTRICTION</p>
+ </td>
+ <td>
+ <p>A remote open failed because the network open restrictions were not satisfied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000202<br />STATUS_NO_USER_SESSION_KEY</p>
+ </td>
+ <td>
+ <p>There is no user session key for the specified logon session.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000203<br />STATUS_USER_SESSION_DELETED</p>
+ </td>
+ <td>
+ <p>The remote user session has been deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000204<br />STATUS_RESOURCE_LANG_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Indicates the specified resource language ID cannot be found in the image file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000205<br />STATUS_INSUFF_SERVER_RESOURCES</p>
+ </td>
+ <td>
+ <p>Insufficient server resources exist to complete the request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000206<br />STATUS_INVALID_BUFFER_SIZE</p>
+ </td>
+ <td>
+ <p>The size of the buffer is invalid for the specified operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000207<br />STATUS_INVALID_ADDRESS_COMPONENT</p>
+ </td>
+ <td>
+ <p>The transport rejected the specified network address as invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000208<br />STATUS_INVALID_ADDRESS_WILDCARD</p>
+ </td>
+ <td>
+ <p>The transport rejected the specified network address due to invalid use of a wildcard.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000209<br />STATUS_TOO_MANY_ADDRESSES</p>
+ </td>
+ <td>
+ <p>The transport address could not be opened because all the available addresses are in use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000020A<br />STATUS_ADDRESS_ALREADY_EXISTS</p>
+ </td>
+ <td>
+ <p>The transport address could not be opened because it already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000020B<br />STATUS_ADDRESS_CLOSED</p>
+ </td>
+ <td>
+ <p>The transport address is now closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000020C<br />STATUS_CONNECTION_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>The transport connection is now disconnected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000020D<br />STATUS_CONNECTION_RESET</p>
+ </td>
+ <td>
+ <p>The transport connection has been reset.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000020E<br />STATUS_TOO_MANY_NODES</p>
+ </td>
+ <td>
+ <p>The transport cannot dynamically acquire any more nodes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000020F<br />STATUS_TRANSACTION_ABORTED</p>
+ </td>
+ <td>
+ <p>The transport aborted a pending transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000210<br />STATUS_TRANSACTION_TIMED_OUT</p>
+ </td>
+ <td>
+ <p>The transport timed out a request that is waiting for a response.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000211<br />STATUS_TRANSACTION_NO_RELEASE</p>
+ </td>
+ <td>
+ <p>The transport did not receive a release for a pending response.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000212<br />STATUS_TRANSACTION_NO_MATCH</p>
+ </td>
+ <td>
+ <p>The transport did not find a transaction that matches the specific token.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000213<br />STATUS_TRANSACTION_RESPONDED</p>
+ </td>
+ <td>
+ <p>The transport had previously responded to a transaction request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000214<br />STATUS_TRANSACTION_INVALID_ID</p>
+ </td>
+ <td>
+ <p>The transport does not recognize the specified transaction request ID.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000215<br />STATUS_TRANSACTION_INVALID_TYPE</p>
+ </td>
+ <td>
+ <p>The transport does not recognize the specified transaction request type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000216<br />STATUS_NOT_SERVER_SESSION</p>
+ </td>
+ <td>
+ <p>The transport can only process the specified request on the server side of a session.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000217<br />STATUS_NOT_CLIENT_SESSION</p>
+ </td>
+ <td>
+ <p>The transport can only process the specified request on the client side of a session.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000218<br />STATUS_CANNOT_LOAD_REGISTRY_FILE</p>
+ </td>
+ <td>
+ <p>{Registry File Failure} The registry cannot load the hive (file): %hs or its log or alternate. It is corrupt, absent, or not writable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000219<br />STATUS_DEBUG_ATTACH_FAILED</p>
+ </td>
+ <td>
+ <p>{Unexpected Failure in DebugActiveProcess} An unexpected failure occurred while processing a DebugActiveProcess API request. You may choose OK to terminate the process, or Cancel to ignore the error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000021A<br />STATUS_SYSTEM_PROCESS_TERMINATED</p>
+ </td>
+ <td>
+ <p>{Fatal System Error} The %hs system process terminated unexpectedly with a status of 0x%08x (0x%08x 0x%08x). The system has been shut down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000021B<br />STATUS_DATA_NOT_ACCEPTED</p>
+ </td>
+ <td>
+ <p>{Data Not Accepted} The TDI client could not handle the data received during an indication.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000021C<br />STATUS_NO_BROWSER_SERVERS_FOUND</p>
+ </td>
+ <td>
+ <p>{Unable to Retrieve Browser Server List} The list of servers for this workgroup is not currently available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000021D<br />STATUS_VDM_HARD_ERROR</p>
+ </td>
+ <td>
+ <p>NTVDM encountered a hard error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000021E<br />STATUS_DRIVER_CANCEL_TIMEOUT</p>
+ </td>
+ <td>
+ <p>{Cancel Timeout} The driver %hs failed to complete a canceled I/O request in the allotted time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000021F<br />STATUS_REPLY_MESSAGE_MISMATCH</p>
+ </td>
+ <td>
+ <p>{Reply Message Mismatch} An attempt was made to reply to an LPC message, but the thread specified by the client ID in the message was not waiting on that message.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000220<br />STATUS_MAPPED_ALIGNMENT</p>
+ </td>
+ <td>
+ <p>{Mapped View Alignment Incorrect} An attempt was made to map a view of a file, but either the specified base address or the offset into the file were not aligned on the proper allocation granularity.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000221<br />STATUS_IMAGE_CHECKSUM_MISMATCH</p>
+ </td>
+ <td>
+ <p>{Bad Image Checksum} The image %hs is possibly corrupt. The header checksum does not match the computed checksum.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000222<br />STATUS_LOST_WRITEBEHIND_DATA</p>
+ </td>
+ <td>
+ <p>{Delayed Write Failed} Windows was unable to save all the data for the file %hs. The data has been lost. This error may be caused by a failure of your computer hardware or network connection. Try to save this file elsewhere.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000223<br />STATUS_CLIENT_SERVER_PARAMETERS_INVALID</p>
+ </td>
+ <td>
+ <p>The parameters passed to the server in the client/server shared memory window were invalid. Too much data may have been put in the shared memory window.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000224<br />STATUS_PASSWORD_MUST_CHANGE</p>
+ </td>
+ <td>
+ <p>The user password must be changed before logging on the first time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000225<br />STATUS_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The object was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000226<br />STATUS_NOT_TINY_STREAM</p>
+ </td>
+ <td>
+ <p>The stream is not a tiny stream.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000227<br />STATUS_RECOVERY_FAILURE</p>
+ </td>
+ <td>
+ <p>A transaction recovery failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000228<br />STATUS_STACK_OVERFLOW_READ</p>
+ </td>
+ <td>
+ <p>The request must be handled by the stack overflow code.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000229<br />STATUS_FAIL_CHECK</p>
+ </td>
+ <td>
+ <p>A consistency check failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000022A<br />STATUS_DUPLICATE_OBJECTID</p>
+ </td>
+ <td>
+ <p>The attempt to insert the ID in the index failed because the ID is already in the index.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000022B<br />STATUS_OBJECTID_EXISTS</p>
+ </td>
+ <td>
+ <p>The attempt to set the object ID failed because the object already has an ID.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000022C<br />STATUS_CONVERT_TO_LARGE</p>
+ </td>
+ <td>
+ <p>Internal OFS status codes indicating how an allocation operation is handled. Either it is retried after the containing oNode is moved or the extent stream is converted to a large stream.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000022D<br />STATUS_RETRY</p>
+ </td>
+ <td>
+ <p>The request needs to be retried.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000022E<br />STATUS_FOUND_OUT_OF_SCOPE</p>
+ </td>
+ <td>
+ <p>The attempt to find the object found an object on the volume that matches by ID; however, it is out of the scope of the handle that is used for the operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000022F<br />STATUS_ALLOCATE_BUCKET</p>
+ </td>
+ <td>
+ <p>The bucket array must be grown. Retry the transaction after doing so.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000230<br />STATUS_PROPSET_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified property set does not exist on the object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000231<br />STATUS_MARSHALL_OVERFLOW</p>
+ </td>
+ <td>
+ <p>The user/kernel marshaling buffer has overflowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000232<br />STATUS_INVALID_VARIANT</p>
+ </td>
+ <td>
+ <p>The supplied variant structure contains invalid data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000233<br />STATUS_DOMAIN_CONTROLLER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>A domain controller for this domain was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000234<br />STATUS_ACCOUNT_LOCKED_OUT</p>
+ </td>
+ <td>
+ <p>The user account has been automatically locked because too many invalid logon attempts or password change attempts have been requested.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000235<br />STATUS_HANDLE_NOT_CLOSABLE</p>
+ </td>
+ <td>
+ <p>NtClose was called on a handle that was protected from close via NtSetInformationObject.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000236<br />STATUS_CONNECTION_REFUSED</p>
+ </td>
+ <td>
+ <p>The transport-connection attempt was refused by the remote system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000237<br />STATUS_GRACEFUL_DISCONNECT</p>
+ </td>
+ <td>
+ <p>The transport connection was gracefully closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000238<br />STATUS_ADDRESS_ALREADY_ASSOCIATED</p>
+ </td>
+ <td>
+ <p>The transport endpoint already has an address associated with it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000239<br />STATUS_ADDRESS_NOT_ASSOCIATED</p>
+ </td>
+ <td>
+ <p>An address has not yet been associated with the transport endpoint.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000023A<br />STATUS_CONNECTION_INVALID</p>
+ </td>
+ <td>
+ <p>An operation was attempted on a nonexistent transport connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000023B<br />STATUS_CONNECTION_ACTIVE</p>
+ </td>
+ <td>
+ <p>An invalid operation was attempted on an active transport connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000023C<br />STATUS_NETWORK_UNREACHABLE</p>
+ </td>
+ <td>
+ <p>The remote network is not reachable by the transport.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000023D<br />STATUS_HOST_UNREACHABLE</p>
+ </td>
+ <td>
+ <p>The remote system is not reachable by the transport.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000023E<br />STATUS_PROTOCOL_UNREACHABLE</p>
+ </td>
+ <td>
+ <p>The remote system does not support the transport protocol.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000023F<br />STATUS_PORT_UNREACHABLE</p>
+ </td>
+ <td>
+ <p>No service is operating at the destination port of the transport on the remote system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000240<br />STATUS_REQUEST_ABORTED</p>
+ </td>
+ <td>
+ <p>The request was aborted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000241<br />STATUS_CONNECTION_ABORTED</p>
+ </td>
+ <td>
+ <p>The transport connection was aborted by the local system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000242<br />STATUS_BAD_COMPRESSION_BUFFER</p>
+ </td>
+ <td>
+ <p>The specified buffer contains ill-formed data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000243<br />STATUS_USER_MAPPED_FILE</p>
+ </td>
+ <td>
+ <p>The requested operation cannot be performed on a file with a user mapped section open.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000244<br />STATUS_AUDIT_FAILED</p>
+ </td>
+ <td>
+ <p>{Audit Failed} An attempt to generate a security audit failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000245<br />STATUS_TIMER_RESOLUTION_NOT_SET</p>
+ </td>
+ <td>
+ <p>The timer resolution was not previously set by the current process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000246<br />STATUS_CONNECTION_COUNT_LIMIT</p>
+ </td>
+ <td>
+ <p>A connection to the server could not be made because the limit on the number of concurrent connections for this account has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000247<br />STATUS_LOGIN_TIME_RESTRICTION</p>
+ </td>
+ <td>
+ <p>Attempting to log on during an unauthorized time of day for this account.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000248<br />STATUS_LOGIN_WKSTA_RESTRICTION</p>
+ </td>
+ <td>
+ <p>The account is not authorized to log on from this station.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000249<br />STATUS_IMAGE_MP_UP_MISMATCH</p>
+ </td>
+ <td>
+ <p>{UP/MP Image Mismatch} The image %hs has been modified for use on a uniprocessor system, but you are running it on a multiprocessor machine. Reinstall the image file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000250<br />STATUS_INSUFFICIENT_LOGON_INFO</p>
+ </td>
+ <td>
+ <p>There is insufficient account information to log you on.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000251<br />STATUS_BAD_DLL_ENTRYPOINT</p>
+ </td>
+ <td>
+ <p>{Invalid DLL Entrypoint} The dynamic link library %hs is not written correctly. The stack pointer has been left in an inconsistent state. The entry point should be declared as WINAPI or STDCALL. Select YES to fail the DLL load. Select NO to continue execution. Selecting NO may cause the application to operate incorrectly.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000252<br />STATUS_BAD_SERVICE_ENTRYPOINT</p>
+ </td>
+ <td>
+ <p>{Invalid Service Callback Entrypoint} The %hs service is not written correctly. The stack pointer has been left in an inconsistent state. The callback entry point should be declared as WINAPI or STDCALL. Selecting OK will cause the service to continue operation. However, the service process may operate incorrectly.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000253<br />STATUS_LPC_REPLY_LOST</p>
+ </td>
+ <td>
+ <p>The server received the messages but did not send a reply.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000254<br />STATUS_IP_ADDRESS_CONFLICT1</p>
+ </td>
+ <td>
+ <p>There is an IP address conflict with another system on the network.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000255<br />STATUS_IP_ADDRESS_CONFLICT2</p>
+ </td>
+ <td>
+ <p>There is an IP address conflict with another system on the network.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000256<br />STATUS_REGISTRY_QUOTA_LIMIT</p>
+ </td>
+ <td>
+ <p>{Low On Registry Space} The system has reached the maximum size that is allowed for the system part of the registry. Additional storage requests will be ignored.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000257<br />STATUS_PATH_NOT_COVERED</p>
+ </td>
+ <td>
+ <p>The contacted server does not support the indicated part of the DFS namespace.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000258<br />STATUS_NO_CALLBACK_ACTIVE</p>
+ </td>
+ <td>
+ <p>A callback return system service cannot be executed when no callback is active.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000259<br />STATUS_LICENSE_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The service being accessed is licensed for a particular number of connections. No more connections can be made to the service at this time because the service has already accepted the maximum number of connections.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000025A<br />STATUS_PWD_TOO_SHORT</p>
+ </td>
+ <td>
+ <p>The password provided is too short to meet the policy of your user account. Choose a longer password.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000025B<br />STATUS_PWD_TOO_RECENT</p>
+ </td>
+ <td>
+ <p>The policy of your user account does not allow you to change passwords too frequently. This is done to prevent users from changing back to a familiar, but potentially discovered, password. If you feel your password has been compromised, contact your administrator immediately to have a new one assigned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000025C<br />STATUS_PWD_HISTORY_CONFLICT</p>
+ </td>
+ <td>
+ <p>You have attempted to change your password to one that you have used in the past. The policy of your user account does not allow this. Select a password that you have not previously used.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000025E<br />STATUS_PLUGPLAY_NO_DEVICE</p>
+ </td>
+ <td>
+ <p>You have attempted to load a legacy device driver while its device instance had been disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000025F<br />STATUS_UNSUPPORTED_COMPRESSION</p>
+ </td>
+ <td>
+ <p>The specified compression format is unsupported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000260<br />STATUS_INVALID_HW_PROFILE</p>
+ </td>
+ <td>
+ <p>The specified hardware profile configuration is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000261<br />STATUS_INVALID_PLUGPLAY_DEVICE_PATH</p>
+ </td>
+ <td>
+ <p>The specified Plug and Play registry device path is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000262<br />STATUS_DRIVER_ORDINAL_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Driver Entry Point Not Found} The %hs device driver could not locate the ordinal %ld in driver %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000263<br />STATUS_DRIVER_ENTRYPOINT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>{Driver Entry Point Not Found} The %hs device driver could not locate the entry point %hs in driver %hs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000264<br />STATUS_RESOURCE_NOT_OWNED</p>
+ </td>
+ <td>
+ <p>{Application Error} The application attempted to release a resource it did not own. Click OK to terminate the application.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000265<br />STATUS_TOO_MANY_LINKS</p>
+ </td>
+ <td>
+ <p>An attempt was made to create more links on a file than the file system supports.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000266<br />STATUS_QUOTA_LIST_INCONSISTENT</p>
+ </td>
+ <td>
+ <p>The specified quota list is internally inconsistent with its descriptor.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000267<br />STATUS_FILE_IS_OFFLINE</p>
+ </td>
+ <td>
+ <p>The specified file has been relocated to offline storage.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000268<br />STATUS_EVALUATION_EXPIRATION</p>
+ </td>
+ <td>
+ <p>{Windows Evaluation Notification} The evaluation period for this installation of Windows has expired. This system will shutdown in 1 hour. To restore access to this installation of Windows, upgrade this installation by using a licensed distribution of this product.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000269<br />STATUS_ILLEGAL_DLL_RELOCATION</p>
+ </td>
+ <td>
+ <p>{Illegal System DLL Relocation} The system DLL %hs was relocated in memory. The application will not run properly. The relocation occurred because the DLL %hs occupied an address range that is reserved for Windows system DLLs. The vendor supplying the DLL should be contacted for a new DLL.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000026A<br />STATUS_LICENSE_VIOLATION</p>
+ </td>
+ <td>
+ <p>{License Violation} The system has detected tampering with your registered product type. This is a violation of your software license. Tampering with the product type is not permitted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000026B<br />STATUS_DLL_INIT_FAILED_LOGOFF</p>
+ </td>
+ <td>
+ <p>{DLL Initialization Failed} The application failed to initialize because the window station is shutting down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000026C<br />STATUS_DRIVER_UNABLE_TO_LOAD</p>
+ </td>
+ <td>
+ <p>{Unable to Load Device Driver} %hs device driver could not be loaded. Error Status was 0x%x.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000026D<br />STATUS_DFS_UNAVAILABLE</p>
+ </td>
+ <td>
+ <p>DFS is unavailable on the contacted server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000026E<br />STATUS_VOLUME_DISMOUNTED</p>
+ </td>
+ <td>
+ <p>An operation was attempted to a volume after it was dismounted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000026F<br />STATUS_WX86_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An internal error occurred in the Win32 x86 emulation subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000270<br />STATUS_WX86_FLOAT_STACK_CHECK</p>
+ </td>
+ <td>
+ <p>Win32 x86 emulation subsystem floating-point stack check.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000271<br />STATUS_VALIDATE_CONTINUE</p>
+ </td>
+ <td>
+ <p>The validation process needs to continue on to the next step.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000272<br />STATUS_NO_MATCH</p>
+ </td>
+ <td>
+ <p>There was no match for the specified key in the index.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000273<br />STATUS_NO_MORE_MATCHES</p>
+ </td>
+ <td>
+ <p>There are no more matches for the current index enumeration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000275<br />STATUS_NOT_A_REPARSE_POINT</p>
+ </td>
+ <td>
+ <p>The NTFS file or directory is not a reparse point.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000276<br />STATUS_IO_REPARSE_TAG_INVALID</p>
+ </td>
+ <td>
+ <p>The Windows I/O reparse tag passed for the NTFS reparse point is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000277<br />STATUS_IO_REPARSE_TAG_MISMATCH</p>
+ </td>
+ <td>
+ <p>The Windows I/O reparse tag does not match the one that is in the NTFS reparse point.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000278<br />STATUS_IO_REPARSE_DATA_INVALID</p>
+ </td>
+ <td>
+ <p>The user data passed for the NTFS reparse point is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000279<br />STATUS_IO_REPARSE_TAG_NOT_HANDLED</p>
+ </td>
+ <td>
+ <p>The layered file system driver for this I/O tag did not handle it when needed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000280<br />STATUS_REPARSE_POINT_NOT_RESOLVED</p>
+ </td>
+ <td>
+ <p>The NTFS symbolic link could not be resolved even though the initial file name is valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000281<br />STATUS_DIRECTORY_IS_A_REPARSE_POINT</p>
+ </td>
+ <td>
+ <p>The NTFS directory is a reparse point.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000282<br />STATUS_RANGE_LIST_CONFLICT</p>
+ </td>
+ <td>
+ <p>The range could not be added to the range list because of a conflict.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000283<br />STATUS_SOURCE_ELEMENT_EMPTY</p>
+ </td>
+ <td>
+ <p>The specified medium changer source element contains no media.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000284<br />STATUS_DESTINATION_ELEMENT_FULL</p>
+ </td>
+ <td>
+ <p>The specified medium changer destination element already contains media.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000285<br />STATUS_ILLEGAL_ELEMENT_ADDRESS</p>
+ </td>
+ <td>
+ <p>The specified medium changer element does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000286<br />STATUS_MAGAZINE_NOT_PRESENT</p>
+ </td>
+ <td>
+ <p>The specified element is contained in a magazine that is no longer present.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000287<br />STATUS_REINITIALIZATION_NEEDED</p>
+ </td>
+ <td>
+ <p>The device requires re-initialization due to hardware errors.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000028A<br />STATUS_ENCRYPTION_FAILED</p>
+ </td>
+ <td>
+ <p>The file encryption attempt failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000028B<br />STATUS_DECRYPTION_FAILED</p>
+ </td>
+ <td>
+ <p>The file decryption attempt failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000028C<br />STATUS_RANGE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified range could not be found in the range list.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000028D<br />STATUS_NO_RECOVERY_POLICY</p>
+ </td>
+ <td>
+ <p>There is no encryption recovery policy configured for this system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000028E<br />STATUS_NO_EFS</p>
+ </td>
+ <td>
+ <p>The required encryption driver is not loaded for this system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000028F<br />STATUS_WRONG_EFS</p>
+ </td>
+ <td>
+ <p>The file was encrypted with a different encryption driver than is currently loaded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000290<br />STATUS_NO_USER_KEYS</p>
+ </td>
+ <td>
+ <p>There are no EFS keys defined for the user.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000291<br />STATUS_FILE_NOT_ENCRYPTED</p>
+ </td>
+ <td>
+ <p>The specified file is not encrypted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000292<br />STATUS_NOT_EXPORT_FORMAT</p>
+ </td>
+ <td>
+ <p>The specified file is not in the defined EFS export format.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000293<br />STATUS_FILE_ENCRYPTED</p>
+ </td>
+ <td>
+ <p>The specified file is encrypted and the user does not have the ability to decrypt it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000295<br />STATUS_WMI_GUID_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The GUID passed was not recognized as valid by a WMI data provider.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000296<br />STATUS_WMI_INSTANCE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The instance name passed was not recognized as valid by a WMI data provider.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000297<br />STATUS_WMI_ITEMID_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The data item ID passed was not recognized as valid by a WMI data provider.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000298<br />STATUS_WMI_TRY_AGAIN</p>
+ </td>
+ <td>
+ <p>The WMI request could not be completed and should be retried.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000299<br />STATUS_SHARED_POLICY</p>
+ </td>
+ <td>
+ <p>The policy object is shared and can only be modified at the root.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000029A<br />STATUS_POLICY_OBJECT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The policy object does not exist when it should.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000029B<br />STATUS_POLICY_ONLY_IN_DS</p>
+ </td>
+ <td>
+ <p>The requested policy information only lives in the Ds.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000029C<br />STATUS_VOLUME_NOT_UPGRADED</p>
+ </td>
+ <td>
+ <p>The volume must be upgraded to enable this feature.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000029D<br />STATUS_REMOTE_STORAGE_NOT_ACTIVE</p>
+ </td>
+ <td>
+ <p>The remote storage service is not operational at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000029E<br />STATUS_REMOTE_STORAGE_MEDIA_ERROR</p>
+ </td>
+ <td>
+ <p>The remote storage service encountered a media error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000029F<br />STATUS_NO_TRACKING_SERVICE</p>
+ </td>
+ <td>
+ <p>The tracking (workstation) service is not running.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A0<br />STATUS_SERVER_SID_MISMATCH</p>
+ </td>
+ <td>
+ <p>The server process is running under a SID that is different from the SID that is required by client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A1<br />STATUS_DS_NO_ATTRIBUTE_OR_VALUE</p>
+ </td>
+ <td>
+ <p>The specified directory service attribute or value does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A2<br />STATUS_DS_INVALID_ATTRIBUTE_SYNTAX</p>
+ </td>
+ <td>
+ <p>The attribute syntax specified to the directory service is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A3<br />STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED</p>
+ </td>
+ <td>
+ <p>The attribute type specified to the directory service is not defined.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A4<br />STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS</p>
+ </td>
+ <td>
+ <p>The specified directory service attribute or value already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A5<br />STATUS_DS_BUSY</p>
+ </td>
+ <td>
+ <p>The directory service is busy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A6<br />STATUS_DS_UNAVAILABLE</p>
+ </td>
+ <td>
+ <p>The directory service is unavailable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A7<br />STATUS_DS_NO_RIDS_ALLOCATED</p>
+ </td>
+ <td>
+ <p>The directory service was unable to allocate a relative identifier.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A8<br />STATUS_DS_NO_MORE_RIDS</p>
+ </td>
+ <td>
+ <p>The directory service has exhausted the pool of relative identifiers.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002A9<br />STATUS_DS_INCORRECT_ROLE_OWNER</p>
+ </td>
+ <td>
+ <p>The requested operation could not be performed because the directory service is not the master for that type of operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002AA<br />STATUS_DS_RIDMGR_INIT_ERROR</p>
+ </td>
+ <td>
+ <p>The directory service was unable to initialize the subsystem that allocates relative identifiers.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002AB<br />STATUS_DS_OBJ_CLASS_VIOLATION</p>
+ </td>
+ <td>
+ <p>The requested operation did not satisfy one or more constraints that are associated with the class of the object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002AC<br />STATUS_DS_CANT_ON_NON_LEAF</p>
+ </td>
+ <td>
+ <p>The directory service can perform the requested operation only on a leaf object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002AD<br />STATUS_DS_CANT_ON_RDN</p>
+ </td>
+ <td>
+ <p>The directory service cannot perform the requested operation on the Relatively Defined Name (RDN) attribute of an object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002AE<br />STATUS_DS_CANT_MOD_OBJ_CLASS</p>
+ </td>
+ <td>
+ <p>The directory service detected an attempt to modify the object class of an object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002AF<br />STATUS_DS_CROSS_DOM_MOVE_FAILED</p>
+ </td>
+ <td>
+ <p>An error occurred while performing a cross domain move operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B0<br />STATUS_DS_GC_NOT_AVAILABLE</p>
+ </td>
+ <td>
+ <p>Unable to contact the global catalog server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B1<br />STATUS_DIRECTORY_SERVICE_REQUIRED</p>
+ </td>
+ <td>
+ <p>The requested operation requires a directory service, and none was available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B2<br />STATUS_REPARSE_ATTRIBUTE_CONFLICT</p>
+ </td>
+ <td>
+ <p>The reparse attribute cannot be set because it is incompatible with an existing attribute.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B3<br />STATUS_CANT_ENABLE_DENY_ONLY</p>
+ </td>
+ <td>
+ <p>A group marked "use for deny only" cannot be enabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B4<br />STATUS_FLOAT_MULTIPLE_FAULTS</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Multiple floating-point faults.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B5<br />STATUS_FLOAT_MULTIPLE_TRAPS</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Multiple floating-point traps.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B6<br />STATUS_DEVICE_REMOVED</p>
+ </td>
+ <td>
+ <p>The device has been removed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B7<br />STATUS_JOURNAL_DELETE_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The volume change journal is being deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B8<br />STATUS_JOURNAL_NOT_ACTIVE</p>
+ </td>
+ <td>
+ <p>The volume change journal is not active.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002B9<br />STATUS_NOINTERFACE</p>
+ </td>
+ <td>
+ <p>The requested interface is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C1<br />STATUS_DS_ADMIN_LIMIT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>A directory service resource limit has been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C2<br />STATUS_DRIVER_FAILED_SLEEP</p>
+ </td>
+ <td>
+ <p>{System Standby Failed} The driver %hs does not support standby mode. Updating this driver may allow the system to go to standby mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C3<br />STATUS_MUTUAL_AUTHENTICATION_FAILED</p>
+ </td>
+ <td>
+ <p>Mutual Authentication failed. The server password is out of date at the domain controller.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C4<br />STATUS_CORRUPT_SYSTEM_FILE</p>
+ </td>
+ <td>
+ <p>The system file %1 has become corrupt and has been replaced.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C5<br />STATUS_DATATYPE_MISALIGNMENT_ERROR</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Alignment Error A data type misalignment error was detected in a load or store instruction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C6<br />STATUS_WMI_READ_ONLY</p>
+ </td>
+ <td>
+ <p>The WMI data item or data block is read-only.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C7<br />STATUS_WMI_SET_FAILURE</p>
+ </td>
+ <td>
+ <p>The WMI data item or data block could not be changed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C8<br />STATUS_COMMITMENT_MINIMUM</p>
+ </td>
+ <td>
+ <p>{Virtual Memory Minimum Too Low} Your system is low on virtual memory. Windows is increasing the size of your virtual memory paging file. During this process, memory requests for some applications may be denied. For more information, see Help.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002C9<br />STATUS_REG_NAT_CONSUMPTION</p>
+ </td>
+ <td>
+ <p>{EXCEPTION} Register NaT consumption faults. A NaT value is consumed on a non-speculative instruction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002CA<br />STATUS_TRANSPORT_FULL</p>
+ </td>
+ <td>
+ <p>The transport element of the medium changer contains media, which is causing the operation to fail.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002CB<br />STATUS_DS_SAM_INIT_FAILURE</p>
+ </td>
+ <td>
+ <p>Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Directory Services Restore Mode. Check the event log for more detailed information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002CC<br />STATUS_ONLY_IF_CONNECTED</p>
+ </td>
+ <td>
+ <p>This operation is supported only when you are connected to the server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002CD<br />STATUS_DS_SENSITIVE_GROUP_VIOLATION</p>
+ </td>
+ <td>
+ <p>Only an administrator can modify the membership list of an administrative group.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002CE<br />STATUS_PNP_RESTART_ENUMERATION</p>
+ </td>
+ <td>
+ <p>A device was removed so enumeration must be restarted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002CF<br />STATUS_JOURNAL_ENTRY_DELETED</p>
+ </td>
+ <td>
+ <p>The journal entry has been deleted from the journal.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D0<br />STATUS_DS_CANT_MOD_PRIMARYGROUPID</p>
+ </td>
+ <td>
+ <p>Cannot change the primary group ID of a domain controller account.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D1<br />STATUS_SYSTEM_IMAGE_BAD_SIGNATURE</p>
+ </td>
+ <td>
+ <p>{Fatal System Error} The system image %s is not properly signed. The file has been replaced with the signed file. The system has been shut down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D2<br />STATUS_PNP_REBOOT_REQUIRED</p>
+ </td>
+ <td>
+ <p>The device will not start without a reboot.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D3<br />STATUS_POWER_STATE_INVALID</p>
+ </td>
+ <td>
+ <p>The power state of the current device cannot support this request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D4<br />STATUS_DS_INVALID_GROUP_TYPE</p>
+ </td>
+ <td>
+ <p>The specified group type is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D5<br />STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN</p>
+ </td>
+ <td>
+ <p>In a mixed domain, no nesting of a global group if the group is security enabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D6<br />STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN</p>
+ </td>
+ <td>
+ <p>In a mixed domain, cannot nest local groups with other local groups, if the group is security enabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D7<br />STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER</p>
+ </td>
+ <td>
+ <p>A global group cannot have a local group as a member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D8<br />STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER</p>
+ </td>
+ <td>
+ <p>A global group cannot have a universal group as a member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002D9<br />STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER</p>
+ </td>
+ <td>
+ <p>A universal group cannot have a local group as a member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002DA<br />STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER</p>
+ </td>
+ <td>
+ <p>A global group cannot have a cross-domain member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002DB<br />STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER</p>
+ </td>
+ <td>
+ <p>A local group cannot have another cross-domain local group as a member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002DC<br />STATUS_DS_HAVE_PRIMARY_MEMBERS</p>
+ </td>
+ <td>
+ <p>Cannot change to a security-disabled group because primary members are in this group.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002DD<br />STATUS_WMI_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The WMI operation is not supported by the data block or method.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002DE<br />STATUS_INSUFFICIENT_POWER</p>
+ </td>
+ <td>
+ <p>There is not enough power to complete the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002DF<br />STATUS_SAM_NEED_BOOTKEY_PASSWORD</p>
+ </td>
+ <td>
+ <p>The Security Accounts Manager needs to get the boot password.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E0<br />STATUS_SAM_NEED_BOOTKEY_FLOPPY</p>
+ </td>
+ <td>
+ <p>The Security Accounts Manager needs to get the boot key from the floppy disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E1<br />STATUS_DS_CANT_START</p>
+ </td>
+ <td>
+ <p>The directory service cannot start.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E2<br />STATUS_DS_INIT_FAILURE</p>
+ </td>
+ <td>
+ <p>The directory service could not start because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Directory Services Restore Mode. Check the event log for more detailed information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E3<br />STATUS_SAM_INIT_FAILURE</p>
+ </td>
+ <td>
+ <p>The Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down this system and restart in Safe Mode. Check the event log for more detailed information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E4<br />STATUS_DS_GC_REQUIRED</p>
+ </td>
+ <td>
+ <p>The requested operation can be performed only on a global catalog server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E5<br />STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY</p>
+ </td>
+ <td>
+ <p>A local group can only be a member of other local groups in the same domain.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E6<br />STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS</p>
+ </td>
+ <td>
+ <p>Foreign security principals cannot be members of universal groups.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E7<br />STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002E9<br />STATUS_CURRENT_DOMAIN_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>This operation cannot be performed on the current domain.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002EA<br />STATUS_CANNOT_MAKE</p>
+ </td>
+ <td>
+ <p>The directory or file cannot be created.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002EB<br />STATUS_SYSTEM_SHUTDOWN</p>
+ </td>
+ <td>
+ <p>The system is in the process of shutting down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002EC<br />STATUS_DS_INIT_FAILURE_CONSOLE</p>
+ </td>
+ <td>
+ <p>Directory Services could not start because of the following error: %hs Error Status: 0x%x. Click OK to shut down the system. You can use the recovery console to diagnose the system further.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002ED<br />STATUS_DS_SAM_INIT_FAILURE_CONSOLE</p>
+ </td>
+ <td>
+ <p>Security Accounts Manager initialization failed because of the following error: %hs Error Status: 0x%x. Click OK to shut down the system. You can use the recovery console to diagnose the system further.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002EE<br />STATUS_UNFINISHED_CONTEXT_DELETED</p>
+ </td>
+ <td>
+ <p>A security context was deleted before the context was completed. This is considered a logon failure.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002EF<br />STATUS_NO_TGT_REPLY</p>
+ </td>
+ <td>
+ <p>The client is trying to negotiate a context and the server requires user-to-user but did not send a TGT reply.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F0<br />STATUS_OBJECTID_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>An object ID was not found in the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F1<br />STATUS_NO_IP_ADDRESSES</p>
+ </td>
+ <td>
+ <p>Unable to accomplish the requested task because the local machine does not have any IP addresses.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F2<br />STATUS_WRONG_CREDENTIAL_HANDLE</p>
+ </td>
+ <td>
+ <p>The supplied credential handle does not match the credential that is associated with the security context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F3<br />STATUS_CRYPTO_SYSTEM_INVALID</p>
+ </td>
+ <td>
+ <p>The crypto system or checksum function is invalid because a required function is unavailable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F4<br />STATUS_MAX_REFERRALS_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The number of maximum ticket referrals has been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F5<br />STATUS_MUST_BE_KDC</p>
+ </td>
+ <td>
+ <p>The local machine must be a Kerberos KDC (domain controller) and it is not.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F6<br />STATUS_STRONG_CRYPTO_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The other end of the security negotiation requires strong crypto but it is not supported on the local machine.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F7<br />STATUS_TOO_MANY_PRINCIPALS</p>
+ </td>
+ <td>
+ <p>The KDC reply contained more than one principal name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F8<br />STATUS_NO_PA_DATA</p>
+ </td>
+ <td>
+ <p>Expected to find PA data for a hint of what etype to use, but it was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002F9<br />STATUS_PKINIT_NAME_MISMATCH</p>
+ </td>
+ <td>
+ <p>The client certificate does not contain a valid UPN, or does not match the client name in the logon request. Contact your administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002FA<br />STATUS_SMARTCARD_LOGON_REQUIRED</p>
+ </td>
+ <td>
+ <p>Smart card logon is required and was not used.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002FB<br />STATUS_KDC_INVALID_REQUEST</p>
+ </td>
+ <td>
+ <p>An invalid request was sent to the KDC.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002FC<br />STATUS_KDC_UNABLE_TO_REFER</p>
+ </td>
+ <td>
+ <p>The KDC was unable to generate a referral for the service requested.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002FD<br />STATUS_KDC_UNKNOWN_ETYPE</p>
+ </td>
+ <td>
+ <p>The encryption type requested is not supported by the KDC.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002FE<br />STATUS_SHUTDOWN_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>A system shutdown is in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00002FF<br />STATUS_SERVER_SHUTDOWN_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The server machine is shutting down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000300<br />STATUS_NOT_SUPPORTED_ON_SBS</p>
+ </td>
+ <td>
+ <p>This operation is not supported on a computer running Windows Server 2003 for Small Business Server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000301<br />STATUS_WMI_GUID_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>The WMI GUID is no longer available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000302<br />STATUS_WMI_ALREADY_DISABLED</p>
+ </td>
+ <td>
+ <p>Collection or events for the WMI GUID is already disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000303<br />STATUS_WMI_ALREADY_ENABLED</p>
+ </td>
+ <td>
+ <p>Collection or events for the WMI GUID is already enabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000304<br />STATUS_MFT_TOO_FRAGMENTED</p>
+ </td>
+ <td>
+ <p>The master file table on the volume is too fragmented to complete this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000305<br />STATUS_COPY_PROTECTION_FAILURE</p>
+ </td>
+ <td>
+ <p>Copy protection failure.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000306<br />STATUS_CSS_AUTHENTICATION_FAILURE</p>
+ </td>
+ <td>
+ <p>Copy protection error—DVD CSS Authentication failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000307<br />STATUS_CSS_KEY_NOT_PRESENT</p>
+ </td>
+ <td>
+ <p>Copy protection error—The specified sector does not contain a valid key.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000308<br />STATUS_CSS_KEY_NOT_ESTABLISHED</p>
+ </td>
+ <td>
+ <p>Copy protection error—DVD session key not established.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000309<br />STATUS_CSS_SCRAMBLED_SECTOR</p>
+ </td>
+ <td>
+ <p>Copy protection error—The read failed because the sector is encrypted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000030A<br />STATUS_CSS_REGION_MISMATCH</p>
+ </td>
+ <td>
+ <p>Copy protection error—The region of the specified DVD does not correspond to the region setting of the drive.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000030B<br />STATUS_CSS_RESETS_EXHAUSTED</p>
+ </td>
+ <td>
+ <p>Copy protection error—The region setting of the drive may be permanent.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000320<br />STATUS_PKINIT_FAILURE</p>
+ </td>
+ <td>
+ <p>The Kerberos protocol encountered an error while validating the KDC certificate during smart card logon. There is more information in the system event log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000321<br />STATUS_SMARTCARD_SUBSYSTEM_FAILURE</p>
+ </td>
+ <td>
+ <p>The Kerberos protocol encountered an error while attempting to use the smart card subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000322<br />STATUS_NO_KERB_KEY</p>
+ </td>
+ <td>
+ <p>The target server does not have acceptable Kerberos credentials.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000350<br />STATUS_HOST_DOWN</p>
+ </td>
+ <td>
+ <p>The transport determined that the remote system is down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000351<br />STATUS_UNSUPPORTED_PREAUTH</p>
+ </td>
+ <td>
+ <p>An unsupported pre-authentication mechanism was presented to the Kerberos package.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000352<br />STATUS_EFS_ALG_BLOB_TOO_BIG</p>
+ </td>
+ <td>
+ <p>The encryption algorithm that is used on the source file needs a bigger key buffer than the one that is used on the destination file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000353<br />STATUS_PORT_NOT_SET</p>
+ </td>
+ <td>
+ <p>An attempt to remove a processes DebugPort was made, but a port was not already associated with the process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000354<br />STATUS_DEBUGGER_INACTIVE</p>
+ </td>
+ <td>
+ <p>An attempt to do an operation on a debug port failed because the port is in the process of being deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000355<br />STATUS_DS_VERSION_CHECK_FAILURE</p>
+ </td>
+ <td>
+ <p>This version of Windows is not compatible with the behavior version of the directory forest, domain, or domain controller.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000356<br />STATUS_AUDITING_DISABLED</p>
+ </td>
+ <td>
+ <p>The specified event is currently not being audited.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000357<br />STATUS_PRENT4_MACHINE_ACCOUNT</p>
+ </td>
+ <td>
+ <p>The machine account was created prior to Windows NT 4.0. The account needs to be recreated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000358<br />STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER</p>
+ </td>
+ <td>
+ <p>An account group cannot have a universal group as a member.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000359<br />STATUS_INVALID_IMAGE_WIN_32</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format; it appears to be a 32-bit Windows image.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000035A<br />STATUS_INVALID_IMAGE_WIN_64</p>
+ </td>
+ <td>
+ <p>The specified image file did not have the correct format; it appears to be a 64-bit Windows image.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000035B<br />STATUS_BAD_BINDINGS</p>
+ </td>
+ <td>
+ <p>The client's supplied SSPI channel bindings were incorrect.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000035C<br />STATUS_NETWORK_SESSION_EXPIRED</p>
+ </td>
+ <td>
+ <p>The client session has expired; so the client must re-authenticate to continue accessing the remote resources.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000035D<br />STATUS_APPHELP_BLOCK</p>
+ </td>
+ <td>
+ <p>The AppHelp dialog box canceled; thus preventing the application from starting.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000035E<br />STATUS_ALL_SIDS_FILTERED</p>
+ </td>
+ <td>
+ <p>The SID filtering operation removed all SIDs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000035F<br />STATUS_NOT_SAFE_MODE_DRIVER</p>
+ </td>
+ <td>
+ <p>The driver was not loaded because the system is starting in safe mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000361<br />STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT</p>
+ </td>
+ <td>
+ <p>Access to %1 has been restricted by your Administrator by the default software restriction policy level.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000362<br />STATUS_ACCESS_DISABLED_BY_POLICY_PATH</p>
+ </td>
+ <td>
+ <p>Access to %1 has been restricted by your Administrator by location with policy rule %2 placed on path %3.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000363<br />STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER</p>
+ </td>
+ <td>
+ <p>Access to %1 has been restricted by your Administrator by software publisher policy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000364<br />STATUS_ACCESS_DISABLED_BY_POLICY_OTHER</p>
+ </td>
+ <td>
+ <p>Access to %1 has been restricted by your Administrator by policy rule %2.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000365<br />STATUS_FAILED_DRIVER_ENTRY</p>
+ </td>
+ <td>
+ <p>The driver was not loaded because it failed its initialization call.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000366<br />STATUS_DEVICE_ENUMERATION_ERROR</p>
+ </td>
+ <td>
+ <p>The device encountered an error while applying power or reading the device configuration. This may be caused by a failure of your hardware or by a poor connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000368<br />STATUS_MOUNT_POINT_NOT_RESOLVED</p>
+ </td>
+ <td>
+ <p>The create operation failed because the name contained at least one mount point that resolves to a volume to which the specified device object is not attached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000369<br />STATUS_INVALID_DEVICE_OBJECT_PARAMETER</p>
+ </td>
+ <td>
+ <p>The device object parameter is either not a valid device object or is not attached to the volume that is specified by the file name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000036A<br />STATUS_MCA_OCCURED</p>
+ </td>
+ <td>
+ <p>A machine check error has occurred. Check the system event log for additional information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000036B<br />STATUS_DRIVER_BLOCKED_CRITICAL</p>
+ </td>
+ <td>
+ <p>Driver %2 has been blocked from loading.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000036C<br />STATUS_DRIVER_BLOCKED</p>
+ </td>
+ <td>
+ <p>Driver %2 has been blocked from loading.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000036D<br />STATUS_DRIVER_DATABASE_ERROR</p>
+ </td>
+ <td>
+ <p>There was error [%2] processing the driver database.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000036E<br />STATUS_SYSTEM_HIVE_TOO_LARGE</p>
+ </td>
+ <td>
+ <p>System hive size has exceeded its limit.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000036F<br />STATUS_INVALID_IMPORT_OF_NON_DLL</p>
+ </td>
+ <td>
+ <p>A dynamic link library (DLL) referenced a module that was neither a DLL nor the process's executable image.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000371<br />STATUS_NO_SECRETS</p>
+ </td>
+ <td>
+ <p>The local account store does not contain secret material for the specified account.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000372<br />STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY</p>
+ </td>
+ <td>
+ <p>Access to %1 has been restricted by your Administrator by policy rule %2.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000373<br />STATUS_FAILED_STACK_SWITCH</p>
+ </td>
+ <td>
+ <p>The system was not able to allocate enough memory to perform a stack switch.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000374<br />STATUS_HEAP_CORRUPTION</p>
+ </td>
+ <td>
+ <p>A heap has been corrupted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000380<br />STATUS_SMARTCARD_WRONG_PIN</p>
+ </td>
+ <td>
+ <p>An incorrect PIN was presented to the smart card.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000381<br />STATUS_SMARTCARD_CARD_BLOCKED</p>
+ </td>
+ <td>
+ <p>The smart card is blocked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000382<br />STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED</p>
+ </td>
+ <td>
+ <p>No PIN was presented to the smart card.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000383<br />STATUS_SMARTCARD_NO_CARD</p>
+ </td>
+ <td>
+ <p>No smart card is available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000384<br />STATUS_SMARTCARD_NO_KEY_CONTAINER</p>
+ </td>
+ <td>
+ <p>The requested key container does not exist on the smart card.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000385<br />STATUS_SMARTCARD_NO_CERTIFICATE</p>
+ </td>
+ <td>
+ <p>The requested certificate does not exist on the smart card.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000386<br />STATUS_SMARTCARD_NO_KEYSET</p>
+ </td>
+ <td>
+ <p>The requested keyset does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000387<br />STATUS_SMARTCARD_IO_ERROR</p>
+ </td>
+ <td>
+ <p>A communication error with the smart card has been detected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000388<br />STATUS_DOWNGRADE_DETECTED</p>
+ </td>
+ <td>
+ <p>The system detected a possible attempt to compromise security. Ensure that you can contact the server that authenticated you.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000389<br />STATUS_SMARTCARD_CERT_REVOKED</p>
+ </td>
+ <td>
+ <p>The smart card certificate used for authentication has been revoked. Contact your system administrator. There may be additional information in the event log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000038A<br />STATUS_ISSUING_CA_UNTRUSTED</p>
+ </td>
+ <td>
+ <p>An untrusted certificate authority was detected while processing the smart card certificate that is used for authentication. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000038B<br />STATUS_REVOCATION_OFFLINE_C</p>
+ </td>
+ <td>
+ <p>The revocation status of the smart card certificate that is used for authentication could not be determined. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000038C<br />STATUS_PKINIT_CLIENT_FAILURE</p>
+ </td>
+ <td>
+ <p>The smart card certificate used for authentication was not trusted. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000038D<br />STATUS_SMARTCARD_CERT_EXPIRED</p>
+ </td>
+ <td>
+ <p>The smart card certificate used for authentication has expired. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000038E<br />STATUS_DRIVER_FAILED_PRIOR_UNLOAD</p>
+ </td>
+ <td>
+ <p>The driver could not be loaded because a previous version of the driver is still in memory.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000038F<br />STATUS_SMARTCARD_SILENT_CONTEXT</p>
+ </td>
+ <td>
+ <p>The smart card provider could not perform the action because the context was acquired as silent.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000401<br />STATUS_PER_USER_TRUST_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The delegated trust creation quota of the current user has been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000402<br />STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The total delegated trust creation quota has been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000403<br />STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The delegated trust deletion quota of the current user has been exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000404<br />STATUS_DS_NAME_NOT_UNIQUE</p>
+ </td>
+ <td>
+ <p>The requested name already exists as a unique identifier.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000405<br />STATUS_DS_DUPLICATE_ID_FOUND</p>
+ </td>
+ <td>
+ <p>The requested object has a non-unique identifier and cannot be retrieved.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000406<br />STATUS_DS_GROUP_CONVERSION_ERROR</p>
+ </td>
+ <td>
+ <p>The group cannot be converted due to attribute restrictions on the requested group type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000407<br />STATUS_VOLSNAP_PREPARE_HIBERNATE</p>
+ </td>
+ <td>
+ <p>{Volume Shadow Copy Service} Wait while the Volume Shadow Copy Service prepares volume %hs for hibernation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000408<br />STATUS_USER2USER_REQUIRED</p>
+ </td>
+ <td>
+ <p>Kerberos sub-protocol User2User is required.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000409<br />STATUS_STACK_BUFFER_OVERRUN</p>
+ </td>
+ <td>
+ <p>The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000040A<br />STATUS_NO_S4U_PROT_SUPPORT</p>
+ </td>
+ <td>
+ <p>The Kerberos subsystem encountered an error. A service for user protocol request was made against a domain controller which does not support service for user.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000040B<br />STATUS_CROSSREALM_DELEGATION_FAILURE</p>
+ </td>
+ <td>
+ <p>An attempt was made by this server to make a Kerberos constrained delegation request for a target that is outside the server realm. This action is not supported and the resulting error indicates a misconfiguration on the allowed-to-delegate-to list for this server. Contact your administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000040C<br />STATUS_REVOCATION_OFFLINE_KDC</p>
+ </td>
+ <td>
+ <p>The revocation status of the domain controller certificate used for smart card authentication could not be determined. There is additional information in the system event log. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000040D<br />STATUS_ISSUING_CA_UNTRUSTED_KDC</p>
+ </td>
+ <td>
+ <p>An untrusted certificate authority was detected while processing the domain controller certificate used for authentication. There is additional information in the system event log. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000040E<br />STATUS_KDC_CERT_EXPIRED</p>
+ </td>
+ <td>
+ <p>The domain controller certificate used for smart card logon has expired. Contact your system administrator with the contents of your system event log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000040F<br />STATUS_KDC_CERT_REVOKED</p>
+ </td>
+ <td>
+ <p>The domain controller certificate used for smart card logon has been revoked. Contact your system administrator with the contents of your system event log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000410<br />STATUS_PARAMETER_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>Data present in one of the parameters is more than the function can operate on.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000411<br />STATUS_HIBERNATION_FAILURE</p>
+ </td>
+ <td>
+ <p>The system has failed to hibernate (The error code is %hs). Hibernation will be disabled until the system is restarted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000412<br />STATUS_DELAY_LOAD_FAILED</p>
+ </td>
+ <td>
+ <p>An attempt to delay-load a .dll or get a function address in a delay-loaded .dll failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000413<br />STATUS_AUTHENTICATION_FIREWALL_FAILED</p>
+ </td>
+ <td>
+ <p>Logon Failure: The machine you are logging onto is protected by an authentication firewall. The specified account is not allowed to authenticate to the machine.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000414<br />STATUS_VDM_DISALLOWED</p>
+ </td>
+ <td>
+ <p>%hs is a 16-bit application. You do not have permissions to execute 16-bit applications. Check your permissions with your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000415<br />STATUS_HUNG_DISPLAY_DRIVER_THREAD</p>
+ </td>
+ <td>
+ <p>{Display Driver Stopped Responding} The %hs display driver has stopped working normally. Save your work and reboot the system to restore full display functionality. The next time you reboot the machine a dialog will be displayed giving you a chance to report this failure to Microsoft.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000416<br />STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE</p>
+ </td>
+ <td>
+ <p>The Desktop heap encountered an error while allocating session memory. There is more information in the system event log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000417<br />STATUS_INVALID_CRUNTIME_PARAMETER</p>
+ </td>
+ <td>
+ <p>An invalid parameter was passed to a C runtime function.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000418<br />STATUS_NTLM_BLOCKED</p>
+ </td>
+ <td>
+ <p>The authentication failed because NTLM was blocked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000419<br />STATUS_DS_SRC_SID_EXISTS_IN_FOREST</p>
+ </td>
+ <td>
+ <p>The source object's SID already exists in destination forest.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000041A<br />STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST</p>
+ </td>
+ <td>
+ <p>The domain name of the trusted domain already exists in the forest.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000041B<br />STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST</p>
+ </td>
+ <td>
+ <p>The flat name of the trusted domain already exists in the forest.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000041C<br />STATUS_INVALID_USER_PRINCIPAL_NAME</p>
+ </td>
+ <td>
+ <p>The User Principal Name (UPN) is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000420<br />STATUS_ASSERTION_FAILURE</p>
+ </td>
+ <td>
+ <p>There has been an assertion failure.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000421<br />STATUS_VERIFIER_STOP</p>
+ </td>
+ <td>
+ <p>Application verifier has found an error in the current process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000423<br />STATUS_CALLBACK_POP_STACK</p>
+ </td>
+ <td>
+ <p>A user mode unwind is in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000424<br />STATUS_INCOMPATIBLE_DRIVER_BLOCKED</p>
+ </td>
+ <td>
+ <p>%2 has been blocked from loading due to incompatibility with this system. Contact your software vendor for a compatible version of the driver.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000425<br />STATUS_HIVE_UNLOADED</p>
+ </td>
+ <td>
+ <p>Illegal operation attempted on a registry key which has already been unloaded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000426<br />STATUS_COMPRESSION_DISABLED</p>
+ </td>
+ <td>
+ <p>Compression is disabled for this volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000427<br />STATUS_FILE_SYSTEM_LIMITATION</p>
+ </td>
+ <td>
+ <p>The requested operation could not be completed due to a file system limitation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000428<br />STATUS_INVALID_IMAGE_HASH</p>
+ </td>
+ <td>
+ <p>The hash for image %hs cannot be found in the system catalogs. The image is likely corrupt or the victim of tampering.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000429<br />STATUS_NOT_CAPABLE</p>
+ </td>
+ <td>
+ <p>The implementation is not capable of performing the request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000042A<br />STATUS_REQUEST_OUT_OF_SEQUENCE</p>
+ </td>
+ <td>
+ <p>The requested operation is out of order with respect to other operations.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000042B<br />STATUS_IMPLEMENTATION_LIMIT</p>
+ </td>
+ <td>
+ <p>An operation attempted to exceed an implementation-defined limit.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000042C<br />STATUS_ELEVATION_REQUIRED</p>
+ </td>
+ <td>
+ <p>The requested operation requires elevation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000042D<br />STATUS_NO_SECURITY_CONTEXT</p>
+ </td>
+ <td>
+ <p>The required security context does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000042E<br />STATUS_PKU2U_CERT_FAILURE</p>
+ </td>
+ <td>
+ <p>The PKU2U protocol encountered an error while attempting to utilize the associated certificates.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000432<br />STATUS_BEYOND_VDL</p>
+ </td>
+ <td>
+ <p>The operation was attempted beyond the valid data length of the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000433<br />STATUS_ENCOUNTERED_WRITE_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The attempted write operation encountered a write already in progress for some portion of the range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000434<br />STATUS_PTE_CHANGED</p>
+ </td>
+ <td>
+ <p>The page fault mappings changed in the middle of processing a fault so the operation must be retried.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000435<br />STATUS_PURGE_FAILED</p>
+ </td>
+ <td>
+ <p>The attempt to purge this file from memory failed to purge some or all the data from memory.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000440<br />STATUS_CRED_REQUIRES_CONFIRMATION</p>
+ </td>
+ <td>
+ <p>The requested credential requires confirmation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000441<br />STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE</p>
+ </td>
+ <td>
+ <p>The remote server sent an invalid response for a file being opened with Client Side Encryption.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000442<br />STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER</p>
+ </td>
+ <td>
+ <p>Client Side Encryption is not supported by the remote server even though it claims to support it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000443<br />STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE</p>
+ </td>
+ <td>
+ <p>File is encrypted and should be opened in Client Side Encryption mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000444<br />STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE</p>
+ </td>
+ <td>
+ <p>A new encrypted file is being created and a $EFS needs to be provided.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000445<br />STATUS_CS_ENCRYPTION_FILE_NOT_CSE</p>
+ </td>
+ <td>
+ <p>The SMB client requested a CSE FSCTL on a non-CSE file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000446<br />STATUS_INVALID_LABEL</p>
+ </td>
+ <td>
+ <p>Indicates a particular Security ID may not be assigned as the label of an object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000450<br />STATUS_DRIVER_PROCESS_TERMINATED</p>
+ </td>
+ <td>
+ <p>The process hosting the driver for this device has terminated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000451<br />STATUS_AMBIGUOUS_SYSTEM_DEVICE</p>
+ </td>
+ <td>
+ <p>The requested system device cannot be identified due to multiple indistinguishable devices potentially matching the identification criteria.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000452<br />STATUS_SYSTEM_DEVICE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The requested system device cannot be found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000453<br />STATUS_RESTART_BOOT_APPLICATION</p>
+ </td>
+ <td>
+ <p>This boot application must be restarted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000454<br />STATUS_INSUFFICIENT_NVRAM_RESOURCES</p>
+ </td>
+ <td>
+ <p>Insufficient NVRAM resources exist to complete the API. A reboot might be required.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000460<br />STATUS_NO_RANGES_PROCESSED</p>
+ </td>
+ <td>
+ <p>No ranges for the specified operation were able to be processed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000463<br />STATUS_DEVICE_FEATURE_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The storage device does not support Offload Write.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000464<br />STATUS_DEVICE_UNREACHABLE</p>
+ </td>
+ <td>
+ <p>Data cannot be moved because the source device cannot communicate with the destination device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000465<br />STATUS_INVALID_TOKEN</p>
+ </td>
+ <td>
+ <p>The token representing the data is invalid or expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000500<br />STATUS_INVALID_TASK_NAME</p>
+ </td>
+ <td>
+ <p>The specified task name is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000501<br />STATUS_INVALID_TASK_INDEX</p>
+ </td>
+ <td>
+ <p>The specified task index is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000502<br />STATUS_THREAD_ALREADY_IN_TASK</p>
+ </td>
+ <td>
+ <p>The specified thread is already joining a task.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000503<br />STATUS_CALLBACK_BYPASS</p>
+ </td>
+ <td>
+ <p>A callback has requested to bypass native code.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000602<br />STATUS_FAIL_FAST_EXCEPTION</p>
+ </td>
+ <td>
+ <p>A fail fast exception occurred. Exception handlers will not be invoked and the process will be terminated immediately.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000603<br />STATUS_IMAGE_CERT_REVOKED</p>
+ </td>
+ <td>
+ <p>Windows cannot verify the digital signature for this file. The signing certificate for this file has been revoked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000700<br />STATUS_PORT_CLOSED</p>
+ </td>
+ <td>
+ <p>The ALPC port is closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000701<br />STATUS_MESSAGE_LOST</p>
+ </td>
+ <td>
+ <p>The ALPC message requested is no longer available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000702<br />STATUS_INVALID_MESSAGE</p>
+ </td>
+ <td>
+ <p>The ALPC message supplied is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000703<br />STATUS_REQUEST_CANCELED</p>
+ </td>
+ <td>
+ <p>The ALPC message has been canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000704<br />STATUS_RECURSIVE_DISPATCH</p>
+ </td>
+ <td>
+ <p>Invalid recursive dispatch attempt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000705<br />STATUS_LPC_RECEIVE_BUFFER_EXPECTED</p>
+ </td>
+ <td>
+ <p>No receive buffer has been supplied in a synchronous request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000706<br />STATUS_LPC_INVALID_CONNECTION_USAGE</p>
+ </td>
+ <td>
+ <p>The connection port is used in an invalid context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000707<br />STATUS_LPC_REQUESTS_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>The ALPC port does not accept new request messages.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000708<br />STATUS_RESOURCE_IN_USE</p>
+ </td>
+ <td>
+ <p>The resource requested is already in use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000709<br />STATUS_HARDWARE_MEMORY_ERROR</p>
+ </td>
+ <td>
+ <p>The hardware has reported an uncorrectable memory error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000070A<br />STATUS_THREADPOOL_HANDLE_EXCEPTION</p>
+ </td>
+ <td>
+ <p>Status 0x%08x was returned, waiting on handle 0x%x for wait 0x%p, in waiter 0x%p.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000070B<br />STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED</p>
+ </td>
+ <td>
+ <p>After a callback to 0x%p(0x%p), a completion call to Set event(0x%p) failed with status 0x%08x.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000070C<br />STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED</p>
+ </td>
+ <td>
+ <p>After a callback to 0x%p(0x%p), a completion call to ReleaseSemaphore(0x%p, %d) failed with status 0x%08x.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000070D<br />STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED</p>
+ </td>
+ <td>
+ <p>After a callback to 0x%p(0x%p), a completion call to ReleaseMutex(%p) failed with status 0x%08x.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000070E<br />STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED</p>
+ </td>
+ <td>
+ <p>After a callback to 0x%p(0x%p), a completion call to FreeLibrary(%p) failed with status 0x%08x.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000070F<br />STATUS_THREADPOOL_RELEASED_DURING_OPERATION</p>
+ </td>
+ <td>
+ <p>The thread pool 0x%p was released while a thread was posting a callback to 0x%p(0x%p) to it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000710<br />STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING</p>
+ </td>
+ <td>
+ <p>A thread pool worker thread is impersonating a client, after a callback to 0x%p(0x%p). This is unexpected, indicating that the callback is missing a call to revert the impersonation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000711<br />STATUS_APC_RETURNED_WHILE_IMPERSONATING</p>
+ </td>
+ <td>
+ <p>A thread pool worker thread is impersonating a client, after executing an APC. This is unexpected, indicating that the APC is missing a call to revert the impersonation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000712<br />STATUS_PROCESS_IS_PROTECTED</p>
+ </td>
+ <td>
+ <p>Either the target process, or the target thread's containing process, is a protected process.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000713<br />STATUS_MCA_EXCEPTION</p>
+ </td>
+ <td>
+ <p>A thread is getting dispatched with MCA EXCEPTION because of MCA.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000714<br />STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE</p>
+ </td>
+ <td>
+ <p>The client certificate account mapping is not unique.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000715<br />STATUS_SYMLINK_CLASS_DISABLED</p>
+ </td>
+ <td>
+ <p>The symbolic link cannot be followed because its type is disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000716<br />STATUS_INVALID_IDN_NORMALIZATION</p>
+ </td>
+ <td>
+ <p>Indicates that the specified string is not valid for IDN normalization.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000717<br />STATUS_NO_UNICODE_TRANSLATION</p>
+ </td>
+ <td>
+ <p>No mapping for the Unicode character exists in the target multi-byte code page.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000718<br />STATUS_ALREADY_REGISTERED</p>
+ </td>
+ <td>
+ <p>The provided callback is already registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000719<br />STATUS_CONTEXT_MISMATCH</p>
+ </td>
+ <td>
+ <p>The provided context did not match the target.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000071A<br />STATUS_PORT_ALREADY_HAS_COMPLETION_LIST</p>
+ </td>
+ <td>
+ <p>The specified port already has a completion list.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000071B<br />STATUS_CALLBACK_RETURNED_THREAD_PRIORITY</p>
+ </td>
+ <td>
+ <p>A threadpool worker thread entered a callback at thread base priority 0x%x and exited at priority 0x%x.</p>
+ <p>This is unexpected, indicating that the callback missed restoring the priority.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000071C<br />STATUS_INVALID_THREAD</p>
+ </td>
+ <td>
+ <p>An invalid thread, handle %p, is specified for this operation. Possibly, a threadpool worker thread was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000071D<br />STATUS_CALLBACK_RETURNED_TRANSACTION</p>
+ </td>
+ <td>
+ <p>A threadpool worker thread entered a callback, which left transaction state.</p>
+ <p>This is unexpected, indicating that the callback missed clearing the transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000071E<br />STATUS_CALLBACK_RETURNED_LDR_LOCK</p>
+ </td>
+ <td>
+ <p>A threadpool worker thread entered a callback, which left the loader lock held.</p>
+ <p>This is unexpected, indicating that the callback missed releasing the lock.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000071F<br />STATUS_CALLBACK_RETURNED_LANG</p>
+ </td>
+ <td>
+ <p>A threadpool worker thread entered a callback, which left with preferred languages set.</p>
+ <p>This is unexpected, indicating that the callback missed clearing them.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000720<br />STATUS_CALLBACK_RETURNED_PRI_BACK</p>
+ </td>
+ <td>
+ <p>A threadpool worker thread entered a callback, which left with background priorities set.</p>
+ <p>This is unexpected, indicating that the callback missed restoring the original priorities.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000800<br />STATUS_DISK_REPAIR_DISABLED</p>
+ </td>
+ <td>
+ <p>The attempted operation required self healing to be enabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000801<br />STATUS_DS_DOMAIN_RENAME_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The directory service cannot perform the requested operation because a domain rename operation is in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000802<br />STATUS_DISK_QUOTA_EXCEEDED</p>
+ </td>
+ <td>
+ <p>An operation failed because the storage quota was exceeded.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000804<br />STATUS_CONTENT_BLOCKED</p>
+ </td>
+ <td>
+ <p>An operation failed because the content was blocked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000805<br />STATUS_BAD_CLUSTERS</p>
+ </td>
+ <td>
+ <p>The operation could not be completed due to bad clusters on disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000806<br />STATUS_VOLUME_DIRTY</p>
+ </td>
+ <td>
+ <p>The operation could not be completed because the volume is dirty. Please run the Chkdsk utility and try again. </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000901<br />STATUS_FILE_CHECKED_OUT</p>
+ </td>
+ <td>
+ <p>This file is checked out or locked for editing by another user.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000902<br />STATUS_CHECKOUT_REQUIRED</p>
+ </td>
+ <td>
+ <p>The file must be checked out before saving changes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000903<br />STATUS_BAD_FILE_TYPE</p>
+ </td>
+ <td>
+ <p>The file type being saved or retrieved has been blocked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000904<br />STATUS_FILE_TOO_LARGE</p>
+ </td>
+ <td>
+ <p>The file size exceeds the limit allowed and cannot be saved.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000905<br />STATUS_FORMS_AUTH_REQUIRED</p>
+ </td>
+ <td>
+ <p>Access Denied. Before opening files in this location, you must first browse to the e.g. site and select the option to log on automatically.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000906<br />STATUS_VIRUS_INFECTED</p>
+ </td>
+ <td>
+ <p>The operation did not complete successfully because the file contains a virus.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000907<br />STATUS_VIRUS_DELETED</p>
+ </td>
+ <td>
+ <p>This file contains a virus and cannot be opened. Due to the nature of this virus, the file has been removed from this location.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000908<br />STATUS_BAD_MCFG_TABLE</p>
+ </td>
+ <td>
+ <p>The resources required for this device conflict with the MCFG table.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0000909<br />STATUS_CANNOT_BREAK_OPLOCK</p>
+ </td>
+ <td>
+ <p>The operation did not complete successfully because it would cause an oplock to be broken. The caller has requested that existing oplocks not be broken.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0009898<br />STATUS_WOW_ASSERTION</p>
+ </td>
+ <td>
+ <p>WOW Assertion Error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A000<br />STATUS_INVALID_SIGNATURE</p>
+ </td>
+ <td>
+ <p>The cryptographic signature is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A001<br />STATUS_HMAC_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The cryptographic provider does not support HMAC.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A010<br />STATUS_IPSEC_QUEUE_OVERFLOW</p>
+ </td>
+ <td>
+ <p>The IPsec queue overflowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A011<br />STATUS_ND_QUEUE_OVERFLOW</p>
+ </td>
+ <td>
+ <p>The neighbor discovery queue overflowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A012<br />STATUS_HOPLIMIT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>An Internet Control Message Protocol (ICMP) hop limit exceeded error was received.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A013<br />STATUS_PROTOCOL_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The protocol is not installed on the local machine.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A080<br />STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused by network connectivity issues. Try to save this file elsewhere.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A081<br />STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR</p>
+ </td>
+ <td>
+ <p>{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error was returned by the server on which the file exists. Try to save this file elsewhere.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A082<br />STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR</p>
+ </td>
+ <td>
+ <p>{Delayed Write Failed} Windows was unable to save all the data for the file %hs; the data has been lost. This error may be caused if the device has been removed or the media is write-protected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A083<br />STATUS_XML_PARSE_ERROR</p>
+ </td>
+ <td>
+ <p>Windows was unable to parse the requested XML data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A084<br />STATUS_XMLDSIG_ERROR</p>
+ </td>
+ <td>
+ <p>An error was encountered while processing an XML digital signature.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A085<br />STATUS_WRONG_COMPARTMENT</p>
+ </td>
+ <td>
+ <p>This indicates that the caller made the connection request in the wrong routing compartment.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A086<br />STATUS_AUTHIP_FAILURE</p>
+ </td>
+ <td>
+ <p>This indicates that there was an AuthIP failure when attempting to connect to the remote host.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A087<br />STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS</p>
+ </td>
+ <td>
+ <p>OID mapped groups cannot have members.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A088<br />STATUS_DS_OID_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified OID cannot be found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A100<br />STATUS_HASH_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>Hash generation for the specified version and hash type is not enabled on server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A101<br />STATUS_HASH_NOT_PRESENT</p>
+ </td>
+ <td>
+ <p>The hash requests is not present or not up to date with the current file contents.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A2A1<br />STATUS_OFFLOAD_READ_FLT_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>A file system filter on the server has not opted in for Offload Read support.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A2A2<br />STATUS_OFFLOAD_WRITE_FLT_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>A file system filter on the server has not opted in for Offload Write support.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A2A3<br />STATUS_OFFLOAD_READ_FILE_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>Offload read operations cannot be performed on:</p>
+ <ul>
+ <li class="unordered">
+ <p class="BulletedList">Compressed files</p>
+ </li>
+ <li class="unordered">
+ <p class="BulletedList">Sparse files</p>
+ </li>
+ <li class="unordered">
+ <p class="BulletedList">Encrypted files</p>
+ </li>
+ <li class="unordered">
+ <p class="BulletedList">File system metadata files</p>
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC000A2A4<br />STATUS_OFFLOAD_WRITE_FILE_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>Offload write operations cannot be performed on:</p>
+ <ul>
+ <li class="unordered">
+ <p class="BulletedList">Compressed files</p>
+ </li>
+ <li class="unordered">
+ <p class="BulletedList">Sparse files</p>
+ </li>
+ <li class="unordered">
+ <p class="BulletedList">Encrypted files</p>
+ </li>
+ <li class="unordered">
+ <p class="BulletedList">File system metadata files</p>
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0010001<br />DBG_NO_STATE_CHANGE</p>
+ </td>
+ <td>
+ <p>The debugger did not perform a state change.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0010002<br />DBG_APP_NOT_IDLE</p>
+ </td>
+ <td>
+ <p>The debugger found that the application is not idle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020001<br />RPC_NT_INVALID_STRING_BINDING</p>
+ </td>
+ <td>
+ <p>The string binding is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020002<br />RPC_NT_WRONG_KIND_OF_BINDING</p>
+ </td>
+ <td>
+ <p>The binding handle is not the correct type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020003<br />RPC_NT_INVALID_BINDING</p>
+ </td>
+ <td>
+ <p>The binding handle is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020004<br />RPC_NT_PROTSEQ_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The RPC protocol sequence is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020005<br />RPC_NT_INVALID_RPC_PROTSEQ</p>
+ </td>
+ <td>
+ <p>The RPC protocol sequence is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020006<br />RPC_NT_INVALID_STRING_UUID</p>
+ </td>
+ <td>
+ <p>The string UUID is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020007<br />RPC_NT_INVALID_ENDPOINT_FORMAT</p>
+ </td>
+ <td>
+ <p>The endpoint format is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020008<br />RPC_NT_INVALID_NET_ADDR</p>
+ </td>
+ <td>
+ <p>The network address is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020009<br />RPC_NT_NO_ENDPOINT_FOUND</p>
+ </td>
+ <td>
+ <p>No endpoint was found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002000A<br />RPC_NT_INVALID_TIMEOUT</p>
+ </td>
+ <td>
+ <p>The time-out value is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002000B<br />RPC_NT_OBJECT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The object UUID was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002000C<br />RPC_NT_ALREADY_REGISTERED</p>
+ </td>
+ <td>
+ <p>The object UUID has already been registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002000D<br />RPC_NT_TYPE_ALREADY_REGISTERED</p>
+ </td>
+ <td>
+ <p>The type UUID has already been registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002000E<br />RPC_NT_ALREADY_LISTENING</p>
+ </td>
+ <td>
+ <p>The RPC server is already listening.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002000F<br />RPC_NT_NO_PROTSEQS_REGISTERED</p>
+ </td>
+ <td>
+ <p>No protocol sequences have been registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020010<br />RPC_NT_NOT_LISTENING</p>
+ </td>
+ <td>
+ <p>The RPC server is not listening.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020011<br />RPC_NT_UNKNOWN_MGR_TYPE</p>
+ </td>
+ <td>
+ <p>The manager type is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020012<br />RPC_NT_UNKNOWN_IF</p>
+ </td>
+ <td>
+ <p>The interface is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020013<br />RPC_NT_NO_BINDINGS</p>
+ </td>
+ <td>
+ <p>There are no bindings.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020014<br />RPC_NT_NO_PROTSEQS</p>
+ </td>
+ <td>
+ <p>There are no protocol sequences.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020015<br />RPC_NT_CANT_CREATE_ENDPOINT</p>
+ </td>
+ <td>
+ <p>The endpoint cannot be created.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020016<br />RPC_NT_OUT_OF_RESOURCES</p>
+ </td>
+ <td>
+ <p>Insufficient resources are available to complete this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020017<br />RPC_NT_SERVER_UNAVAILABLE</p>
+ </td>
+ <td>
+ <p>The RPC server is unavailable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020018<br />RPC_NT_SERVER_TOO_BUSY</p>
+ </td>
+ <td>
+ <p>The RPC server is too busy to complete this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020019<br />RPC_NT_INVALID_NETWORK_OPTIONS</p>
+ </td>
+ <td>
+ <p>The network options are invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002001A<br />RPC_NT_NO_CALL_ACTIVE</p>
+ </td>
+ <td>
+ <p>No RPCs are active on this thread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002001B<br />RPC_NT_CALL_FAILED</p>
+ </td>
+ <td>
+ <p>The RPC failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002001C<br />RPC_NT_CALL_FAILED_DNE</p>
+ </td>
+ <td>
+ <p>The RPC failed and did not execute.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002001D<br />RPC_NT_PROTOCOL_ERROR</p>
+ </td>
+ <td>
+ <p>An RPC protocol error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002001F<br />RPC_NT_UNSUPPORTED_TRANS_SYN</p>
+ </td>
+ <td>
+ <p>The RPC server does not support the transfer syntax.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020021<br />RPC_NT_UNSUPPORTED_TYPE</p>
+ </td>
+ <td>
+ <p>The type UUID is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020022<br />RPC_NT_INVALID_TAG</p>
+ </td>
+ <td>
+ <p>The tag is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020023<br />RPC_NT_INVALID_BOUND</p>
+ </td>
+ <td>
+ <p>The array bounds are invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020024<br />RPC_NT_NO_ENTRY_NAME</p>
+ </td>
+ <td>
+ <p>The binding does not contain an entry name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020025<br />RPC_NT_INVALID_NAME_SYNTAX</p>
+ </td>
+ <td>
+ <p>The name syntax is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020026<br />RPC_NT_UNSUPPORTED_NAME_SYNTAX</p>
+ </td>
+ <td>
+ <p>The name syntax is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020028<br />RPC_NT_UUID_NO_ADDRESS</p>
+ </td>
+ <td>
+ <p>No network address is available to construct a UUID.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020029<br />RPC_NT_DUPLICATE_ENDPOINT</p>
+ </td>
+ <td>
+ <p>The endpoint is a duplicate.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002002A<br />RPC_NT_UNKNOWN_AUTHN_TYPE</p>
+ </td>
+ <td>
+ <p>The authentication type is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002002B<br />RPC_NT_MAX_CALLS_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>The maximum number of calls is too small.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002002C<br />RPC_NT_STRING_TOO_LONG</p>
+ </td>
+ <td>
+ <p>The string is too long.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002002D<br />RPC_NT_PROTSEQ_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The RPC protocol sequence was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002002E<br />RPC_NT_PROCNUM_OUT_OF_RANGE</p>
+ </td>
+ <td>
+ <p>The procedure number is out of range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002002F<br />RPC_NT_BINDING_HAS_NO_AUTH</p>
+ </td>
+ <td>
+ <p>The binding does not contain any authentication information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020030<br />RPC_NT_UNKNOWN_AUTHN_SERVICE</p>
+ </td>
+ <td>
+ <p>The authentication service is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020031<br />RPC_NT_UNKNOWN_AUTHN_LEVEL</p>
+ </td>
+ <td>
+ <p>The authentication level is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020032<br />RPC_NT_INVALID_AUTH_IDENTITY</p>
+ </td>
+ <td>
+ <p>The security context is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020033<br />RPC_NT_UNKNOWN_AUTHZ_SERVICE</p>
+ </td>
+ <td>
+ <p>The authorization service is unknown.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020034<br />EPT_NT_INVALID_ENTRY</p>
+ </td>
+ <td>
+ <p>The entry is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020035<br />EPT_NT_CANT_PERFORM_OP</p>
+ </td>
+ <td>
+ <p>The operation cannot be performed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020036<br />EPT_NT_NOT_REGISTERED</p>
+ </td>
+ <td>
+ <p>No more endpoints are available from the endpoint mapper.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020037<br />RPC_NT_NOTHING_TO_EXPORT</p>
+ </td>
+ <td>
+ <p>No interfaces have been exported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020038<br />RPC_NT_INCOMPLETE_NAME</p>
+ </td>
+ <td>
+ <p>The entry name is incomplete.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020039<br />RPC_NT_INVALID_VERS_OPTION</p>
+ </td>
+ <td>
+ <p>The version option is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002003A<br />RPC_NT_NO_MORE_MEMBERS</p>
+ </td>
+ <td>
+ <p>There are no more members.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002003B<br />RPC_NT_NOT_ALL_OBJS_UNEXPORTED</p>
+ </td>
+ <td>
+ <p>There is nothing to unexport.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002003C<br />RPC_NT_INTERFACE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The interface was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002003D<br />RPC_NT_ENTRY_ALREADY_EXISTS</p>
+ </td>
+ <td>
+ <p>The entry already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002003E<br />RPC_NT_ENTRY_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The entry was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002003F<br />RPC_NT_NAME_SERVICE_UNAVAILABLE</p>
+ </td>
+ <td>
+ <p>The name service is unavailable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020040<br />RPC_NT_INVALID_NAF_ID</p>
+ </td>
+ <td>
+ <p>The network address family is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020041<br />RPC_NT_CANNOT_SUPPORT</p>
+ </td>
+ <td>
+ <p>The requested operation is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020042<br />RPC_NT_NO_CONTEXT_AVAILABLE</p>
+ </td>
+ <td>
+ <p>No security context is available to allow impersonation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020043<br />RPC_NT_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An internal error occurred in the RPC.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020044<br />RPC_NT_ZERO_DIVIDE</p>
+ </td>
+ <td>
+ <p>The RPC server attempted to divide an integer by zero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020045<br />RPC_NT_ADDRESS_ERROR</p>
+ </td>
+ <td>
+ <p>An addressing error occurred in the RPC server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020046<br />RPC_NT_FP_DIV_ZERO</p>
+ </td>
+ <td>
+ <p>A floating point operation at the RPC server caused a divide by zero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020047<br />RPC_NT_FP_UNDERFLOW</p>
+ </td>
+ <td>
+ <p>A floating point underflow occurred at the RPC server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020048<br />RPC_NT_FP_OVERFLOW</p>
+ </td>
+ <td>
+ <p>A floating point overflow occurred at the RPC server.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020049<br />RPC_NT_CALL_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>An RPC is already in progress for this thread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002004A<br />RPC_NT_NO_MORE_BINDINGS</p>
+ </td>
+ <td>
+ <p>There are no more bindings.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002004B<br />RPC_NT_GROUP_MEMBER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The group member was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002004C<br />EPT_NT_CANT_CREATE</p>
+ </td>
+ <td>
+ <p>The endpoint mapper database entry could not be created.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002004D<br />RPC_NT_INVALID_OBJECT</p>
+ </td>
+ <td>
+ <p>The object UUID is the nil UUID.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC002004F<br />RPC_NT_NO_INTERFACES</p>
+ </td>
+ <td>
+ <p>No interfaces have been registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020050<br />RPC_NT_CALL_CANCELLED</p>
+ </td>
+ <td>
+ <p>The RPC was canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020051<br />RPC_NT_BINDING_INCOMPLETE</p>
+ </td>
+ <td>
+ <p>The binding handle does not contain all the required information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020052<br />RPC_NT_COMM_FAILURE</p>
+ </td>
+ <td>
+ <p>A communications failure occurred during an RPC.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020053<br />RPC_NT_UNSUPPORTED_AUTHN_LEVEL</p>
+ </td>
+ <td>
+ <p>The requested authentication level is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020054<br />RPC_NT_NO_PRINC_NAME</p>
+ </td>
+ <td>
+ <p>No principal name was registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020055<br />RPC_NT_NOT_RPC_ERROR</p>
+ </td>
+ <td>
+ <p>The error specified is not a valid Windows RPC error code.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020057<br />RPC_NT_SEC_PKG_ERROR</p>
+ </td>
+ <td>
+ <p>A security package-specific error occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020058<br />RPC_NT_NOT_CANCELLED</p>
+ </td>
+ <td>
+ <p>The thread was not canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020062<br />RPC_NT_INVALID_ASYNC_HANDLE</p>
+ </td>
+ <td>
+ <p>Invalid asynchronous RPC handle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020063<br />RPC_NT_INVALID_ASYNC_CALL</p>
+ </td>
+ <td>
+ <p>Invalid asynchronous RPC call handle for this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0020064<br />RPC_NT_PROXY_ACCESS_DENIED</p>
+ </td>
+ <td>
+ <p>Access to the HTTP proxy is denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030001<br />RPC_NT_NO_MORE_ENTRIES</p>
+ </td>
+ <td>
+ <p>The list of RPC servers available for auto-handle binding has been exhausted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030002<br />RPC_NT_SS_CHAR_TRANS_OPEN_FAIL</p>
+ </td>
+ <td>
+ <p>The file designated by DCERPCCHARTRANS cannot be opened.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030003<br />RPC_NT_SS_CHAR_TRANS_SHORT_FILE</p>
+ </td>
+ <td>
+ <p>The file containing the character translation table has fewer than 512 bytes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030004<br />RPC_NT_SS_IN_NULL_CONTEXT</p>
+ </td>
+ <td>
+ <p>A null context handle is passed as an [in] parameter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030005<br />RPC_NT_SS_CONTEXT_MISMATCH</p>
+ </td>
+ <td>
+ <p>The context handle does not match any known context handles.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030006<br />RPC_NT_SS_CONTEXT_DAMAGED</p>
+ </td>
+ <td>
+ <p>The context handle changed during a call.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030007<br />RPC_NT_SS_HANDLES_MISMATCH</p>
+ </td>
+ <td>
+ <p>The binding handles passed to an RPC do not match.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030008<br />RPC_NT_SS_CANNOT_GET_CALL_HANDLE</p>
+ </td>
+ <td>
+ <p>The stub is unable to get the call handle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030009<br />RPC_NT_NULL_REF_POINTER</p>
+ </td>
+ <td>
+ <p>A null reference pointer was passed to the stub.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003000A<br />RPC_NT_ENUM_VALUE_OUT_OF_RANGE</p>
+ </td>
+ <td>
+ <p>The enumeration value is out of range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003000B<br />RPC_NT_BYTE_COUNT_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>The byte count is too small.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003000C<br />RPC_NT_BAD_STUB_DATA</p>
+ </td>
+ <td>
+ <p>The stub received bad data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030059<br />RPC_NT_INVALID_ES_ACTION</p>
+ </td>
+ <td>
+ <p>Invalid operation on the encoding/decoding handle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003005A<br />RPC_NT_WRONG_ES_VERSION</p>
+ </td>
+ <td>
+ <p>Incompatible version of the serializing package.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003005B<br />RPC_NT_WRONG_STUB_VERSION</p>
+ </td>
+ <td>
+ <p>Incompatible version of the RPC stub.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003005C<br />RPC_NT_INVALID_PIPE_OBJECT</p>
+ </td>
+ <td>
+ <p>The RPC pipe object is invalid or corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003005D<br />RPC_NT_INVALID_PIPE_OPERATION</p>
+ </td>
+ <td>
+ <p>An invalid operation was attempted on an RPC pipe object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003005E<br />RPC_NT_WRONG_PIPE_VERSION</p>
+ </td>
+ <td>
+ <p>Unsupported RPC pipe version.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC003005F<br />RPC_NT_PIPE_CLOSED</p>
+ </td>
+ <td>
+ <p>The RPC pipe object has already been closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030060<br />RPC_NT_PIPE_DISCIPLINE_ERROR</p>
+ </td>
+ <td>
+ <p>The RPC call completed before all pipes were processed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0030061<br />RPC_NT_PIPE_EMPTY</p>
+ </td>
+ <td>
+ <p>No more data is available from the RPC pipe.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0040035<br />STATUS_PNP_BAD_MPS_TABLE</p>
+ </td>
+ <td>
+ <p>A device is missing in the system BIOS MPS table. This device will not be used. Contact your system vendor for a system BIOS update.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0040036<br />STATUS_PNP_TRANSLATION_FAILED</p>
+ </td>
+ <td>
+ <p>A translator failed to translate resources.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0040037<br />STATUS_PNP_IRQ_TRANSLATION_FAILED</p>
+ </td>
+ <td>
+ <p>An IRQ translator failed to translate resources.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0040038<br />STATUS_PNP_INVALID_ID</p>
+ </td>
+ <td>
+ <p>Driver %2 returned an invalid ID for a child device (%3).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0040039<br />STATUS_IO_REISSUE_AS_CACHED</p>
+ </td>
+ <td>
+ <p>Reissue the given operation as a cached I/O operation</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0001<br />STATUS_CTX_WINSTATION_NAME_INVALID</p>
+ </td>
+ <td>
+ <p>Session name %1 is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0002<br />STATUS_CTX_INVALID_PD</p>
+ </td>
+ <td>
+ <p>The protocol driver %1 is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0003<br />STATUS_CTX_PD_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The protocol driver %1 was not found in the system path.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0006<br />STATUS_CTX_CLOSE_PENDING</p>
+ </td>
+ <td>
+ <p>A close operation is pending on the terminal connection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0007<br />STATUS_CTX_NO_OUTBUF</p>
+ </td>
+ <td>
+ <p>No free output buffers are available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0008<br />STATUS_CTX_MODEM_INF_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The MODEM.INF file was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0009<br />STATUS_CTX_INVALID_MODEMNAME</p>
+ </td>
+ <td>
+ <p>The modem (%1) was not found in the MODEM.INF file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A000A<br />STATUS_CTX_RESPONSE_ERROR</p>
+ </td>
+ <td>
+ <p>The modem did not accept the command sent to it. Verify that the configured modem name matches the attached modem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A000B<br />STATUS_CTX_MODEM_RESPONSE_TIMEOUT</p>
+ </td>
+ <td>
+ <p>The modem did not respond to the command sent to it. Verify that the modem cable is properly attached and the modem is turned on.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A000C<br />STATUS_CTX_MODEM_RESPONSE_NO_CARRIER</p>
+ </td>
+ <td>
+ <p>Carrier detection has failed or the carrier has been dropped due to disconnection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A000D<br />STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE</p>
+ </td>
+ <td>
+ <p>A dial tone was not detected within the required time. Verify that the phone cable is properly attached and functional.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A000E<br />STATUS_CTX_MODEM_RESPONSE_BUSY</p>
+ </td>
+ <td>
+ <p>A busy signal was detected at a remote site on callback.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A000F<br />STATUS_CTX_MODEM_RESPONSE_VOICE</p>
+ </td>
+ <td>
+ <p>A voice was detected at a remote site on callback.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0010<br />STATUS_CTX_TD_ERROR</p>
+ </td>
+ <td>
+ <p>Transport driver error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0012<br />STATUS_CTX_LICENSE_CLIENT_INVALID</p>
+ </td>
+ <td>
+ <p>The client you are using is not licensed to use this system. Your logon request is denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0013<br />STATUS_CTX_LICENSE_NOT_AVAILABLE</p>
+ </td>
+ <td>
+ <p>The system has reached its licensed logon limit. Try again later.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0014<br />STATUS_CTX_LICENSE_EXPIRED</p>
+ </td>
+ <td>
+ <p>The system license has expired. Your logon request is denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0015<br />STATUS_CTX_WINSTATION_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified session cannot be found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0016<br />STATUS_CTX_WINSTATION_NAME_COLLISION</p>
+ </td>
+ <td>
+ <p>The specified session name is already in use.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0017<br />STATUS_CTX_WINSTATION_BUSY</p>
+ </td>
+ <td>
+ <p>The requested operation cannot be completed because the terminal connection is currently processing a connect, disconnect, reset, or delete operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0018<br />STATUS_CTX_BAD_VIDEO_MODE</p>
+ </td>
+ <td>
+ <p>An attempt has been made to connect to a session whose video mode is not supported by the current client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0022<br />STATUS_CTX_GRAPHICS_INVALID</p>
+ </td>
+ <td>
+ <p>The application attempted to enable DOS graphics mode. DOS graphics mode is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0024<br />STATUS_CTX_NOT_CONSOLE</p>
+ </td>
+ <td>
+ <p>The requested operation can be performed only on the system console. This is most often the result of a driver or system DLL requiring direct console access.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0026<br />STATUS_CTX_CLIENT_QUERY_TIMEOUT</p>
+ </td>
+ <td>
+ <p>The client failed to respond to the server connect message.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0027<br />STATUS_CTX_CONSOLE_DISCONNECT</p>
+ </td>
+ <td>
+ <p>Disconnecting the console session is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0028<br />STATUS_CTX_CONSOLE_CONNECT</p>
+ </td>
+ <td>
+ <p>Reconnecting a disconnected session to the console is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A002A<br />STATUS_CTX_SHADOW_DENIED</p>
+ </td>
+ <td>
+ <p>The request to control another session remotely was denied.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A002B<br />STATUS_CTX_WINSTATION_ACCESS_DENIED</p>
+ </td>
+ <td>
+ <p>A process has requested access to a session, but has not been granted those access rights.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A002E<br />STATUS_CTX_INVALID_WD</p>
+ </td>
+ <td>
+ <p>The terminal connection driver %1 is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A002F<br />STATUS_CTX_WD_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The terminal connection driver %1 was not found in the system path.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0030<br />STATUS_CTX_SHADOW_INVALID</p>
+ </td>
+ <td>
+ <p>The requested session cannot be controlled remotely. You cannot control your own session, a session that is trying to control your session, a session that has no user logged on, or other sessions from the console.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0031<br />STATUS_CTX_SHADOW_DISABLED</p>
+ </td>
+ <td>
+ <p>The requested session is not configured to allow remote control.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0032<br />STATUS_RDP_PROTOCOL_ERROR</p>
+ </td>
+ <td>
+ <p>The RDP protocol component %2 detected an error in the protocol stream and has disconnected the client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0033<br />STATUS_CTX_CLIENT_LICENSE_NOT_SET</p>
+ </td>
+ <td>
+ <p>Your request to connect to this <a href="https://msdn.microsoft.com/en-us/library/43f5bde9-36cf-4d5a-af80-8c687cce8b60#terminal_server">terminal server</a> has been rejected. Your terminal server client license number has not been entered for this copy of the terminal client. Contact your system administrator for help in entering a valid, unique license number for this terminal server client. Click OK to continue.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0034<br />STATUS_CTX_CLIENT_LICENSE_IN_USE</p>
+ </td>
+ <td>
+ <p>Your request to connect to this terminal server has been rejected. Your terminal server client license number is currently being used by another user. Contact your system administrator to obtain a new copy of the terminal server client with a valid, unique license number. Click OK to continue.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0035<br />STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE</p>
+ </td>
+ <td>
+ <p>The remote control of the console was terminated because the display mode was changed. Changing the display mode in a remote control session is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0036<br />STATUS_CTX_SHADOW_NOT_RUNNING</p>
+ </td>
+ <td>
+ <p>Remote control could not be terminated because the specified session is not currently being remotely controlled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0037<br />STATUS_CTX_LOGON_DISABLED</p>
+ </td>
+ <td>
+ <p>Your interactive logon privilege has been disabled. Contact your system administrator.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0038<br />STATUS_CTX_SECURITY_LAYER_ERROR</p>
+ </td>
+ <td>
+ <p>The terminal server security layer detected an error in the protocol stream and has disconnected the client.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00A0039<br />STATUS_TS_INCOMPATIBLE_SESSIONS</p>
+ </td>
+ <td>
+ <p>The target session is incompatible with the current session.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0001<br />STATUS_MUI_FILE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The resource loader failed to find an MUI file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0002<br />STATUS_MUI_INVALID_FILE</p>
+ </td>
+ <td>
+ <p>The resource loader failed to load an MUI file because the file failed to pass validation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0003<br />STATUS_MUI_INVALID_RC_CONFIG</p>
+ </td>
+ <td>
+ <p>The RC manifest is corrupted with garbage data, is an unsupported version, or is missing a required item.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0004<br />STATUS_MUI_INVALID_LOCALE_NAME</p>
+ </td>
+ <td>
+ <p>The RC manifest has an invalid culture name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0005<br />STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME</p>
+ </td>
+ <td>
+ <p>The RC manifest has and invalid ultimate fallback name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0006<br />STATUS_MUI_FILE_NOT_LOADED</p>
+ </td>
+ <td>
+ <p>The resource loader cache does not have a loaded MUI entry.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC00B0007<br />STATUS_RESOURCE_ENUM_USER_STOP</p>
+ </td>
+ <td>
+ <p>The user stopped resource enumeration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130001<br />STATUS_CLUSTER_INVALID_NODE</p>
+ </td>
+ <td>
+ <p>The cluster node is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130002<br />STATUS_CLUSTER_NODE_EXISTS</p>
+ </td>
+ <td>
+ <p>The cluster node already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130003<br />STATUS_CLUSTER_JOIN_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>A node is in the process of joining the cluster.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130004<br />STATUS_CLUSTER_NODE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The cluster node was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130005<br />STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The cluster local node information was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130006<br />STATUS_CLUSTER_NETWORK_EXISTS</p>
+ </td>
+ <td>
+ <p>The cluster network already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130007<br />STATUS_CLUSTER_NETWORK_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The cluster network was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130008<br />STATUS_CLUSTER_NETINTERFACE_EXISTS</p>
+ </td>
+ <td>
+ <p>The cluster network interface already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130009<br />STATUS_CLUSTER_NETINTERFACE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The cluster network interface was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC013000A<br />STATUS_CLUSTER_INVALID_REQUEST</p>
+ </td>
+ <td>
+ <p>The cluster request is not valid for this object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC013000B<br />STATUS_CLUSTER_INVALID_NETWORK_PROVIDER</p>
+ </td>
+ <td>
+ <p>The cluster network provider is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC013000C<br />STATUS_CLUSTER_NODE_DOWN</p>
+ </td>
+ <td>
+ <p>The cluster node is down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC013000D<br />STATUS_CLUSTER_NODE_UNREACHABLE</p>
+ </td>
+ <td>
+ <p>The cluster node is not reachable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC013000E<br />STATUS_CLUSTER_NODE_NOT_MEMBER</p>
+ </td>
+ <td>
+ <p>The cluster node is not a member of the cluster.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC013000F<br />STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>A cluster join operation is not in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130010<br />STATUS_CLUSTER_INVALID_NETWORK</p>
+ </td>
+ <td>
+ <p>The cluster network is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130011<br />STATUS_CLUSTER_NO_NET_ADAPTERS</p>
+ </td>
+ <td>
+ <p>No network adapters are available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130012<br />STATUS_CLUSTER_NODE_UP</p>
+ </td>
+ <td>
+ <p>The cluster node is up.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130013<br />STATUS_CLUSTER_NODE_PAUSED</p>
+ </td>
+ <td>
+ <p>The cluster node is paused.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130014<br />STATUS_CLUSTER_NODE_NOT_PAUSED</p>
+ </td>
+ <td>
+ <p>The cluster node is not paused.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130015<br />STATUS_CLUSTER_NO_SECURITY_CONTEXT</p>
+ </td>
+ <td>
+ <p>No cluster security context is available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130016<br />STATUS_CLUSTER_NETWORK_NOT_INTERNAL</p>
+ </td>
+ <td>
+ <p>The cluster network is not configured for internal cluster communication.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0130017<br />STATUS_CLUSTER_POISONED</p>
+ </td>
+ <td>
+ <p>The cluster node has been poisoned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140001<br />STATUS_ACPI_INVALID_OPCODE</p>
+ </td>
+ <td>
+ <p>An attempt was made to run an invalid AML opcode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140002<br />STATUS_ACPI_STACK_OVERFLOW</p>
+ </td>
+ <td>
+ <p>The AML interpreter stack has overflowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140003<br />STATUS_ACPI_ASSERT_FAILED</p>
+ </td>
+ <td>
+ <p>An inconsistent state has occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140004<br />STATUS_ACPI_INVALID_INDEX</p>
+ </td>
+ <td>
+ <p>An attempt was made to access an array outside its bounds.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140005<br />STATUS_ACPI_INVALID_ARGUMENT</p>
+ </td>
+ <td>
+ <p>A required argument was not specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140006<br />STATUS_ACPI_FATAL</p>
+ </td>
+ <td>
+ <p>A fatal error has occurred.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140007<br />STATUS_ACPI_INVALID_SUPERNAME</p>
+ </td>
+ <td>
+ <p>An invalid SuperName was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140008<br />STATUS_ACPI_INVALID_ARGTYPE</p>
+ </td>
+ <td>
+ <p>An argument with an incorrect type was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140009<br />STATUS_ACPI_INVALID_OBJTYPE</p>
+ </td>
+ <td>
+ <p>An object with an incorrect type was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC014000A<br />STATUS_ACPI_INVALID_TARGETTYPE</p>
+ </td>
+ <td>
+ <p>A target with an incorrect type was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC014000B<br />STATUS_ACPI_INCORRECT_ARGUMENT_COUNT</p>
+ </td>
+ <td>
+ <p>An incorrect number of arguments was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC014000C<br />STATUS_ACPI_ADDRESS_NOT_MAPPED</p>
+ </td>
+ <td>
+ <p>An address failed to translate.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC014000D<br />STATUS_ACPI_INVALID_EVENTTYPE</p>
+ </td>
+ <td>
+ <p>An incorrect event type was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC014000E<br />STATUS_ACPI_HANDLER_COLLISION</p>
+ </td>
+ <td>
+ <p>A handler for the target already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC014000F<br />STATUS_ACPI_INVALID_DATA</p>
+ </td>
+ <td>
+ <p>Invalid data for the target was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140010<br />STATUS_ACPI_INVALID_REGION</p>
+ </td>
+ <td>
+ <p>An invalid region for the target was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140011<br />STATUS_ACPI_INVALID_ACCESS_SIZE</p>
+ </td>
+ <td>
+ <p>An attempt was made to access a field outside the defined range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140012<br />STATUS_ACPI_ACQUIRE_GLOBAL_LOCK</p>
+ </td>
+ <td>
+ <p>The global system lock could not be acquired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140013<br />STATUS_ACPI_ALREADY_INITIALIZED</p>
+ </td>
+ <td>
+ <p>An attempt was made to reinitialize the ACPI subsystem.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140014<br />STATUS_ACPI_NOT_INITIALIZED</p>
+ </td>
+ <td>
+ <p>The ACPI subsystem has not been initialized.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140015<br />STATUS_ACPI_INVALID_MUTEX_LEVEL</p>
+ </td>
+ <td>
+ <p>An incorrect mutex was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140016<br />STATUS_ACPI_MUTEX_NOT_OWNED</p>
+ </td>
+ <td>
+ <p>The mutex is not currently owned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140017<br />STATUS_ACPI_MUTEX_NOT_OWNER</p>
+ </td>
+ <td>
+ <p>An attempt was made to access the mutex by a process that was not the owner.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140018<br />STATUS_ACPI_RS_ACCESS</p>
+ </td>
+ <td>
+ <p>An error occurred during an access to region space.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140019<br />STATUS_ACPI_INVALID_TABLE</p>
+ </td>
+ <td>
+ <p>An attempt was made to use an incorrect table.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140020<br />STATUS_ACPI_REG_HANDLER_FAILED</p>
+ </td>
+ <td>
+ <p>The registration of an ACPI event failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0140021<br />STATUS_ACPI_POWER_REQUEST_FAILED</p>
+ </td>
+ <td>
+ <p>An ACPI power object failed to transition state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150001<br />STATUS_SXS_SECTION_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The requested section is not present in the activation context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150002<br />STATUS_SXS_CANT_GEN_ACTCTX</p>
+ </td>
+ <td>
+ <p>
+ Windows was unble to process the application binding information. Refer to the system event log for further information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150003<br />STATUS_SXS_INVALID_ACTCTXDATA_FORMAT</p>
+ </td>
+ <td>
+ <p>The application binding data format is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150004<br />STATUS_SXS_ASSEMBLY_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The referenced assembly is not installed on the system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150005<br />STATUS_SXS_MANIFEST_FORMAT_ERROR</p>
+ </td>
+ <td>
+ <p>The manifest file does not begin with the required tag and format information.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150006<br />STATUS_SXS_MANIFEST_PARSE_ERROR</p>
+ </td>
+ <td>
+ <p>The manifest file contains one or more syntax errors.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150007<br />STATUS_SXS_ACTIVATION_CONTEXT_DISABLED</p>
+ </td>
+ <td>
+ <p>The application attempted to activate a disabled activation context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150008<br />STATUS_SXS_KEY_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The requested lookup key was not found in any active activation context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150009<br />STATUS_SXS_VERSION_CONFLICT</p>
+ </td>
+ <td>
+ <p>A component version required by the application conflicts with another component version that is already active.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015000A<br />STATUS_SXS_WRONG_SECTION_TYPE</p>
+ </td>
+ <td>
+ <p>The type requested activation context section does not match the query API used.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015000B<br />STATUS_SXS_THREAD_QUERIES_DISABLED</p>
+ </td>
+ <td>
+ <p>Lack of system resources has required isolated activation to be disabled for the current thread of execution.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015000C<br />STATUS_SXS_ASSEMBLY_MISSING</p>
+ </td>
+ <td>
+ <p>The referenced assembly could not be found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015000E<br />STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET</p>
+ </td>
+ <td>
+ <p>An attempt to set the process default activation context failed because the process default activation context was already set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015000F<br />STATUS_SXS_EARLY_DEACTIVATION</p>
+ </td>
+ <td>
+ <p>The activation context being deactivated is not the most recently activated one.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150010<br />STATUS_SXS_INVALID_DEACTIVATION</p>
+ </td>
+ <td>
+ <p>The activation context being deactivated is not active for the current thread of execution.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150011<br />STATUS_SXS_MULTIPLE_DEACTIVATION</p>
+ </td>
+ <td>
+ <p>The activation context being deactivated has already been deactivated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150012<br />STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY</p>
+ </td>
+ <td>
+ <p>The activation context of the system default assembly could not be generated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150013<br />STATUS_SXS_PROCESS_TERMINATION_REQUESTED</p>
+ </td>
+ <td>
+ <p>A component used by the isolation facility has requested that the process be terminated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150014<br />STATUS_SXS_CORRUPT_ACTIVATION_STACK</p>
+ </td>
+ <td>
+ <p>The activation context activation stack for the running thread of execution is corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150015<br />STATUS_SXS_CORRUPTION</p>
+ </td>
+ <td>
+ <p>The application isolation metadata for this process or thread has become corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150016<br />STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE</p>
+ </td>
+ <td>
+ <p>The value of an attribute in an identity is not within the legal range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150017<br />STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME</p>
+ </td>
+ <td>
+ <p>The name of an attribute in an identity is not within the legal range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150018<br />STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE</p>
+ </td>
+ <td>
+ <p>An identity contains two definitions for the same attribute.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150019<br />STATUS_SXS_IDENTITY_PARSE_ERROR</p>
+ </td>
+ <td>
+ <p>The identity string is malformed. This may be due to a trailing comma, more than two unnamed attributes, a missing attribute name, or a missing attribute value.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015001A<br />STATUS_SXS_COMPONENT_STORE_CORRUPT</p>
+ </td>
+ <td>
+ <p>The component store has become corrupted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015001B<br />STATUS_SXS_FILE_HASH_MISMATCH</p>
+ </td>
+ <td>
+ <p>A component's file does not match the verification information present in the component manifest.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015001C<br />STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT</p>
+ </td>
+ <td>
+ <p>The identities of the manifests are identical, but their contents are different.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015001D<br />STATUS_SXS_IDENTITIES_DIFFERENT</p>
+ </td>
+ <td>
+ <p>The component identities are different.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015001E<br />STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT</p>
+ </td>
+ <td>
+ <p>The assembly is not a deployment.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC015001F<br />STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY</p>
+ </td>
+ <td>
+ <p>The file is not a part of the assembly.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150020<br />STATUS_ADVANCED_INSTALLER_FAILED</p>
+ </td>
+ <td>
+ <p>An advanced installer failed during setup or servicing.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150021<br />STATUS_XML_ENCODING_MISMATCH</p>
+ </td>
+ <td>
+ <p>The character encoding in the XML declaration did not match the encoding used in the document.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150022<br />STATUS_SXS_MANIFEST_TOO_BIG</p>
+ </td>
+ <td>
+ <p>The size of the manifest exceeds the maximum allowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150023<br />STATUS_SXS_SETTING_NOT_REGISTERED</p>
+ </td>
+ <td>
+ <p>The setting is not registered.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150024<br />STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE</p>
+ </td>
+ <td>
+ <p>One or more required transaction members are not present.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150025<br />STATUS_SMI_PRIMITIVE_INSTALLER_FAILED</p>
+ </td>
+ <td>
+ <p>The SMI primitive installer failed during setup or servicing.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150026<br />STATUS_GENERIC_COMMAND_FAILED</p>
+ </td>
+ <td>
+ <p>A generic command executable returned a result that indicates failure.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0150027<br />STATUS_SXS_FILE_HASH_MISSING</p>
+ </td>
+ <td>
+ <p>A component is missing file verification information in its manifest.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190001<br />STATUS_TRANSACTIONAL_CONFLICT</p>
+ </td>
+ <td>
+ <p>The function attempted to use a name that is reserved for use by another transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190002<br />STATUS_INVALID_TRANSACTION</p>
+ </td>
+ <td>
+ <p>The transaction handle associated with this operation is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190003<br />STATUS_TRANSACTION_NOT_ACTIVE</p>
+ </td>
+ <td>
+ <p>The requested operation was made in the context of a transaction that is no longer active.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190004<br />STATUS_TM_INITIALIZATION_FAILED</p>
+ </td>
+ <td>
+ <p>The transaction manager was unable to be successfully initialized. Transacted operations are not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190005<br />STATUS_RM_NOT_ACTIVE</p>
+ </td>
+ <td>
+ <p>Transaction support within the specified file system resource manager was not started or was shut down due to an error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190006<br />STATUS_RM_METADATA_CORRUPT</p>
+ </td>
+ <td>
+ <p>The metadata of the resource manager has been corrupted. The resource manager will not function.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190007<br />STATUS_TRANSACTION_NOT_JOINED</p>
+ </td>
+ <td>
+ <p>The resource manager attempted to prepare a transaction that it has not successfully joined.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190008<br />STATUS_DIRECTORY_NOT_RM</p>
+ </td>
+ <td>
+ <p>The specified directory does not contain a file system resource manager.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019000A<br />STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE</p>
+ </td>
+ <td>
+ <p>The remote server or share does not support transacted file operations.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019000B<br />STATUS_LOG_RESIZE_INVALID_SIZE</p>
+ </td>
+ <td>
+ <p>The requested log size for the file system resource manager is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019000C<br />STATUS_REMOTE_FILE_VERSION_MISMATCH</p>
+ </td>
+ <td>
+ <p>The remote server sent mismatching version number or Fid for a file opened with transactions.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019000F<br />STATUS_CRM_PROTOCOL_ALREADY_EXISTS</p>
+ </td>
+ <td>
+ <p>The resource manager tried to register a protocol that already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190010<br />STATUS_TRANSACTION_PROPAGATION_FAILED</p>
+ </td>
+ <td>
+ <p>The attempt to propagate the transaction failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190011<br />STATUS_CRM_PROTOCOL_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The requested propagation protocol was not registered as a CRM.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190012<br />STATUS_TRANSACTION_SUPERIOR_EXISTS</p>
+ </td>
+ <td>
+ <p>The transaction object already has a superior enlistment, and the caller attempted an operation that would have created a new superior. Only a single superior enlistment is allowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190013<br />STATUS_TRANSACTION_REQUEST_NOT_VALID</p>
+ </td>
+ <td>
+ <p>The requested operation is not valid on the transaction object in its current state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190014<br />STATUS_TRANSACTION_NOT_REQUESTED</p>
+ </td>
+ <td>
+ <p>The caller has called a response API, but the response is not expected because the transaction manager did not issue the corresponding request to the caller.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190015<br />STATUS_TRANSACTION_ALREADY_ABORTED</p>
+ </td>
+ <td>
+ <p>It is too late to perform the requested operation, because the transaction has already been aborted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190016<br />STATUS_TRANSACTION_ALREADY_COMMITTED</p>
+ </td>
+ <td>
+ <p>It is too late to perform the requested operation, because the transaction has already been committed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190017<br />STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER</p>
+ </td>
+ <td>
+ <p>The buffer passed in to NtPushTransaction or NtPullTransaction is not in a valid format.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190018<br />STATUS_CURRENT_TRANSACTION_NOT_VALID</p>
+ </td>
+ <td>
+ <p>The current transaction context associated with the thread is not a valid handle to a transaction object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190019<br />STATUS_LOG_GROWTH_FAILED</p>
+ </td>
+ <td>
+ <p>An attempt to create space in the transactional resource manager's log failed. The failure status has been recorded in the event log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190021<br />STATUS_OBJECT_NO_LONGER_EXISTS</p>
+ </td>
+ <td>
+ <p>The object (file, stream, or link) that corresponds to the handle has been deleted by a transaction savepoint rollback.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190022<br />STATUS_STREAM_MINIVERSION_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified file miniversion was not found for this transacted file open.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190023<br />STATUS_STREAM_MINIVERSION_NOT_VALID</p>
+ </td>
+ <td>
+ <p>The specified file miniversion was found but has been invalidated. The most likely cause is a transaction savepoint rollback.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190024<br />STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION</p>
+ </td>
+ <td>
+ <p>A miniversion may be opened only in the context of the transaction that created it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190025<br />STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT</p>
+ </td>
+ <td>
+ <p>It is not possible to open a miniversion with modify access.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190026<br />STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS</p>
+ </td>
+ <td>
+ <p>It is not possible to create any more miniversions for this stream.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190028<br />STATUS_HANDLE_NO_LONGER_VALID</p>
+ </td>
+ <td>
+ <p>The handle has been invalidated by a transaction. The most likely cause is the presence of memory mapping on a file or an open handle when the transaction ended or rolled back to savepoint.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190030<br />STATUS_LOG_CORRUPTION_DETECTED</p>
+ </td>
+ <td>
+ <p>The log data is corrupt.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190032<br />STATUS_RM_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>The transaction outcome is unavailable because the resource manager responsible for it is disconnected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190033<br />STATUS_ENLISTMENT_NOT_SUPERIOR</p>
+ </td>
+ <td>
+ <p>The request was rejected because the enlistment in question is not a superior enlistment.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190036<br />STATUS_FILE_IDENTITY_NOT_PERSISTENT</p>
+ </td>
+ <td>
+ <p>The file cannot be opened in a transaction because its identity depends on the outcome of an unresolved transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190037<br />STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY</p>
+ </td>
+ <td>
+ <p>The operation cannot be performed because another transaction is depending on this property not changing.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190038<br />STATUS_CANT_CROSS_RM_BOUNDARY</p>
+ </td>
+ <td>
+ <p>The operation would involve a single file with two transactional resource managers and is, therefore, not allowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190039<br />STATUS_TXF_DIR_NOT_EMPTY</p>
+ </td>
+ <td>
+ <p>The $Txf directory must be empty for this operation to succeed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019003A<br />STATUS_INDOUBT_TRANSACTIONS_EXIST</p>
+ </td>
+ <td>
+ <p>The operation would leave a transactional resource manager in an inconsistent state and is therefore not allowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019003B<br />STATUS_TM_VOLATILE</p>
+ </td>
+ <td>
+ <p>The operation could not be completed because the transaction manager does not have a log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019003C<br />STATUS_ROLLBACK_TIMER_EXPIRED</p>
+ </td>
+ <td>
+ <p>A rollback could not be scheduled because a previously scheduled rollback has already executed or been queued for execution.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019003D<br />STATUS_TXF_ATTRIBUTE_CORRUPT</p>
+ </td>
+ <td>
+ <p>The transactional metadata attribute on the file or directory %hs is corrupt and unreadable.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019003E<br />STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION</p>
+ </td>
+ <td>
+ <p>The encryption operation could not be completed because a transaction is active.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019003F<br />STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>This object is not allowed to be opened in a transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190040<br />STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE</p>
+ </td>
+ <td>
+ <p>Memory mapping (creating a mapped section) a remote file under a transaction is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190043<br />STATUS_TRANSACTION_REQUIRED_PROMOTION</p>
+ </td>
+ <td>
+ <p>Promotion was required to allow the resource manager to enlist, but the transaction was set to disallow it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190044<br />STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION</p>
+ </td>
+ <td>
+ <p>This file is open for modification in an unresolved transaction and may be opened for execute only by a transacted reader.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190045<br />STATUS_TRANSACTIONS_NOT_FROZEN</p>
+ </td>
+ <td>
+ <p>The request to thaw frozen transactions was ignored because transactions were not previously frozen.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190046<br />STATUS_TRANSACTION_FREEZE_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>Transactions cannot be frozen because a freeze is already in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190047<br />STATUS_NOT_SNAPSHOT_VOLUME</p>
+ </td>
+ <td>
+ <p>The target volume is not a snapshot volume. This operation is valid only on a volume mounted as a snapshot.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190048<br />STATUS_NO_SAVEPOINT_WITH_OPEN_FILES</p>
+ </td>
+ <td>
+ <p>The savepoint operation failed because files are open on the transaction, which is not permitted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190049<br />STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION</p>
+ </td>
+ <td>
+ <p>The sparse operation could not be completed because a transaction is active on the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019004A<br />STATUS_TM_IDENTITY_MISMATCH</p>
+ </td>
+ <td>
+ <p>The call to create a transaction manager object failed because the Tm Identity that is stored in the log file does not match the Tm Identity that was passed in as an argument.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019004B<br />STATUS_FLOATED_SECTION</p>
+ </td>
+ <td>
+ <p>I/O was attempted on a section object that has been floated as a result of a transaction ending. There is no valid data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019004C<br />STATUS_CANNOT_ACCEPT_TRANSACTED_WORK</p>
+ </td>
+ <td>
+ <p>The transactional resource manager cannot currently accept transacted work due to a transient condition, such as low resources.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019004D<br />STATUS_CANNOT_ABORT_TRANSACTIONS</p>
+ </td>
+ <td>
+ <p>The transactional resource manager had too many transactions outstanding that could not be aborted. The transactional resource manager has been shut down.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019004E<br />STATUS_TRANSACTION_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified transaction was unable to be opened because it was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019004F<br />STATUS_RESOURCEMANAGER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified resource manager was unable to be opened because it was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190050<br />STATUS_ENLISTMENT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified enlistment was unable to be opened because it was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190051<br />STATUS_TRANSACTIONMANAGER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The specified transaction manager was unable to be opened because it was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190052<br />STATUS_TRANSACTIONMANAGER_NOT_ONLINE</p>
+ </td>
+ <td>
+ <p>The specified resource manager was unable to create an enlistment because its associated transaction manager is not online.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190053<br />STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION</p>
+ </td>
+ <td>
+ <p>The specified transaction manager was unable to create the objects contained in its log file in the Ob namespace. Therefore, the transaction manager was unable to recover.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190054<br />STATUS_TRANSACTION_NOT_ROOT</p>
+ </td>
+ <td>
+ <p>The call to create a superior enlistment on this transaction object could not be completed because the transaction object specified for the enlistment is a subordinate branch of the transaction. Only the root of the transaction can be enlisted as a superior.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190055<br />STATUS_TRANSACTION_OBJECT_EXPIRED</p>
+ </td>
+ <td>
+ <p>Because the associated transaction manager or resource manager has been closed, the handle is no longer valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190056<br />STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION</p>
+ </td>
+ <td>
+ <p>The compression operation could not be completed because a transaction is active on the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190057<br />STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED</p>
+ </td>
+ <td>
+ <p>The specified operation could not be performed on this superior enlistment because the enlistment was not created with the corresponding completion response in the NotificationMask.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190058<br />STATUS_TRANSACTION_RECORD_TOO_LONG</p>
+ </td>
+ <td>
+ <p>The specified operation could not be performed because the record to be logged was too long. This can occur because either there are too many enlistments on this transaction or the combined RecoveryInformation being logged on behalf of those enlistments is too long.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190059<br />STATUS_NO_LINK_TRACKING_IN_TRANSACTION</p>
+ </td>
+ <td>
+ <p>The link-tracking operation could not be completed because a transaction is active.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019005A<br />STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION</p>
+ </td>
+ <td>
+ <p>This operation cannot be performed in a transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC019005B<br />STATUS_TRANSACTION_INTEGRITY_VIOLATED</p>
+ </td>
+ <td>
+ <p>The kernel transaction manager had to abort or forget the transaction because it blocked forward progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190060<br />STATUS_EXPIRED_HANDLE</p>
+ </td>
+ <td>
+ <p>The handle is no longer properly associated with its transaction. It may have been opened in a transactional resource manager that was subsequently forced to restart. Please close the handle and open a new one.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0190061<br />STATUS_TRANSACTION_NOT_ENLISTED</p>
+ </td>
+ <td>
+ <p>The specified operation could not be performed because the resource manager is not enlisted in the transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0001<br />STATUS_LOG_SECTOR_INVALID</p>
+ </td>
+ <td>
+ <p>The log service found an invalid log sector.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0002<br />STATUS_LOG_SECTOR_PARITY_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered a log sector with invalid block parity.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0003<br />STATUS_LOG_SECTOR_REMAPPED</p>
+ </td>
+ <td>
+ <p>The log service encountered a remapped log sector.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0004<br />STATUS_LOG_BLOCK_INCOMPLETE</p>
+ </td>
+ <td>
+ <p>The log service encountered a partial or incomplete log block.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0005<br />STATUS_LOG_INVALID_RANGE</p>
+ </td>
+ <td>
+ <p>The log service encountered an attempt to access data outside the active log range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0006<br />STATUS_LOG_BLOCKS_EXHAUSTED</p>
+ </td>
+ <td>
+ <p>The log service user-log marshaling buffers are exhausted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0007<br />STATUS_LOG_READ_CONTEXT_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered an attempt to read from a marshaling area with an invalid read context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0008<br />STATUS_LOG_RESTART_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered an invalid log restart area.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0009<br />STATUS_LOG_BLOCK_VERSION</p>
+ </td>
+ <td>
+ <p>The log service encountered an invalid log block version.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A000A<br />STATUS_LOG_BLOCK_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered an invalid log block.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A000B<br />STATUS_LOG_READ_MODE_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered an attempt to read the log with an invalid read mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A000D<br />STATUS_LOG_METADATA_CORRUPT</p>
+ </td>
+ <td>
+ <p>The log service encountered a corrupted metadata file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A000E<br />STATUS_LOG_METADATA_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered a metadata file that could not be created by the log file system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A000F<br />STATUS_LOG_METADATA_INCONSISTENT</p>
+ </td>
+ <td>
+ <p>The log service encountered a metadata file with inconsistent data.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0010<br />STATUS_LOG_RESERVATION_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered an attempt to erroneously allocate or dispose reservation space.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0011<br />STATUS_LOG_CANT_DELETE</p>
+ </td>
+ <td>
+ <p>The log service cannot delete the log file or the file system container.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0012<br />STATUS_LOG_CONTAINER_LIMIT_EXCEEDED</p>
+ </td>
+ <td>
+ <p>The log service has reached the maximum allowable containers allocated to a log file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0013<br />STATUS_LOG_START_OF_LOG</p>
+ </td>
+ <td>
+ <p>The log service has attempted to read or write backward past the start of the log.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0014<br />STATUS_LOG_POLICY_ALREADY_INSTALLED</p>
+ </td>
+ <td>
+ <p>The log policy could not be installed because a policy of the same type is already present.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0015<br />STATUS_LOG_POLICY_NOT_INSTALLED</p>
+ </td>
+ <td>
+ <p>The log policy in question was not installed at the time of the request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0016<br />STATUS_LOG_POLICY_INVALID</p>
+ </td>
+ <td>
+ <p>The installed set of policies on the log is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0017<br />STATUS_LOG_POLICY_CONFLICT</p>
+ </td>
+ <td>
+ <p>A policy on the log in question prevented the operation from completing.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0018<br />STATUS_LOG_PINNED_ARCHIVE_TAIL</p>
+ </td>
+ <td>
+ <p>The log space cannot be reclaimed because the log is pinned by the archive tail.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0019<br />STATUS_LOG_RECORD_NONEXISTENT</p>
+ </td>
+ <td>
+ <p>The log record is not a record in the log file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A001A<br />STATUS_LOG_RECORDS_RESERVED_INVALID</p>
+ </td>
+ <td>
+ <p>The number of reserved log records or the adjustment of the number of reserved log records is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A001B<br />STATUS_LOG_SPACE_RESERVED_INVALID</p>
+ </td>
+ <td>
+ <p>The reserved log space or the adjustment of the log space is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A001C<br />STATUS_LOG_TAIL_INVALID</p>
+ </td>
+ <td>
+ <p>A new or existing archive tail or the base of the active log is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A001D<br />STATUS_LOG_FULL</p>
+ </td>
+ <td>
+ <p>The log space is exhausted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A001E<br />STATUS_LOG_MULTIPLEXED</p>
+ </td>
+ <td>
+ <p>The log is multiplexed; no direct writes to the physical log are allowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A001F<br />STATUS_LOG_DEDICATED</p>
+ </td>
+ <td>
+ <p>The operation failed because the log is dedicated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0020<br />STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The operation requires an archive context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0021<br />STATUS_LOG_ARCHIVE_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>Log archival is in progress.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0022<br />STATUS_LOG_EPHEMERAL</p>
+ </td>
+ <td>
+ <p>The operation requires a nonephemeral log, but the log is ephemeral.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0023<br />STATUS_LOG_NOT_ENOUGH_CONTAINERS</p>
+ </td>
+ <td>
+ <p>The log must have at least two containers before it can be read from or written to.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0024<br />STATUS_LOG_CLIENT_ALREADY_REGISTERED</p>
+ </td>
+ <td>
+ <p>A log client has already registered on the stream.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0025<br />STATUS_LOG_CLIENT_NOT_REGISTERED</p>
+ </td>
+ <td>
+ <p>A log client has not been registered on the stream.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0026<br />STATUS_LOG_FULL_HANDLER_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>A request has already been made to handle the log full condition.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0027<br />STATUS_LOG_CONTAINER_READ_FAILED</p>
+ </td>
+ <td>
+ <p>The log service encountered an error when attempting to read from a log container.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0028<br />STATUS_LOG_CONTAINER_WRITE_FAILED</p>
+ </td>
+ <td>
+ <p>The log service encountered an error when attempting to write to a log container.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0029<br />STATUS_LOG_CONTAINER_OPEN_FAILED</p>
+ </td>
+ <td>
+ <p>The log service encountered an error when attempting to open a log container.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A002A<br />STATUS_LOG_CONTAINER_STATE_INVALID</p>
+ </td>
+ <td>
+ <p>The log service encountered an invalid container state when attempting a requested action.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A002B<br />STATUS_LOG_STATE_INVALID</p>
+ </td>
+ <td>
+ <p>The log service is not in the correct state to perform a requested action.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A002C<br />STATUS_LOG_PINNED</p>
+ </td>
+ <td>
+ <p>The log space cannot be reclaimed because the log is pinned.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A002D<br />STATUS_LOG_METADATA_FLUSH_FAILED</p>
+ </td>
+ <td>
+ <p>The log metadata flush failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A002E<br />STATUS_LOG_INCONSISTENT_SECURITY</p>
+ </td>
+ <td>
+ <p>Security on the log and its containers is inconsistent.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A002F<br />STATUS_LOG_APPENDED_FLUSH_FAILED</p>
+ </td>
+ <td>
+ <p>Records were appended to the log or reservation changes were made, but the log could not be flushed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01A0030<br />STATUS_LOG_PINNED_RESERVATION</p>
+ </td>
+ <td>
+ <p>The log is pinned due to reservation consuming most of the log space. Free some reserved records to make space available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01B00EA<br />STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD</p>
+ </td>
+ <td>
+ <p>{Display Driver Stopped Responding} The %hs display driver has stopped working normally. Save your work and reboot the system to restore full display functionality. The next time you reboot the computer, a dialog box will allow you to upload data about this failure to Microsoft.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0001<br />STATUS_FLT_NO_HANDLER_DEFINED</p>
+ </td>
+ <td>
+ <p>A handler was not defined by the filter for this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0002<br />STATUS_FLT_CONTEXT_ALREADY_DEFINED</p>
+ </td>
+ <td>
+ <p>A context is already defined for this object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0003<br />STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST</p>
+ </td>
+ <td>
+ <p>Asynchronous requests are not valid for this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0004<br />STATUS_FLT_DISALLOW_FAST_IO</p>
+ </td>
+ <td>
+ <p>This is an internal error code used by the filter manager to determine if a fast I/O operation should be forced down the input/output request packet (IRP) path. Minifilters should never return this value.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0005<br />STATUS_FLT_INVALID_NAME_REQUEST</p>
+ </td>
+ <td>
+ <p>An invalid name request was made. The name requested cannot be retrieved at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0006<br />STATUS_FLT_NOT_SAFE_TO_POST_OPERATION</p>
+ </td>
+ <td>
+ <p>Posting this operation to a worker thread for further processing is not safe at this time because it could lead to a system deadlock.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0007<br />STATUS_FLT_NOT_INITIALIZED</p>
+ </td>
+ <td>
+ <p>The Filter Manager was not initialized when a filter tried to register. Make sure that the Filter Manager is loaded as a driver.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0008<br />STATUS_FLT_FILTER_NOT_READY</p>
+ </td>
+ <td>
+ <p>The filter is not ready for attachment to volumes because it has not finished initializing (FltStartFiltering has not been called).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0009<br />STATUS_FLT_POST_OPERATION_CLEANUP</p>
+ </td>
+ <td>
+ <p>The filter must clean up any operation-specific context at this time because it is being removed from the system before the operation is completed by the lower drivers.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C000A<br />STATUS_FLT_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>The Filter Manager had an internal error from which it cannot recover; therefore, the operation has failed. This is usually the result of a filter returning an invalid value from a pre-operation callback.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C000B<br />STATUS_FLT_DELETING_OBJECT</p>
+ </td>
+ <td>
+ <p>The object specified for this action is in the process of being deleted; therefore, the action requested cannot be completed at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C000C<br />STATUS_FLT_MUST_BE_NONPAGED_POOL</p>
+ </td>
+ <td>
+ <p>A nonpaged pool must be used for this type of context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C000D<br />STATUS_FLT_DUPLICATE_ENTRY</p>
+ </td>
+ <td>
+ <p>A duplicate handler definition has been provided for an operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C000E<br />STATUS_FLT_CBDQ_DISABLED</p>
+ </td>
+ <td>
+ <p>The callback data queue has been disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C000F<br />STATUS_FLT_DO_NOT_ATTACH</p>
+ </td>
+ <td>
+ <p>Do not attach the filter to the volume at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0010<br />STATUS_FLT_DO_NOT_DETACH</p>
+ </td>
+ <td>
+ <p>Do not detach the filter from the volume at this time.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0011<br />STATUS_FLT_INSTANCE_ALTITUDE_COLLISION</p>
+ </td>
+ <td>
+ <p>An instance already exists at this altitude on the volume specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0012<br />STATUS_FLT_INSTANCE_NAME_COLLISION</p>
+ </td>
+ <td>
+ <p>An instance already exists with this name on the volume specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0013<br />STATUS_FLT_FILTER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The system could not find the filter specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0014<br />STATUS_FLT_VOLUME_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The system could not find the volume specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0015<br />STATUS_FLT_INSTANCE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The system could not find the instance specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0016<br />STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>No registered context allocation definition was found for the given request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0017<br />STATUS_FLT_INVALID_CONTEXT_REGISTRATION</p>
+ </td>
+ <td>
+ <p>An invalid parameter was specified during context registration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0018<br />STATUS_FLT_NAME_CACHE_MISS</p>
+ </td>
+ <td>
+ <p>The name requested was not found in the Filter Manager name cache and could not be retrieved from the file system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0019<br />STATUS_FLT_NO_DEVICE_OBJECT</p>
+ </td>
+ <td>
+ <p>The requested device object does not exist for the given volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C001A<br />STATUS_FLT_VOLUME_ALREADY_MOUNTED</p>
+ </td>
+ <td>
+ <p>The specified volume is already mounted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C001B<br />STATUS_FLT_ALREADY_ENLISTED</p>
+ </td>
+ <td>
+ <p>The specified transaction context is already enlisted in a transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C001C<br />STATUS_FLT_CONTEXT_ALREADY_LINKED</p>
+ </td>
+ <td>
+ <p>The specified context is already attached to another object.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01C0020<br />STATUS_FLT_NO_WAITER_FOR_REPLY</p>
+ </td>
+ <td>
+ <p>No waiter is present for the filter's reply to this message.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0001<br />STATUS_MONITOR_NO_DESCRIPTOR</p>
+ </td>
+ <td>
+ <p>A monitor descriptor could not be obtained.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0002<br />STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT</p>
+ </td>
+ <td>
+ <p>This release does not support the format of the obtained monitor descriptor.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0003<br />STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM</p>
+ </td>
+ <td>
+ <p>The checksum of the obtained monitor descriptor is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0004<br />STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK</p>
+ </td>
+ <td>
+ <p>The monitor descriptor contains an invalid standard timing block.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0005<br />STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED</p>
+ </td>
+ <td>
+ <p>WMI data-block registration failed for one of the MSMonitorClass WMI subclasses.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0006<br />STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK</p>
+ </td>
+ <td>
+ <p>The provided monitor descriptor block is either corrupted or does not contain the monitor's detailed serial number.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0007<br />STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK</p>
+ </td>
+ <td>
+ <p>The provided monitor descriptor block is either corrupted or does not contain the monitor's user-friendly name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0008<br />STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA</p>
+ </td>
+ <td>
+ <p>There is no monitor descriptor data at the specified (offset or size) region.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D0009<br />STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK</p>
+ </td>
+ <td>
+ <p>The monitor descriptor contains an invalid detailed timing block.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01D000A<br />STATUS_MONITOR_INVALID_MANUFACTURE_DATE</p>
+ </td>
+ <td>
+ <p>Monitor descriptor contains invalid manufacture date.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0000<br />STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER</p>
+ </td>
+ <td>
+ <p>Exclusive mode ownership is needed to create an unmanaged primary allocation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0001<br />STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER</p>
+ </td>
+ <td>
+ <p>The driver needs more DMA buffer space to complete the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0002<br />STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER</p>
+ </td>
+ <td>
+ <p>The specified display adapter handle is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0003<br />STATUS_GRAPHICS_ADAPTER_WAS_RESET</p>
+ </td>
+ <td>
+ <p>The specified display adapter and all of its state have been reset.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0004<br />STATUS_GRAPHICS_INVALID_DRIVER_MODEL</p>
+ </td>
+ <td>
+ <p>The driver stack does not match the expected driver model.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0005<br />STATUS_GRAPHICS_PRESENT_MODE_CHANGED</p>
+ </td>
+ <td>
+ <p>Present happened but ended up into the changed desktop mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0006<br />STATUS_GRAPHICS_PRESENT_OCCLUDED</p>
+ </td>
+ <td>
+ <p>Nothing to present due to desktop occlusion.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0007<br />STATUS_GRAPHICS_PRESENT_DENIED</p>
+ </td>
+ <td>
+ <p>Not able to present due to denial of desktop access.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0008<br />STATUS_GRAPHICS_CANNOTCOLORCONVERT</p>
+ </td>
+ <td>
+ <p>Not able to present with color conversion.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E000B<br />STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED</p>
+ </td>
+ <td>
+ <p>Present redirection is disabled (desktop windowing management subsystem is off).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E000C<br />STATUS_GRAPHICS_PRESENT_UNOCCLUDED</p>
+ </td>
+ <td>
+ <p>Previous exclusive VidPn source owner has released its ownership</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0100<br />STATUS_GRAPHICS_NO_VIDEO_MEMORY</p>
+ </td>
+ <td>
+ <p>Not enough video memory is available to complete the operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0101<br />STATUS_GRAPHICS_CANT_LOCK_MEMORY</p>
+ </td>
+ <td>
+ <p>Could not probe and lock the underlying memory of an allocation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0102<br />STATUS_GRAPHICS_ALLOCATION_BUSY</p>
+ </td>
+ <td>
+ <p>The allocation is currently busy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0103<br />STATUS_GRAPHICS_TOO_MANY_REFERENCES</p>
+ </td>
+ <td>
+ <p>An object being referenced has already reached the maximum reference count and cannot be referenced further.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0104<br />STATUS_GRAPHICS_TRY_AGAIN_LATER</p>
+ </td>
+ <td>
+ <p>A problem could not be solved due to an existing condition. Try again later.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0105<br />STATUS_GRAPHICS_TRY_AGAIN_NOW</p>
+ </td>
+ <td>
+ <p>A problem could not be solved due to an existing condition. Try again now.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0106<br />STATUS_GRAPHICS_ALLOCATION_INVALID</p>
+ </td>
+ <td>
+ <p>The allocation is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0107<br />STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE</p>
+ </td>
+ <td>
+ <p>No more unswizzling apertures are currently available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0108<br />STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED</p>
+ </td>
+ <td>
+ <p>The current allocation cannot be unswizzled by an aperture.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0109<br />STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION</p>
+ </td>
+ <td>
+ <p>The request failed because a pinned allocation cannot be evicted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0110<br />STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE</p>
+ </td>
+ <td>
+ <p>The allocation cannot be used from its current segment location for the specified operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0111<br />STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION</p>
+ </td>
+ <td>
+ <p>A locked allocation cannot be used in the current command buffer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0112<br />STATUS_GRAPHICS_ALLOCATION_CLOSED</p>
+ </td>
+ <td>
+ <p>The allocation being referenced has been closed permanently.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0113<br />STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE</p>
+ </td>
+ <td>
+ <p>An invalid allocation instance is being referenced.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0114<br />STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE</p>
+ </td>
+ <td>
+ <p>An invalid allocation handle is being referenced.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0115<br />STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE</p>
+ </td>
+ <td>
+ <p>The allocation being referenced does not belong to the current device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0116<br />STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST</p>
+ </td>
+ <td>
+ <p>The specified allocation lost its content.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0200<br />STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE</p>
+ </td>
+ <td>
+ <p>A GPU exception was detected on the given device. The device cannot be scheduled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0300<br />STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The specified VidPN topology is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0301<br />STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The specified VidPN topology is valid but is not supported by this model of the display adapter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0302<br />STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The specified VidPN topology is valid but is not currently supported by the display adapter due to allocation of its resources.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0303<br />STATUS_GRAPHICS_INVALID_VIDPN</p>
+ </td>
+ <td>
+ <p>The specified VidPN handle is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0304<br />STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE</p>
+ </td>
+ <td>
+ <p>The specified video present source is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0305<br />STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET</p>
+ </td>
+ <td>
+ <p>The specified video present target is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0306<br />STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The specified VidPN modality is not supported (for example, at least two of the pinned modes are not co-functional).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0308<br />STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET</p>
+ </td>
+ <td>
+ <p>The specified VidPN source mode set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0309<br />STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET</p>
+ </td>
+ <td>
+ <p>The specified VidPN target mode set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E030A<br />STATUS_GRAPHICS_INVALID_FREQUENCY</p>
+ </td>
+ <td>
+ <p>The specified video signal frequency is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E030B<br />STATUS_GRAPHICS_INVALID_ACTIVE_REGION</p>
+ </td>
+ <td>
+ <p>The specified video signal active region is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E030C<br />STATUS_GRAPHICS_INVALID_TOTAL_REGION</p>
+ </td>
+ <td>
+ <p>The specified video signal total region is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0310<br />STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE</p>
+ </td>
+ <td>
+ <p>The specified video present source mode is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0311<br />STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE</p>
+ </td>
+ <td>
+ <p>The specified video present target mode is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0312<br />STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET</p>
+ </td>
+ <td>
+ <p>The pinned mode must remain in the set on the VidPN's co-functional modality enumeration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0313<br />STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The specified video present path is already in the VidPN's topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0314<br />STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET</p>
+ </td>
+ <td>
+ <p>The specified mode is already in the mode set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0315<br />STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET</p>
+ </td>
+ <td>
+ <p>The specified video present source set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0316<br />STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET</p>
+ </td>
+ <td>
+ <p>The specified video present target set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0317<br />STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET</p>
+ </td>
+ <td>
+ <p>The specified video present source is already in the video present source set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0318<br />STATUS_GRAPHICS_TARGET_ALREADY_IN_SET</p>
+ </td>
+ <td>
+ <p>The specified video present target is already in the video present target set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0319<br />STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH</p>
+ </td>
+ <td>
+ <p>The specified VidPN present path is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E031A<br />STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The miniport has no recommendation for augmenting the specified VidPN's topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E031B<br />STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET</p>
+ </td>
+ <td>
+ <p>The specified monitor frequency range set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E031C<br />STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE</p>
+ </td>
+ <td>
+ <p>The specified monitor frequency range is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E031D<br />STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET</p>
+ </td>
+ <td>
+ <p>The specified frequency range is not in the specified monitor frequency range set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E031F<br />STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET</p>
+ </td>
+ <td>
+ <p>The specified frequency range is already in the specified monitor frequency range set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0320<br />STATUS_GRAPHICS_STALE_MODESET</p>
+ </td>
+ <td>
+ <p>The specified mode set is stale. Reacquire the new mode set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0321<br />STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET</p>
+ </td>
+ <td>
+ <p>The specified monitor source mode set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0322<br />STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE</p>
+ </td>
+ <td>
+ <p>The specified monitor source mode is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0323<br />STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN</p>
+ </td>
+ <td>
+ <p>The miniport does not have a recommendation regarding the request to provide a functional VidPN given the current display adapter configuration.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0324<br />STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE</p>
+ </td>
+ <td>
+ <p>The ID of the specified mode is being used by another mode in the set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0325<br />STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION</p>
+ </td>
+ <td>
+ <p>The system failed to determine a mode that is supported by both the display adapter and the monitor connected to it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0326<br />STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES</p>
+ </td>
+ <td>
+ <p>The number of video present targets must be greater than or equal to the number of video present sources.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0327<br />STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The specified present path is not in the VidPN's topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0328<br />STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE</p>
+ </td>
+ <td>
+ <p>The display adapter must have at least one video present source.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0329<br />STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET</p>
+ </td>
+ <td>
+ <p>The display adapter must have at least one video present target.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E032A<br />STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET</p>
+ </td>
+ <td>
+ <p>The specified monitor descriptor set is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E032B<br />STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR</p>
+ </td>
+ <td>
+ <p>The specified monitor descriptor is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E032C<br />STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET</p>
+ </td>
+ <td>
+ <p>The specified descriptor is not in the specified monitor descriptor set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E032D<br />STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET</p>
+ </td>
+ <td>
+ <p>The specified descriptor is already in the specified monitor descriptor set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E032E<br />STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE</p>
+ </td>
+ <td>
+ <p>The ID of the specified monitor descriptor is being used by another descriptor in the set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E032F<br />STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE</p>
+ </td>
+ <td>
+ <p>The specified video present target subset type is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0330<br />STATUS_GRAPHICS_RESOURCES_NOT_RELATED</p>
+ </td>
+ <td>
+ <p>Two or more of the specified resources are not related to each other, as defined by the interface semantics.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0331<br />STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE</p>
+ </td>
+ <td>
+ <p>The ID of the specified video present source is being used by another source in the set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0332<br />STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE</p>
+ </td>
+ <td>
+ <p>The ID of the specified video present target is being used by another target in the set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0333<br />STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET</p>
+ </td>
+ <td>
+ <p>The specified VidPN source cannot be used because there is no available VidPN target to connect it to.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0334<br />STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER</p>
+ </td>
+ <td>
+ <p>The newly arrived monitor could not be associated with a display adapter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0335<br />STATUS_GRAPHICS_NO_VIDPNMGR</p>
+ </td>
+ <td>
+ <p>The particular display adapter does not have an associated VidPN manager.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0336<br />STATUS_GRAPHICS_NO_ACTIVE_VIDPN</p>
+ </td>
+ <td>
+ <p>The VidPN manager of the particular display adapter does not have an active VidPN.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0337<br />STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The specified VidPN topology is stale; obtain the new topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0338<br />STATUS_GRAPHICS_MONITOR_NOT_CONNECTED</p>
+ </td>
+ <td>
+ <p>No monitor is connected on the specified video present target.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0339<br />STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The specified source is not part of the specified VidPN's topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E033A<br />STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE</p>
+ </td>
+ <td>
+ <p>The specified primary surface size is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E033B<br />STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE</p>
+ </td>
+ <td>
+ <p>The specified visible region size is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E033C<br />STATUS_GRAPHICS_INVALID_STRIDE</p>
+ </td>
+ <td>
+ <p>The specified stride is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E033D<br />STATUS_GRAPHICS_INVALID_PIXELFORMAT</p>
+ </td>
+ <td>
+ <p>The specified pixel format is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E033E<br />STATUS_GRAPHICS_INVALID_COLORBASIS</p>
+ </td>
+ <td>
+ <p>The specified color basis is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E033F<br />STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE</p>
+ </td>
+ <td>
+ <p>The specified pixel value access mode is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0340<br />STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY</p>
+ </td>
+ <td>
+ <p>The specified target is not part of the specified VidPN's topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0341<br />STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT</p>
+ </td>
+ <td>
+ <p>Failed to acquire the display mode management interface.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0342<br />STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE</p>
+ </td>
+ <td>
+ <p>The specified VidPN source is already owned by a DMM client and cannot be used until that client releases it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0343<br />STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN</p>
+ </td>
+ <td>
+ <p>The specified VidPN is active and cannot be accessed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0344<br />STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL</p>
+ </td>
+ <td>
+ <p>The specified VidPN's present path importance ordinal is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0345<br />STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION</p>
+ </td>
+ <td>
+ <p>The specified VidPN's present path content geometry transformation is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0346<br />STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The specified content geometry transformation is not supported on the respective VidPN present path.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0347<br />STATUS_GRAPHICS_INVALID_GAMMA_RAMP</p>
+ </td>
+ <td>
+ <p>The specified gamma ramp is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0348<br />STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The specified gamma ramp is not supported on the respective VidPN present path.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0349<br />STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>Multisampling is not supported on the respective VidPN present path.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E034A<br />STATUS_GRAPHICS_MODE_NOT_IN_MODESET</p>
+ </td>
+ <td>
+ <p>The specified mode is not in the specified mode set.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E034D<br />STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON</p>
+ </td>
+ <td>
+ <p>The specified VidPN topology recommendation reason is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E034E<br />STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE</p>
+ </td>
+ <td>
+ <p>The specified VidPN present path content type is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E034F<br />STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE</p>
+ </td>
+ <td>
+ <p>The specified VidPN present path copy protection type is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0350<br />STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS</p>
+ </td>
+ <td>
+ <p>Only one unassigned mode set can exist at any one time for a particular VidPN source or target.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0352<br />STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING</p>
+ </td>
+ <td>
+ <p>The specified scan line ordering type is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0353<br />STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>The topology changes are not allowed for the specified VidPN.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0354<br />STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS</p>
+ </td>
+ <td>
+ <p>All available importance ordinals are being used in the specified topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0355<br />STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT</p>
+ </td>
+ <td>
+ <p>The specified primary surface has a different private-format attribute than the current primary surface.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0356<br />STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM</p>
+ </td>
+ <td>
+ <p>The specified mode-pruning algorithm is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0357<br />STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN</p>
+ </td>
+ <td>
+ <p>The specified monitor-capability origin is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0358<br />STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT</p>
+ </td>
+ <td>
+ <p>The specified monitor-frequency range constraint is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0359<br />STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED</p>
+ </td>
+ <td>
+ <p>The maximum supported number of present paths has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E035A<br />STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION</p>
+ </td>
+ <td>
+ <p>The miniport requested that augmentation be canceled for the specified source of the specified VidPN's topology.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E035B<br />STATUS_GRAPHICS_INVALID_CLIENT_TYPE</p>
+ </td>
+ <td>
+ <p>The specified client type was not recognized.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E035C<br />STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET</p>
+ </td>
+ <td>
+ <p>The client VidPN is not set on this adapter (for example, no user mode-initiated mode changes have taken place on this adapter).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0400<br />STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED</p>
+ </td>
+ <td>
+ <p>The specified display adapter child device already has an external device connected to it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0401<br />STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The display adapter child device does not support reporting a descriptor.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0430<br />STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER</p>
+ </td>
+ <td>
+ <p>The display adapter is not linked to any other adapters.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0431<br />STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED</p>
+ </td>
+ <td>
+ <p>The lead adapter in a linked configuration was not enumerated yet.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0432<br />STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED</p>
+ </td>
+ <td>
+ <p>Some chain adapters in a linked configuration have not yet been enumerated.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0433<br />STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY</p>
+ </td>
+ <td>
+ <p>The chain of linked adapters is not ready to start because of an unknown failure.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0434<br />STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED</p>
+ </td>
+ <td>
+ <p>An attempt was made to start a lead link display adapter when the chain links had not yet started.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0435<br />STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON</p>
+ </td>
+ <td>
+ <p>An attempt was made to turn on a lead link display adapter when the chain links were turned off.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0436<br />STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE</p>
+ </td>
+ <td>
+ <p>The adapter link was found in an inconsistent state. Not all adapters are in an expected PNP/power state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0438<br />STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER</p>
+ </td>
+ <td>
+ <p>The driver trying to start is not the same as the driver for the posted display adapter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E043B<br />STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED</p>
+ </td>
+ <td>
+ <p>An operation is being attempted that requires the display adapter to be in a quiescent state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0500<br />STATUS_GRAPHICS_OPM_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The driver does not support OPM.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0501<br />STATUS_GRAPHICS_COPP_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The driver does not support COPP.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0502<br />STATUS_GRAPHICS_UAB_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The driver does not support UAB.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0503<br />STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS</p>
+ </td>
+ <td>
+ <p>The specified encrypted parameters are invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0504<br />STATUS_GRAPHICS_OPM_PARAMETER_ARRAY_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>An array passed to a function cannot hold all of the data that the function wants to put in it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0505<br />STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST</p>
+ </td>
+ <td>
+ <p>The GDI display device passed to this function does not have any active protected outputs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0506<br />STATUS_GRAPHICS_PVP_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME</p>
+ </td>
+ <td>
+ <p>The PVP cannot find an actual GDI display device that corresponds to the passed-in GDI display device name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0507<br />STATUS_GRAPHICS_PVP_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP</p>
+ </td>
+ <td>
+ <p>This function failed because the GDI display device passed to it was not attached to the Windows desktop.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0508<br />STATUS_GRAPHICS_PVP_MIRRORING_DEVICES_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The PVP does not support mirroring display devices because they do not have any protected outputs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E050A<br />STATUS_GRAPHICS_OPM_INVALID_POINTER</p>
+ </td>
+ <td>
+ <p>The function failed because an invalid pointer parameter was passed to it. A pointer parameter is invalid if it is null, is not correctly aligned, or it points to an invalid address or a kernel mode address.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E050B<br />STATUS_GRAPHICS_OPM_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An internal error caused an operation to fail.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E050C<br />STATUS_GRAPHICS_OPM_INVALID_HANDLE</p>
+ </td>
+ <td>
+ <p>The function failed because the caller passed in an invalid OPM user-mode handle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E050D<br />STATUS_GRAPHICS_PVP_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE</p>
+ </td>
+ <td>
+ <p>This function failed because the GDI device passed to it did not have any monitors associated with it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E050E<br />STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH</p>
+ </td>
+ <td>
+ <p>A certificate could not be returned because the certificate buffer passed to the function was too small.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E050F<br />STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED</p>
+ </td>
+ <td>
+ <p>DxgkDdiOpmCreateProtectedOutput() could not create a protected output because the video present yarget is in spanning mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0510<br />STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED</p>
+ </td>
+ <td>
+ <p>DxgkDdiOpmCreateProtectedOutput() could not create a protected output because the video present target is in theater mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0511<br />STATUS_GRAPHICS_PVP_HFS_FAILED</p>
+ </td>
+ <td>
+ <p>The function call failed because the display adapter's hardware functionality scan (HFS) failed to validate the graphics hardware.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0512<br />STATUS_GRAPHICS_OPM_INVALID_SRM</p>
+ </td>
+ <td>
+ <p>The HDCP SRM passed to this function did not comply with section 5 of the HDCP 1.1 specification.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0513<br />STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP</p>
+ </td>
+ <td>
+ <p>The protected output cannot enable the HDCP system because it does not support it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0514<br />STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP</p>
+ </td>
+ <td>
+ <p>The protected output cannot enable analog copy protection because it does not support it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0515<br />STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA</p>
+ </td>
+ <td>
+ <p>The protected output cannot enable the CGMS-A protection technology because it does not support it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0516<br />STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET</p>
+ </td>
+ <td>
+ <p>DxgkDdiOPMGetInformation() cannot return the version of the SRM being used because the application never successfully passed an SRM to the protected output.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0517<br />STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH</p>
+ </td>
+ <td>
+ <p>DxgkDdiOPMConfigureProtectedOutput() cannot enable the specified output protection technology because the output's screen resolution is too high.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0518<br />STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE</p>
+ </td>
+ <td>
+ <p>DxgkDdiOPMConfigureProtectedOutput() cannot enable HDCP because other physical outputs are using the display adapter's HDCP hardware.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E051A<br />STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS</p>
+ </td>
+ <td>
+ <p>The operating system asynchronously destroyed this OPM-protected output because the operating system state changed. This error typically occurs because the monitor PDO associated with this protected output was removed or stopped, the protected output's session became a nonconsole session, or the protected output's desktop became inactive.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E051B<br />STATUS_GRAPHICS_OPM_SESSION_TYPE_CHANGE_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>OPM functions cannot be called when a session is changing its type. Three types of sessions currently exist: console, disconnected, and remote (RDP or ICA).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E051C<br />STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS</p>
+ </td>
+ <td>
+ <p>The DxgkDdiOPMGetCOPPCompatibleInformation, DxgkDdiOPMGetInformation, or DxgkDdiOPMConfigureProtectedOutput function failed. This error is returned only if a protected output has OPM semantics. </p>
+ <p>DxgkDdiOPMGetCOPPCompatibleInformation always returns this error if a protected output has OPM semantics.</p>
+ <p>DxgkDdiOPMGetInformation returns this error code if the caller requested COPP-specific information.</p>
+ <p>DxgkDdiOPMConfigureProtectedOutput returns this error when the caller tries to use a COPP-specific command.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E051D<br />STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST</p>
+ </td>
+ <td>
+ <p>The DxgkDdiOPMGetInformation and DxgkDdiOPMGetCOPPCompatibleInformation functions return this error code if the passed-in sequence number is not the expected sequence number or the passed-in OMAC value is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E051E<br />STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>The function failed because an unexpected error occurred inside a display driver.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E051F<br />STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS</p>
+ </td>
+ <td>
+ <p>The DxgkDdiOPMGetCOPPCompatibleInformation, DxgkDdiOPMGetInformation, or DxgkDdiOPMConfigureProtectedOutput function failed. This error is returned only if a protected output has COPP semantics. </p>
+ <p>DxgkDdiOPMGetCOPPCompatibleInformation returns this error code if the caller requested OPM-specific information.</p>
+ <p>DxgkDdiOPMGetInformation always returns this error if a protected output has COPP semantics.</p>
+ <p>DxgkDdiOPMConfigureProtectedOutput returns this error when the caller tries to use an OPM-specific command.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0520<br />STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The DxgkDdiOPMGetCOPPCompatibleInformation and DxgkDdiOPMConfigureProtectedOutput functions return this error if the display driver does not support the DXGKMDT_OPM_GET_ACP_AND_CGMSA_SIGNALING and DXGKMDT_OPM_SET_ACP_AND_CGMSA_SIGNALING GUIDs.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0521<br />STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST</p>
+ </td>
+ <td>
+ <p>The DxgkDdiOPMConfigureProtectedOutput function returns this error code if the passed-in sequence number is not the expected sequence number or the passed-in OMAC value is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0580<br />STATUS_GRAPHICS_I2C_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The monitor connected to the specified video output does not have an I2C bus.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0581<br />STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST</p>
+ </td>
+ <td>
+ <p>No device on the I2C bus has the specified address.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0582<br />STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA</p>
+ </td>
+ <td>
+ <p>An error occurred while transmitting data to the device on the I2C bus.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0583<br />STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA</p>
+ </td>
+ <td>
+ <p>An error occurred while receiving data from the device on the I2C bus.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0584<br />STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The monitor does not support the specified VCP code.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0585<br />STATUS_GRAPHICS_DDCCI_INVALID_DATA</p>
+ </td>
+ <td>
+ <p>The data received from the monitor is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0586<br />STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE</p>
+ </td>
+ <td>
+ <p>A function call failed because a monitor returned an invalid timing status byte when the operating system used the DDC/CI get timing report and timing message command to get a timing report from a monitor.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0587<br />STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING</p>
+ </td>
+ <td>
+ <p>A monitor returned a DDC/CI capabilities string that did not comply with the ACCESS.bus 3.0, DDC/CI 1.1, or MCCS 2 Revision 1 specification.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0588<br />STATUS_GRAPHICS_MCA_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An internal error caused an operation to fail.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E0589<br />STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND</p>
+ </td>
+ <td>
+ <p>An operation failed because a DDC/CI message had an invalid value in its command field.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E058A<br />STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH</p>
+ </td>
+ <td>
+ <p>This error occurred because a DDC/CI message had an invalid value in its length field.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E058B<br />STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM</p>
+ </td>
+ <td>
+ <p>This error occurred because the value in a DDC/CI message's checksum field did not match the message's computed checksum value. This error implies that the data was corrupted while it was being transmitted from a monitor to a computer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E058C<br />STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE</p>
+ </td>
+ <td>
+ <p>This function failed because an invalid monitor handle was passed to it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E058D<br />STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS</p>
+ </td>
+ <td>
+ <p>The operating system asynchronously destroyed the monitor that corresponds to this handle because the operating system's state changed. This error typically occurs because the monitor PDO associated with this handle was removed or stopped, or a display mode change occurred. A display mode change occurs when Windows sends a WM_DISPLAYCHANGE message to applications.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E0<br />STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED</p>
+ </td>
+ <td>
+ <p>This function can be used only if a program is running in the local console session. It cannot be used if a program is running on a remote desktop session or on a terminal server session.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E1<br />STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME</p>
+ </td>
+ <td>
+ <p>This function cannot find an actual GDI display device that corresponds to the specified GDI display device name.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E2<br />STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP</p>
+ </td>
+ <td>
+ <p>The function failed because the specified GDI display device was not attached to the Windows desktop.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E3<br />STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>This function does not support GDI mirroring display devices because GDI mirroring display devices do not have any physical monitors associated with them.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E4<br />STATUS_GRAPHICS_INVALID_POINTER</p>
+ </td>
+ <td>
+ <p>The function failed because an invalid pointer parameter was passed to it. A pointer parameter is invalid if it is null, is not correctly aligned, or points to an invalid address or to a kernel mode address.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E5<br />STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE</p>
+ </td>
+ <td>
+ <p>This function failed because the GDI device passed to it did not have a monitor associated with it.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E6<br />STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>An array passed to the function cannot hold all of the data that the function must copy into the array.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E7<br />STATUS_GRAPHICS_INTERNAL_ERROR</p>
+ </td>
+ <td>
+ <p>An internal error caused an operation to fail.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC01E05E8<br />STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The function failed because the current session is changing its type. This function cannot be called when the current session is changing its type. Three types of sessions currently exist: console, disconnected, and remote (RDP or ICA).</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210000<br />STATUS_FVE_LOCKED_VOLUME</p>
+ </td>
+ <td>
+ <p>The volume must be unlocked before it can be used.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210001<br />STATUS_FVE_NOT_ENCRYPTED</p>
+ </td>
+ <td>
+ <p>The volume is fully decrypted and no key is available.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210002<br />STATUS_FVE_BAD_INFORMATION</p>
+ </td>
+ <td>
+ <p>The control block for the encrypted volume is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210003<br />STATUS_FVE_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>Not enough free space remains on the volume to allow encryption.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210004<br />STATUS_FVE_FAILED_WRONG_FS</p>
+ </td>
+ <td>
+ <p>The partition cannot be encrypted because the file system is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210005<br />STATUS_FVE_FAILED_BAD_FS</p>
+ </td>
+ <td>
+ <p>The file system is inconsistent. Run the Check Disk utility.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210006<br />STATUS_FVE_FS_NOT_EXTENDED</p>
+ </td>
+ <td>
+ <p>The file system does not extend to the end of the volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210007<br />STATUS_FVE_FS_MOUNTED</p>
+ </td>
+ <td>
+ <p>This operation cannot be performed while a file system is mounted on the volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210008<br />STATUS_FVE_NO_LICENSE</p>
+ </td>
+ <td>
+ <p>BitLocker Drive Encryption is not included with this version of Windows.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210009<br />STATUS_FVE_ACTION_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>The requested action was denied by the FVE control engine.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021000A<br />STATUS_FVE_BAD_DATA</p>
+ </td>
+ <td>
+ <p>The data supplied is malformed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021000B<br />STATUS_FVE_VOLUME_NOT_BOUND</p>
+ </td>
+ <td>
+ <p>The volume is not bound to the system.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021000C<br />STATUS_FVE_NOT_DATA_VOLUME</p>
+ </td>
+ <td>
+ <p>The volume specified is not a data volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021000D<br />STATUS_FVE_CONV_READ_ERROR</p>
+ </td>
+ <td>
+ <p>A read operation failed while converting the volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021000E<br />STATUS_FVE_CONV_WRITE_ERROR</p>
+ </td>
+ <td>
+ <p>A write operation failed while converting the volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021000F<br />STATUS_FVE_OVERLAPPED_UPDATE</p>
+ </td>
+ <td>
+ <p>The control block for the encrypted volume was updated by another thread. Try again.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210010<br />STATUS_FVE_FAILED_SECTOR_SIZE</p>
+ </td>
+ <td>
+ <p>The volume encryption algorithm cannot be used on this sector size.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210011<br />STATUS_FVE_FAILED_AUTHENTICATION</p>
+ </td>
+ <td>
+ <p>BitLocker recovery authentication failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210012<br />STATUS_FVE_NOT_OS_VOLUME</p>
+ </td>
+ <td>
+ <p>The volume specified is not the boot operating system volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210013<br />STATUS_FVE_KEYFILE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The BitLocker startup key or recovery password could not be read from external media.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210014<br />STATUS_FVE_KEYFILE_INVALID</p>
+ </td>
+ <td>
+ <p>The BitLocker startup key or recovery password file is corrupt or invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210015<br />STATUS_FVE_KEYFILE_NO_VMK</p>
+ </td>
+ <td>
+ <p>The BitLocker encryption key could not be obtained from the startup key or the recovery password.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210016<br />STATUS_FVE_TPM_DISABLED</p>
+ </td>
+ <td>
+ <p>The TPM is disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210017<br />STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO</p>
+ </td>
+ <td>
+ <p>The authorization data for the SRK of the TPM is not zero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210018<br />STATUS_FVE_TPM_INVALID_PCR</p>
+ </td>
+ <td>
+ <p>The system boot information changed or the TPM locked out access to BitLocker encryption keys until the computer is restarted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210019<br />STATUS_FVE_TPM_NO_VMK</p>
+ </td>
+ <td>
+ <p>The BitLocker encryption key could not be obtained from the TPM.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021001A<br />STATUS_FVE_PIN_INVALID</p>
+ </td>
+ <td>
+ <p>The BitLocker encryption key could not be obtained from the TPM and PIN.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021001B<br />STATUS_FVE_AUTH_INVALID_APPLICATION</p>
+ </td>
+ <td>
+ <p>A boot application hash does not match the hash computed when BitLocker was turned on.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021001C<br />STATUS_FVE_AUTH_INVALID_CONFIG</p>
+ </td>
+ <td>
+ <p>The Boot Configuration Data (BCD) settings are not supported or have changed because BitLocker was enabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021001D<br />STATUS_FVE_DEBUGGER_ENABLED</p>
+ </td>
+ <td>
+ <p>Boot debugging is enabled. Run Windows Boot Configuration Data Store Editor (bcdedit.exe) to turn it off.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021001E<br />STATUS_FVE_DRY_RUN_FAILED</p>
+ </td>
+ <td>
+ <p>The BitLocker encryption key could not be obtained.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC021001F<br />STATUS_FVE_BAD_METADATA_POINTER</p>
+ </td>
+ <td>
+ <p>The metadata disk region pointer is incorrect.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210020<br />STATUS_FVE_OLD_METADATA_COPY</p>
+ </td>
+ <td>
+ <p>The backup copy of the metadata is out of date.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210021<br />STATUS_FVE_REBOOT_REQUIRED</p>
+ </td>
+ <td>
+ <p>No action was taken because a system restart is required.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210022<br />STATUS_FVE_RAW_ACCESS</p>
+ </td>
+ <td>
+ <p>No action was taken because BitLocker Drive Encryption is in RAW access mode.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210023<br />STATUS_FVE_RAW_BLOCKED</p>
+ </td>
+ <td>
+ <p>BitLocker Drive Encryption cannot enter RAW access mode for this volume.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210026<br />STATUS_FVE_NO_FEATURE_LICENSE</p>
+ </td>
+ <td>
+ <p>This feature of BitLocker Drive Encryption is not included with this version of Windows.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210027<br />STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>Group policy does not permit turning off BitLocker Drive Encryption on roaming data volumes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210028<br />STATUS_FVE_CONV_RECOVERY_FAILED</p>
+ </td>
+ <td>
+ <p>Bitlocker Drive Encryption failed to recover from aborted conversion. This could be due to either all conversion logs being corrupted or the media being write-protected.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210029<br />STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG</p>
+ </td>
+ <td>
+ <p>The requested virtualization size is too big.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0210030<br />STATUS_FVE_VOLUME_TOO_SMALL</p>
+ </td>
+ <td>
+ <p>The drive is too small to be protected using BitLocker Drive Encryption.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220001<br />STATUS_FWP_CALLOUT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The callout does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220002<br />STATUS_FWP_CONDITION_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The filter condition does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220003<br />STATUS_FWP_FILTER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The filter does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220004<br />STATUS_FWP_LAYER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The layer does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220005<br />STATUS_FWP_PROVIDER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The provider does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220006<br />STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The provider context does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220007<br />STATUS_FWP_SUBLAYER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The sublayer does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220008<br />STATUS_FWP_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The object does not exist.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220009<br />STATUS_FWP_ALREADY_EXISTS</p>
+ </td>
+ <td>
+ <p>An object with that GUID or LUID already exists.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022000A<br />STATUS_FWP_IN_USE</p>
+ </td>
+ <td>
+ <p>The object is referenced by other objects and cannot be deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022000B<br />STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The call is not allowed from within a dynamic session.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022000C<br />STATUS_FWP_WRONG_SESSION</p>
+ </td>
+ <td>
+ <p>The call was made from the wrong session and cannot be completed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022000D<br />STATUS_FWP_NO_TXN_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The call must be made from within an explicit transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022000E<br />STATUS_FWP_TXN_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The call is not allowed from within an explicit transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022000F<br />STATUS_FWP_TXN_ABORTED</p>
+ </td>
+ <td>
+ <p>The explicit transaction has been forcibly canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220010<br />STATUS_FWP_SESSION_ABORTED</p>
+ </td>
+ <td>
+ <p>The session has been canceled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220011<br />STATUS_FWP_INCOMPATIBLE_TXN</p>
+ </td>
+ <td>
+ <p>The call is not allowed from within a read-only transaction.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220012<br />STATUS_FWP_TIMEOUT</p>
+ </td>
+ <td>
+ <p>The call timed out while waiting to acquire the transaction lock.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220013<br />STATUS_FWP_NET_EVENTS_DISABLED</p>
+ </td>
+ <td>
+ <p>The collection of network diagnostic events is disabled.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220014<br />STATUS_FWP_INCOMPATIBLE_LAYER</p>
+ </td>
+ <td>
+ <p>The operation is not supported by the specified layer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220015<br />STATUS_FWP_KM_CLIENTS_ONLY</p>
+ </td>
+ <td>
+ <p>The call is allowed for kernel-mode callers only.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220016<br />STATUS_FWP_LIFETIME_MISMATCH</p>
+ </td>
+ <td>
+ <p>The call tried to associate two objects with incompatible lifetimes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220017<br />STATUS_FWP_BUILTIN_OBJECT</p>
+ </td>
+ <td>
+ <p>The object is built-in and cannot be deleted.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220018<br />STATUS_FWP_TOO_MANY_BOOTTIME_FILTERS</p>
+ </td>
+ <td>
+ <p>The maximum number of boot-time filters has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220018<br />STATUS_FWP_TOO_MANY_CALLOUTS</p>
+ </td>
+ <td>
+ <p>The maximum number of callouts has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220019<br />STATUS_FWP_NOTIFICATION_DROPPED</p>
+ </td>
+ <td>
+ <p>A notification could not be delivered because a message queue has reached maximum capacity.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022001A<br />STATUS_FWP_TRAFFIC_MISMATCH</p>
+ </td>
+ <td>
+ <p>The traffic parameters do not match those for the security association context.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022001B<br />STATUS_FWP_INCOMPATIBLE_SA_STATE</p>
+ </td>
+ <td>
+ <p>The call is not allowed for the current security association state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022001C<br />STATUS_FWP_NULL_POINTER</p>
+ </td>
+ <td>
+ <p>A required pointer is null.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022001D<br />STATUS_FWP_INVALID_ENUMERATOR</p>
+ </td>
+ <td>
+ <p>An enumerator is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022001E<br />STATUS_FWP_INVALID_FLAGS</p>
+ </td>
+ <td>
+ <p>The flags field contains an invalid value.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022001F<br />STATUS_FWP_INVALID_NET_MASK</p>
+ </td>
+ <td>
+ <p>A network mask is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220020<br />STATUS_FWP_INVALID_RANGE</p>
+ </td>
+ <td>
+ <p>An FWP_RANGE is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220021<br />STATUS_FWP_INVALID_INTERVAL</p>
+ </td>
+ <td>
+ <p>The time interval is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220022<br />STATUS_FWP_ZERO_LENGTH_ARRAY</p>
+ </td>
+ <td>
+ <p>An array that must contain at least one element has a zero length.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220023<br />STATUS_FWP_NULL_DISPLAY_NAME</p>
+ </td>
+ <td>
+ <p>The displayData.name field cannot be null.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220024<br />STATUS_FWP_INVALID_ACTION_TYPE</p>
+ </td>
+ <td>
+ <p>The action type is not one of the allowed action types for a filter.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220025<br />STATUS_FWP_INVALID_WEIGHT</p>
+ </td>
+ <td>
+ <p>The filter weight is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220026<br />STATUS_FWP_MATCH_TYPE_MISMATCH</p>
+ </td>
+ <td>
+ <p>A filter condition contains a match type that is not compatible with the operands.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220027<br />STATUS_FWP_TYPE_MISMATCH</p>
+ </td>
+ <td>
+ <p>An FWP_VALUE or FWPM_CONDITION_VALUE is of the wrong type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220028<br />STATUS_FWP_OUT_OF_BOUNDS</p>
+ </td>
+ <td>
+ <p>An integer value is outside the allowed range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220029<br />STATUS_FWP_RESERVED</p>
+ </td>
+ <td>
+ <p>A reserved field is nonzero.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022002A<br />STATUS_FWP_DUPLICATE_CONDITION</p>
+ </td>
+ <td>
+ <p>A filter cannot contain multiple conditions operating on a single field.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022002B<br />STATUS_FWP_DUPLICATE_KEYMOD</p>
+ </td>
+ <td>
+ <p>A policy cannot contain the same keying module more than once.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022002C<br />STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER</p>
+ </td>
+ <td>
+ <p>The action type is not compatible with the layer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022002D<br />STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER</p>
+ </td>
+ <td>
+ <p>The action type is not compatible with the sublayer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022002E<br />STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER</p>
+ </td>
+ <td>
+ <p>The raw context or the provider context is not compatible with the layer.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022002F<br />STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT</p>
+ </td>
+ <td>
+ <p>The raw context or the provider context is not compatible with the callout.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220030<br />STATUS_FWP_INCOMPATIBLE_AUTH_METHOD</p>
+ </td>
+ <td>
+ <p>The authentication method is not compatible with the policy type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220031<br />STATUS_FWP_INCOMPATIBLE_DH_GROUP</p>
+ </td>
+ <td>
+ <p>The Diffie-Hellman group is not compatible with the policy type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220032<br />STATUS_FWP_EM_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>An IKE policy cannot contain an Extended Mode policy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220033<br />STATUS_FWP_NEVER_MATCH</p>
+ </td>
+ <td>
+ <p>The enumeration template or subscription will never match any objects.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220034<br />STATUS_FWP_PROVIDER_CONTEXT_MISMATCH</p>
+ </td>
+ <td>
+ <p>The provider context is of the wrong type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220035<br />STATUS_FWP_INVALID_PARAMETER</p>
+ </td>
+ <td>
+ <p>The parameter is incorrect.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220036<br />STATUS_FWP_TOO_MANY_SUBLAYERS</p>
+ </td>
+ <td>
+ <p>The maximum number of sublayers has been reached.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220037<br />STATUS_FWP_CALLOUT_NOTIFICATION_FAILED</p>
+ </td>
+ <td>
+ <p>The notification function for a callout returned an error.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220038<br />STATUS_FWP_INCOMPATIBLE_AUTH_CONFIG</p>
+ </td>
+ <td>
+ <p>The IPsec authentication configuration is not compatible with the authentication type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220039<br />STATUS_FWP_INCOMPATIBLE_CIPHER_CONFIG</p>
+ </td>
+ <td>
+ <p>The IPsec cipher configuration is not compatible with the cipher type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC022003C<br />STATUS_FWP_DUPLICATE_AUTH_METHOD</p>
+ </td>
+ <td>
+ <p>A policy cannot contain the same auth method more than once.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220100<br />STATUS_FWP_TCPIP_NOT_READY</p>
+ </td>
+ <td>
+ <p>The TCP/IP stack is not ready.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220101<br />STATUS_FWP_INJECT_HANDLE_CLOSING</p>
+ </td>
+ <td>
+ <p>The injection handle is being closed by another thread.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220102<br />STATUS_FWP_INJECT_HANDLE_STALE</p>
+ </td>
+ <td>
+ <p>The injection handle is stale.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0220103<br />STATUS_FWP_CANNOT_PEND</p>
+ </td>
+ <td>
+ <p>The classify cannot be pended.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230002<br />STATUS_NDIS_CLOSING</p>
+ </td>
+ <td>
+ <p>The binding to the network interface is being closed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230004<br />STATUS_NDIS_BAD_VERSION</p>
+ </td>
+ <td>
+ <p>An invalid version was specified.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230005<br />STATUS_NDIS_BAD_CHARACTERISTICS</p>
+ </td>
+ <td>
+ <p>An invalid characteristics table was used.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230006<br />STATUS_NDIS_ADAPTER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>Failed to find the network interface or the network interface is not ready.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230007<br />STATUS_NDIS_OPEN_FAILED</p>
+ </td>
+ <td>
+ <p>Failed to open the network interface.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230008<br />STATUS_NDIS_DEVICE_FAILED</p>
+ </td>
+ <td>
+ <p>The network interface has encountered an internal unrecoverable failure.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230009<br />STATUS_NDIS_MULTICAST_FULL</p>
+ </td>
+ <td>
+ <p>The multicast list on the network interface is full.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023000A<br />STATUS_NDIS_MULTICAST_EXISTS</p>
+ </td>
+ <td>
+ <p>An attempt was made to add a duplicate multicast address to the list.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023000B<br />STATUS_NDIS_MULTICAST_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>At attempt was made to remove a multicast address that was never added.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023000C<br />STATUS_NDIS_REQUEST_ABORTED</p>
+ </td>
+ <td>
+ <p>The network interface aborted the request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023000D<br />STATUS_NDIS_RESET_IN_PROGRESS</p>
+ </td>
+ <td>
+ <p>The network interface cannot process the request because it is being reset.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023000F<br />STATUS_NDIS_INVALID_PACKET</p>
+ </td>
+ <td>
+ <p>An attempt was made to send an invalid packet on a network interface.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230010<br />STATUS_NDIS_INVALID_DEVICE_REQUEST</p>
+ </td>
+ <td>
+ <p>The specified request is not a valid operation for the target device.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230011<br />STATUS_NDIS_ADAPTER_NOT_READY</p>
+ </td>
+ <td>
+ <p>The network interface is not ready to complete this operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230014<br />STATUS_NDIS_INVALID_LENGTH</p>
+ </td>
+ <td>
+ <p>The length of the buffer submitted for this operation is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230015<br />STATUS_NDIS_INVALID_DATA</p>
+ </td>
+ <td>
+ <p>The data used for this operation is not valid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230016<br />STATUS_NDIS_BUFFER_TOO_SHORT</p>
+ </td>
+ <td>
+ <p>The length of the submitted buffer for this operation is too small.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230017<br />STATUS_NDIS_INVALID_OID</p>
+ </td>
+ <td>
+ <p>The network interface does not support this object identifier.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230018<br />STATUS_NDIS_ADAPTER_REMOVED</p>
+ </td>
+ <td>
+ <p>The network interface has been removed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230019<br />STATUS_NDIS_UNSUPPORTED_MEDIA</p>
+ </td>
+ <td>
+ <p>The network interface does not support this media type.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023001A<br />STATUS_NDIS_GROUP_ADDRESS_IN_USE</p>
+ </td>
+ <td>
+ <p>An attempt was made to remove a token ring group address that is in use by other components.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023001B<br />STATUS_NDIS_FILE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>An attempt was made to map a file that cannot be found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023001C<br />STATUS_NDIS_ERROR_READING_FILE</p>
+ </td>
+ <td>
+ <p>An error occurred while NDIS tried to map the file.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023001D<br />STATUS_NDIS_ALREADY_MAPPED</p>
+ </td>
+ <td>
+ <p>An attempt was made to map a file that is already mapped.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023001E<br />STATUS_NDIS_RESOURCE_CONFLICT</p>
+ </td>
+ <td>
+ <p>An attempt to allocate a hardware resource failed because the resource is used by another component.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023001F<br />STATUS_NDIS_MEDIA_DISCONNECTED</p>
+ </td>
+ <td>
+ <p>The I/O operation failed because the network media is disconnected or the wireless access point is out of range.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0230022<br />STATUS_NDIS_INVALID_ADDRESS</p>
+ </td>
+ <td>
+ <p>The network address used in the request is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023002A<br />STATUS_NDIS_PAUSED</p>
+ </td>
+ <td>
+ <p>The offload operation on the network interface has been paused.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023002B<br />STATUS_NDIS_INTERFACE_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>The network interface was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023002C<br />STATUS_NDIS_UNSUPPORTED_REVISION</p>
+ </td>
+ <td>
+ <p>The revision number specified in the structure is not supported.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023002D<br />STATUS_NDIS_INVALID_PORT</p>
+ </td>
+ <td>
+ <p>The specified port does not exist on this network interface.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023002E<br />STATUS_NDIS_INVALID_PORT_STATE</p>
+ </td>
+ <td>
+ <p>The current state of the specified port on this network interface does not support the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023002F<br />STATUS_NDIS_LOW_POWER_STATE</p>
+ </td>
+ <td>
+ <p>The miniport adapter is in a lower power state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC02300BB<br />STATUS_NDIS_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The network interface does not support this request.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC023100F<br />STATUS_NDIS_OFFLOAD_POLICY</p>
+ </td>
+ <td>
+ <p>The TCP connection is not offloadable because of a local policy setting.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0231012<br />STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED</p>
+ </td>
+ <td>
+ <p>The TCP connection is not offloadable by the Chimney offload target.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0231013<br />STATUS_NDIS_OFFLOAD_PATH_REJECTED</p>
+ </td>
+ <td>
+ <p>The IP Path object is not in an offloadable state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0232000<br />STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED</p>
+ </td>
+ <td>
+ <p>The wireless LAN interface is in auto-configuration mode and does not support the requested parameter change operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0232001<br />STATUS_NDIS_DOT11_MEDIA_IN_USE</p>
+ </td>
+ <td>
+ <p>The wireless LAN interface is busy and cannot perform the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0232002<br />STATUS_NDIS_DOT11_POWER_STATE_INVALID</p>
+ </td>
+ <td>
+ <p>The wireless LAN interface is power down and does not support the requested operation.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0232003<br />STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL</p>
+ </td>
+ <td>
+ <p>The list of wake on LAN patterns is full.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0232004<br />STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL</p>
+ </td>
+ <td>
+ <p>The list of low power protocol offloads is full.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360001<br />STATUS_IPSEC_BAD_SPI</p>
+ </td>
+ <td>
+ <p>The SPI in the packet does not match a valid IPsec SA.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360002<br />STATUS_IPSEC_SA_LIFETIME_EXPIRED</p>
+ </td>
+ <td>
+ <p>The packet was received on an IPsec SA whose lifetime has expired.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360003<br />STATUS_IPSEC_WRONG_SA</p>
+ </td>
+ <td>
+ <p>The packet was received on an IPsec SA that does not match the packet characteristics.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360004<br />STATUS_IPSEC_REPLAY_CHECK_FAILED</p>
+ </td>
+ <td>
+ <p>The packet sequence number replay check failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360005<br />STATUS_IPSEC_INVALID_PACKET</p>
+ </td>
+ <td>
+ <p>The IPsec header and/or trailer in the packet is invalid.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360006<br />STATUS_IPSEC_INTEGRITY_CHECK_FAILED</p>
+ </td>
+ <td>
+ <p>The IPsec integrity check failed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360007<br />STATUS_IPSEC_CLEAR_TEXT_DROP</p>
+ </td>
+ <td>
+ <p>IPsec dropped a clear text packet.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360008<br />STATUS_IPSEC_AUTH_FIREWALL_DROP</p>
+ </td>
+ <td>
+ <p>IPsec dropped an incoming ESP packet in authenticated firewall mode. This drop is benign.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0360009<br />STATUS_IPSEC_THROTTLE_DROP</p>
+ </td>
+ <td>
+ <p>IPsec dropped a packet due to DOS throttle.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368000<br />STATUS_IPSEC_DOSP_BLOCK</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection matched an explicit block rule.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368001<br />STATUS_IPSEC_DOSP_RECEIVED_MULTICAST</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection received an IPsec specific multicast packet which is not allowed.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368002<br />STATUS_IPSEC_DOSP_INVALID_PACKET</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection received an incorrectly formatted packet.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368003<br />STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection failed to lookup state.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368004<br />STATUS_IPSEC_DOSP_MAX_ENTRIES</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection failed to create state because there are already maximum number of entries allowed by policy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368005<br />STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection received an IPsec negotiation packet for a keying module which is not allowed by policy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC0368006<br />STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES</p>
+ </td>
+ <td>
+ <p>IPsec Dos Protection failed to create per internal IP ratelimit queue because there is already maximum number of queues allowed by policy.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC038005B<br />STATUS_VOLMGR_MIRROR_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The system does not support mirrored volumes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC038005C<br />STATUS_VOLMGR_RAID5_NOT_SUPPORTED</p>
+ </td>
+ <td>
+ <p>The system does not support RAID-5 volumes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC03A0014<br />STATUS_VIRTDISK_PROVIDER_NOT_FOUND</p>
+ </td>
+ <td>
+ <p>A virtual disk support provider for the specified file was not found.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC03A0015<br />STATUS_VIRTDISK_NOT_VIRTUAL_DISK</p>
+ </td>
+ <td>
+ <p>The specified disk is not a virtual disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC03A0016<br />STATUS_VHD_PARENT_VHD_ACCESS_DENIED</p>
+ </td>
+ <td>
+ <p>The chain of virtual hard disks is inaccessible. The process has not been granted access rights to the parent virtual hard disk for the differencing disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC03A0017<br />STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH</p>
+ </td>
+ <td>
+ <p>The chain of virtual hard disks is corrupted. There is a mismatch in the virtual sizes of the parent virtual hard disk and differencing disk.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC03A0018<br />STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED</p>
+ </td>
+ <td>
+ <p>The chain of virtual hard disks is corrupted. A differencing disk is indicated in its own parent chain.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>0xC03A0019<br />STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT</p>
+ </td>
+ <td>
+ <p>The chain of virtual hard disks is inaccessible. There was an error opening a virtual hard disk further up the chain.</p>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <span> </span>
+ </div>
+</div></div>
+
+
+
+
+
+
+
+<div class="libraryMemberFilter">
+ <div class="filterContainer">
+ <span>Show:</span>
+ <label>
+ <input type="checkbox" class="libraryFilterInherited" checked="checked" value="Inherit" />Inherited
+ </label>
+ <label>
+ <input type="checkbox" class="libraryFilterProtected" checked="checked" value="Protected" />Protected
+ </label>
+ </div>
+</div>
+
+<input type="hidden" id="libraryMemberFilterEmptyWarning" value="There are no members available with your current filter settings." />
+
+
+
+</div>
+
+
+ </div>
+ <div class="clear"></div>
+
+
+
+<input name="__RequestVerificationToken" type="hidden" value="wGkz0ACBeuAsZdP3iMh04vMoBmlhc2Sv6VqrWB_gjkEMkf3Vqztlinc6uiRNsq1MqCNPOYaEufHnzmmurJqWmbAuSg01" />
+<input id="ratingSubmitUrl" type="hidden" value="https://msdn.microsoft.com/en-us/library/feedback/add/cc704588.aspx" />
+<input id="isTopicRated" type="hidden" value="false" />
+
+
+
+
+
+
+
+ <link type="text/css" rel="stylesheet" />
+
+ <div id="ux-footer" class="" style="" dir="ltr">
+
+ <div id="footerSock" class="librarySock both">
+ <div id="footerSockInner">
+ <a name="feedback"></a>
+
+<div class="rating">
+ <div id="ratingSection1">
+ <div class="title">
+ Was this page helpful?
+ </div>
+ <div class="description">
+ Your feedback about this content is important.<br />Let us know what you think.
+ </div>
+ <div class="buttons">
+ <button class="button" id="ratingYes">Yes</button>
+ <button class="button" id="ratingNo">No</button>
+ </div>
+ <input id="ratingValue" type="hidden" value="" />
+ </div>
+ <div id="ratingSection2">
+ <div class="title">
+ Additional feedback?
+ </div>
+ <textarea id="ratingText" rows="6" cols="" maxlength="1500"></textarea>
+ <div class="counter right">
+ <span id="feedbackTextCounter">1500</span> characters remaining
+ </div>
+ <div class="buttons left">
+ <button class="button" id="ratingSubmit">Submit</button>
+ <button class="button" id="ratingSkipThis">Skip this</button>
+ </div>
+ </div>
+ <div id="ratingSection3">
+ <div class="title">
+ Thank you!
+ </div>
+ <div class="description">
+ We appreciate your feedback.
+ </div>
+ </div>
+
+
+ <div id="contentFeedbackQAContainer" style="display: none;"></div>
+</div>
+
+ <div class="userVoice">
+ <div class="title">
+ Have a suggestion to improve MSDN Library?
+ </div>
+ <div class="description">
+ Visit our UserVoice Page to submit and vote on ideas!
+ </div>
+ <div class="buttons">
+ <a class="button" id="userVoiceButton" href="http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/category/83975" target="_blank">Make a suggestion</a>
+ </div>
+</div>
+ <div class="clear"></div>
+ </div>
+ </div>
+
+ <footer class="top">
+ <div data-fragmentName="LeftLinks" id="Fragment_LeftLinks" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <div class="linkListTitle">Dev centers</div>
+ <ul class="links">
+ <li>
+ <a href="https://dev.windows.com" id="LeftLinks_2148_1" class="windowsBlue" xmlns="http://www.w3.org/1999/xhtml">Windows</a>
+ </li>
+ <li>
+ <a href="http://dev.office.com" id="LeftLinks_2148_3" class="office" xmlns="http://www.w3.org/1999/xhtml">Office</a>
+ </li>
+ <li>
+ <a href="https://msdn.microsoft.com/vstudio" id="LeftLinks_2148_4" class="visualStudio" xmlns="http://www.w3.org/1999/xhtml">Visual Studio</a>
+ </li>
+ <li>
+ <a href="http://developer.nokia.com/" title="Nokia" id="LeftLinks_2148_15" class="nokia" xmlns="http://www.w3.org/1999/xhtml">Nokia</a>
+ </li>
+ <li>
+ <a href="http://azure.microsoft.com/en-us/documentation/" target="_blank" id="LeftLinks_2148_12" xmlns="http://www.w3.org/1999/xhtml">Microsoft Azure</a>
+ </li>
+ <li>
+ <a href="https://msdn.microsoft.com/aa937802" id="LeftLinks_2148_5" xmlns="http://www.w3.org/1999/xhtml">More...</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ <div id="rightLinks">
+ <div data-fragmentName="CenterLinks1" id="Fragment_CenterLinks1" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <div class="linkListTitle">Learning resources</div>
+ <ul class="links">
+ <li>
+ <a href="http://www.microsoftvirtualacademy.com/" id="CenterLinks1_2151_4" xmlns="http://www.w3.org/1999/xhtml">Microsoft Virtual Academy</a>
+ </li>
+ <li>
+ <a href="http://channel9.msdn.com/" id="CenterLinks1_2151_5" xmlns="http://www.w3.org/1999/xhtml">Channel 9</a>
+ </li>
+ <li>
+ <a href="http://www.interoperabilitybridges.com/" id="CenterLinks1_2151_6" xmlns="http://www.w3.org/1999/xhtml">Interoperability Bridges</a>
+ </li>
+ <li>
+ <a href="https://msdn.microsoft.com/magazine/" id="CenterLinks1_2151_7" xmlns="http://www.w3.org/1999/xhtml">MSDN Magazine</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ <div data-fragmentName="CenterLinks2" id="Fragment_CenterLinks2" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <div class="linkListTitle">Community</div>
+ <ul class="links">
+ <li>
+ <a href="https://social.msdn.microsoft.com/forums/en-us/home" id="CenterLinks2_2151_8" xmlns="http://www.w3.org/1999/xhtml">Forums</a>
+ </li>
+ <li>
+ <a href="http://blogs.msdn.com/b/developer-tools/" id="CenterLinks2_2151_9" xmlns="http://www.w3.org/1999/xhtml">Blogs</a>
+ </li>
+ <li>
+ <a href="http://www.codeplex.com" id="CenterLinks2_2151_10" xmlns="http://www.w3.org/1999/xhtml">Codeplex</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ <div data-fragmentName="CenterLinks3" id="Fragment_CenterLinks3" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <div class="linkListTitle">Support</div>
+ <ul class="links">
+ <li>
+ <a href="https://msdn.microsoft.com/hh361695" id="CenterLinks3_2151_11" xmlns="http://www.w3.org/1999/xhtml">Self support</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ <div data-fragmentName="CenterLinks4" id="Fragment_CenterLinks4" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <div class="linkListTitle">Programs</div>
+ <ul class="links">
+ <li>
+ <a href="https://www.microsoft.com/bizspark/" id="CenterLinks4_2151_13" xmlns="http://www.w3.org/1999/xhtml">BizSpark (for startups)</a>
+ </li>
+ <li>
+ <a href="https://www.dreamspark.com/" id="CenterLinks4_2151_14" xmlns="http://www.w3.org/1999/xhtml">DreamSpark</a>
+ </li>
+ <li>
+ <a href="http://www.imaginecup.com" id="CenterLinks4_2151_17" xmlns="http://www.w3.org/1999/xhtml">Imagine Cup</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ </div>
+ </footer>
+
+ <footer class="bottom">
+ <span class="localeContainer">
+
+ <form class="selectLocale" id="selectLocaleForm" action="https://msdn.microsoft.com/en-us/selectlocale-dmc">
+ <input type="hidden" name="fromPage" value="https%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fcc704588.aspx" />
+ <a href="#" onclick="$('#selectLocaleForm').submit();return false;" title="Change your language">United States (English)</a>
+ </form>
+
+
+ </span>
+
+ <div data-fragmentName="BottomLinks" id="Fragment_BottomLinks" xmlns="http://www.w3.org/1999/xhtml">
+
+ <div class="linkList">
+ <ul class="links horizontal">
+ <li>
+ <a href="https://msdn.microsoft.com/newsletter.aspx" id="BottomLinks_2148_7" xmlns="http://www.w3.org/1999/xhtml">Newsletter</a>
+ </li>
+ <li>
+ <a href="https://msdn.microsoft.com/dn529288" id="BottomLinks_2148_8" xmlns="http://www.w3.org/1999/xhtml">Privacy &amp; cookies</a>
+ </li>
+ <li>
+ <a href="https://msdn.microsoft.com/cc300389" id="BottomLinks_2148_9" xmlns="http://www.w3.org/1999/xhtml">Terms of use</a>
+ </li>
+ <li>
+ <a href="https://www.microsoft.com/en-us/legal/intellectualproperty/Trademarks/EN-US.aspx" id="BottomLinks_2148_10" xmlns="http://www.w3.org/1999/xhtml">Trademarks</a>
+ </li>
+ </ul>
+ </div>
+</div>
+ <span class="logoLegal">
+ <span class="logo"></span>
+ <span class="copyright">© 2015 Microsoft</span>
+ </span>
+ </footer>
+ </div>
+
+
+
+ <div class="footerPrintView">
+ <div class="footerCopyrightPrintView">© 2015 Microsoft</div>
+ </div>
+
+
+
+
+
+ <input id="tocPaddingPerLevel" type="hidden" value="17" />
+
+
+
+ <input id="MtpsDevice" type="hidden" value="Robot" />
+
+
+<![CDATA[ Third party scripts and code linked to or referenced from this website are licensed to you by the parties that own such code, not by Microsoft. See ASP.NET Ajax CDN Terms of Use – http://www.asp.net/ajaxlibrary/CDN.ashx. ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+<noscript><div><img alt="DCSIMG" id="Img1" width="1" height="1" src="https://m.webtrends.com/dcsmgru7m99k7mqmgrhudo0k8_8c6m/njs.gif?dcsuri=/nojavascript&amp;WT.js=No" /></div></noscript>
+
+
+
+
+
+
+
+
+
+<noscript>
+ <a href="http://www.omniture.com" title="Web Analytics">
+ <img src="//msstonojsmsdn.112.2o7.net/b/ss/msstonojsmsdn/1/H.20.2--NS/0" height="1" width="1" border="0" alt="" />
+ </a>
+</noscript>
+
+
+
+
+
+<div id="globalRequestVerification">
+ <input name="__RequestVerificationToken" type="hidden" value="nyJz1znhZGUF0XsIYht__FJ2k5KGP3POkpBgNnjn6QU7q-li0D7cf7QZIttQ_V0CaWLpPYXbX2IvB6szPDIUyGqkvVY1" />
+</div>
+
+
+ </div>
+
+
+
+
+
+ <script type="text/javascript" class="mtps-injected">
+/*<![CDATA[*/
+(function(window,document){"use strict";function preload(scripts){for(var result=[],script,e,i=0;i<scripts.length;i++)script=scripts[i],script.hasOwnProperty("url")&&(e=document.createElement("script"),e.src=script.url,script.throwaway=e),result.push(script);return result}function inject(scripts,index){var script,elem;if(index>=scripts.length){delete mtps.injectScripts;return}script=scripts[index];elem=document.createElement("script");elem.className="mtps-injected";elem.async=!1;var isLoaded=!1,timeoutId=0,injectNextFnName="",injectNext=elem.onerror=function(){isLoaded||(isLoaded=!0,inject(scripts,index+1),window.clearTimeout(timeoutId),elem.onload=elem.onerror=elem.onreadystatechange=null,injectNextFnName&&delete mtps[injectNextFnName],elem.removeEventListener&&elem.removeEventListener("load",injectNext,!1))};elem.addEventListener?elem.addEventListener("load",injectNext,!1):elem.readyState==="uninitialized"?elem.onreadystatechange=function(){(this.readyState==="loaded"||this.readyState==="complete")&&injectNext()}:elem.onload=injectNext;script.hasOwnProperty("url")?(timeoutId=window.setTimeout(injectNext,12e4),elem.src=script.url):(injectNextFnName="_injectNextScript_"+index,mtps[injectNextFnName]=injectNext,timeoutId=window.setTimeout(injectNext,2e3),elem.text="try {\n"+script.txt+"\n} finally { MTPS."+injectNextFnName+" && MTPS."+injectNextFnName+"(); }");parent.appendChild(elem)}var mtps=window.MTPS||(window.MTPS={}),parent=document.getElementsByTagName("head")[0];mtps.injectScripts=function(scripts){inject(preload(scripts),0)}})(window,document);
+MTPS.injectScripts([
+ { txt: "/**/\r\n(window.MTPS || (window.MTPS = {})).cdnDomains || (window.MTPS.cdnDomains = { \r\n\t\"image\": \"https://i-msdn.sec.s-msft.com\", \r\n\t\"js\": \"https://i2-msdn.sec.s-msft.com\", \r\n\t\"css\": \"https://i-msdn.sec.s-msft.com\", \r\n\t\"xap\": \"https://i-vso.sec.s-msft.com\"\r\n});\r\n/**/" },
+ { url: "https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js" },
+ { txt: "//\n var literalNormalizedUrl = \u0027/en-us/library/cc704588(l=en-us,v=prot.20).aspx\u0027;\n var wt_nvr_ru = \u0027WT_NVR_RU\u0027;\n var wt_fpcdom = \u0027.microsoft.com\u0027;\n var wt_domlist = \u0027msdn.microsoft.com\u0027;\n var wt_pathlist = \u0027\u0027;\n var wt_paramlist = \u0027DCSext.mtps_devcenter\u0027;\n var wt_siteid = \u0027MSDN\u0027;\n var gDomain = \u0027m.webtrends.com\u0027;\n var gDcsId = \u0027dcsmgru7m99k7mqmgrhudo0k8_8c6m\u0027;\n var gFpc = \u0027WT_FPC\u0027;\n\n\n\n if (document.cookie.indexOf(gFpc + \"=\") == -1) {\n var wtidJs = document.createElement(\"script\");\n wtidJs.src = \"//\" + gDomain + \"/\" + gDcsId + \"/wtid.js\";\n document.getElementsByTagName(\"head\")[0].appendChild(wtidJs);\n }\n\n\n\n var detectedLocale = \u0027en-us\u0027;\n var wtsp = \u0027msdnlib_doj\u0027;\n var gTrackEvents = \u00270\u0027;\n/**/" },
+ { txt: "/**/\n var omni_guid = \"297dc630-8066-40e0-ab61-b4ff48aa007c\";\n/**/" },
+ { txt: "//\n\n window.appInsightsId = \u002760854590-027a-4ae4-98be-2741a40f355f\u0027;\n //" },
+ { url: "https://i2-msdn.sec.s-msft.com/Combined.js?resources=0:Utilities,1:Layout,2:Header,1:Rating,2:Footer,0:Topic,3:webtrendsscript,4:omni_rsid_MSDN,5:WEDCS,0:AppInsightsPerf,6:Toc,1:SearchBox;/Areas/Epx/Content/Scripts:0,/Areas/Epx/Themes/Base/Content:1,/Areas/Centers/Themes/StandardDevCenter/Content:2,/Areas/Global/Content/Webtrends/resources:3,/Areas/Global/Content/Omniture/resources/MSDN:4,/Areas/Library/Themes/Base/Content:5,/Areas/Library/Content:6\u0026amp;hashKey=FB961264348D584F46A0D35B285D2793\u0026amp;v=B824EC950EFE6A8B72B4760A16A865F4" },
+ { url: "https://i1.services.social.microsoft.com/search/Widgets/SearchBox.jss?boxid=HeaderSearchTextBox\u0026btnid=HeaderSearchButton\u0026brand=Msdn\u0026loc=en-us\u0026focusOnInit=false\u0026emptyWatermark=true\u0026searchButtonTooltip=Search MSDN" },
+ { url: "https://i2-msdn.sec.s-msft.com/Combined.js?resources=0:PrintExportButton,1:NavigationResize,1:LibraryMemberFilter,2:Toc_Fixed,2:CodeSnippet,2:TopicNotInScope,2:CollapsibleArea,2:VersionSelector,2:SurveyBroker;/Areas/Library/Themes/Base/Content:0,/Areas/Library/Content:1,/Areas/Epx/Content/Scripts:2\u0026amp;hashKey=3248804C2DE1E642F8B20C4F83DBEA3B\u0026amp;v=B824EC950EFE6A8B72B4760A16A865F4" },
+ { txt: "$(document).ready(function() {\n try {\n var token = $(\"#globalRequestVerification input[name=\u0027__RequestVerificationToken\u0027]\").clone();\n $(\"#siteFeedbackForm\").append(token);\n } catch(err) {\n \n }\n });" }
+]);
+
+/*]]>*/
+</script></body>
+</html> \ No newline at end of file
diff --git a/indra/doxygen/CMakeLists.txt b/indra/doxygen/CMakeLists.txt
new file mode 100755
index 0000000000..84188bd32f
--- /dev/null
+++ b/indra/doxygen/CMakeLists.txt
@@ -0,0 +1,28 @@
+# -*- cmake -*-
+
+# cmake_minimum_required should appear before any
+# other commands to guarantee full compatibility
+# with the version specified
+## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly
+cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
+
+set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
+ "The root project/makefile/solution name. Defaults to SecondLife.")
+project(${ROOT_PROJECT_NAME})
+
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+
+include(Variables)
+
+# add a target to generate API documentation with Doxygen
+find_package(Doxygen)
+if(DOXYGEN_FOUND)
+ GET_FILENAME_COMPONENT(DOXYGEN_TOP_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. PATH)
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
+ add_custom_target(doc
+ ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/..
+ COMMENT "Generating API documentation with Doxygen" VERBATIM
+ )
+endif(DOXYGEN_FOUND)
+
diff --git a/indra/doxygen/Doxyfile.in b/indra/doxygen/Doxyfile.in
new file mode 100644
index 0000000000..5c600debdf
--- /dev/null
+++ b/indra/doxygen/Doxyfile.in
@@ -0,0 +1,1557 @@
+# Doxyfile 1.6.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "@VIEWER_CHANNEL@"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VIEWER_SHORT_VERSION@.@VIEWER_VERSION_REVISION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH = @DOXYGEN_TOP_SRC_DIR@
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses.
+# With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this tag.
+# The format is ext=language, where ext is a file extension, and language is one of
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = YES
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 2
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = NO
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = NO
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = NO
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# of the layout file.
+
+LAYOUT_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE = @CMAKE_CURRENT_BINARY_DIR@/doxygen_warnings.log
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../indra
+## TODO We would like to also have the includes from @CMAKE_CURRENT_BINARY_DIR@/packages/include
+## but at present that is too expensive. Ideally, we will modify each package build to do
+## generation of doxygen docs, and install them in a modular way that we can connect. See TAGS
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = */test/* */tests/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/../../doc
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX = LL
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+## TODO?
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = com.lindenlab.SecondLifeViewer
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = com.lindenlab.SecondLifeViewer
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = com.lindenlab.SecondLifeViewer
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows full text search. The disadvances is that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+## TODO - ideally, all packages imported by autoubuild would come with doxygen documentation
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+#PERL_PATH = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 100
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 3
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = YES
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 1459b9ada2..5863310162 100755
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -37,6 +37,7 @@ set(llcommon_SOURCE_FILES
llbase32.cpp
llbase64.cpp
llbitpack.cpp
+ llcallbacklist.cpp
llcommon.cpp
llcommonutils.cpp
llcoros.cpp
@@ -129,6 +130,7 @@ set(llcommon_HEADER_FILES
llbase64.h
llbitpack.h
llboost.h
+ llcallbacklist.h
llcommon.h
llcommonutils.h
llcoros.h
diff --git a/indra/llcommon/llcallbacklist.cpp b/indra/llcommon/llcallbacklist.cpp
new file mode 100644
index 0000000000..541ff75ee4
--- /dev/null
+++ b/indra/llcommon/llcallbacklist.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file llcallbacklist.cpp
+ * @brief A simple list of callback functions to call.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llcallbacklist.h"
+#include "lleventtimer.h"
+#include "llerrorlegacy.h"
+
+// Globals
+//
+LLCallbackList gIdleCallbacks;
+
+//
+// Member functions
+//
+
+LLCallbackList::LLCallbackList()
+{
+ // nothing
+}
+
+LLCallbackList::~LLCallbackList()
+{
+}
+
+
+void LLCallbackList::addFunction( callback_t func, void *data)
+{
+ if (!func)
+ {
+ return;
+ }
+
+ // only add one callback per func/data pair
+ //
+ if (containsFunction(func))
+ {
+ return;
+ }
+
+ callback_pair_t t(func, data);
+ mCallbackList.push_back(t);
+}
+
+bool LLCallbackList::containsFunction( callback_t func, void *data)
+{
+ callback_pair_t t(func, data);
+ callback_list_t::iterator iter = find(func,data);
+ if (iter != mCallbackList.end())
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+
+bool LLCallbackList::deleteFunction( callback_t func, void *data)
+{
+ callback_list_t::iterator iter = find(func,data);
+ if (iter != mCallbackList.end())
+ {
+ mCallbackList.erase(iter);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+inline
+LLCallbackList::callback_list_t::iterator
+LLCallbackList::find(callback_t func, void *data)
+{
+ callback_pair_t t(func, data);
+ return std::find(mCallbackList.begin(), mCallbackList.end(), t);
+}
+
+void LLCallbackList::deleteAllFunctions()
+{
+ mCallbackList.clear();
+}
+
+
+void LLCallbackList::callFunctions()
+{
+ for (callback_list_t::iterator iter = mCallbackList.begin(); iter != mCallbackList.end(); )
+ {
+ callback_list_t::iterator curiter = iter++;
+ curiter->first(curiter->second);
+ }
+}
+
+// Shim class to allow arbitrary boost::bind
+// expressions to be run as one-time idle callbacks.
+class OnIdleCallbackOneTime
+{
+public:
+ OnIdleCallbackOneTime(nullary_func_t callable):
+ mCallable(callable)
+ {
+ }
+ static void onIdle(void *data)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
+ self->call();
+ delete self;
+ }
+ void call()
+ {
+ mCallable();
+ }
+private:
+ nullary_func_t mCallable;
+};
+
+void doOnIdleOneTime(nullary_func_t callable)
+{
+ OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
+}
+
+// Shim class to allow generic boost functions to be run as
+// recurring idle callbacks. Callable should return true when done,
+// false to continue getting called.
+class OnIdleCallbackRepeating
+{
+public:
+ OnIdleCallbackRepeating(bool_func_t callable):
+ mCallable(callable)
+ {
+ }
+ // Will keep getting called until the callable returns true.
+ static void onIdle(void *data)
+ {
+ OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
+ bool done = self->call();
+ if (done)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ delete self;
+ }
+ }
+ bool call()
+ {
+ return mCallable();
+ }
+private:
+ bool_func_t mCallable;
+};
+
+void doOnIdleRepeating(bool_func_t callable)
+{
+ OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
+}
+
+class NullaryFuncEventTimer: public LLEventTimer
+{
+public:
+ NullaryFuncEventTimer(nullary_func_t callable, F32 seconds):
+ LLEventTimer(seconds),
+ mCallable(callable)
+ {
+ }
+
+private:
+ BOOL tick()
+ {
+ mCallable();
+ return TRUE;
+ }
+
+ nullary_func_t mCallable;
+};
+
+// Call a given callable once after specified interval.
+void doAfterInterval(nullary_func_t callable, F32 seconds)
+{
+ new NullaryFuncEventTimer(callable, seconds);
+}
+
+class BoolFuncEventTimer: public LLEventTimer
+{
+public:
+ BoolFuncEventTimer(bool_func_t callable, F32 seconds):
+ LLEventTimer(seconds),
+ mCallable(callable)
+ {
+ }
+private:
+ BOOL tick()
+ {
+ return mCallable();
+ }
+
+ bool_func_t mCallable;
+};
+
+// Call a given callable every specified number of seconds, until it returns true.
+void doPeriodically(bool_func_t callable, F32 seconds)
+{
+ new BoolFuncEventTimer(callable, seconds);
+}
diff --git a/indra/newview/llcallbacklist.h b/indra/llcommon/llcallbacklist.h
index 0516c9cdb4..89716cd74c 100755..100644
--- a/indra/newview/llcallbacklist.h
+++ b/indra/llcommon/llcallbacklist.h
@@ -28,27 +28,34 @@
#define LL_LLCALLBACKLIST_H
#include "llstl.h"
+#include <boost/function.hpp>
+#include <list>
class LLCallbackList
{
public:
typedef void (*callback_t)(void*);
+
+ typedef std::pair< callback_t,void* > callback_pair_t;
+ // NOTE: It is confirmed that we DEPEND on the order provided by using a list :(
+ //
+ typedef std::list< callback_pair_t > callback_list_t;
LLCallbackList();
~LLCallbackList();
- void addFunction( callback_t func, void *data = NULL ); // register a callback, which will be called as func(data)
- BOOL containsFunction( callback_t func, void *data = NULL ); // true if list already contains the function/data pair
- BOOL deleteFunction( callback_t func, void *data = NULL ); // removes the first instance of this function/data pair from the list, false if not found
- void callFunctions(); // calls all functions
+ void addFunction( callback_t func, void *data = NULL ); // register a callback, which will be called as func(data)
+ bool containsFunction( callback_t func, void *data = NULL ); // true if list already contains the function/data pair
+ bool deleteFunction( callback_t func, void *data = NULL ); // removes the first instance of this function/data pair from the list, false if not found
+ void callFunctions(); // calls all functions
void deleteAllFunctions();
static void test();
protected:
- // Use a list so that the callbacks are ordered in case that matters
- typedef std::pair<callback_t,void*> callback_pair_t;
- typedef std::list<callback_pair_t > callback_list_t;
+
+ inline callback_list_t::iterator find(callback_t func, void *data);
+
callback_list_t mCallbackList;
};
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index c4c9cc0566..d3a9bbc4ae 100755
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -28,6 +28,7 @@
#include "linden_common.h"
#include "llunits.h"
+#include "stdtypes.h"
#if !LL_WINDOWS
#include <stdint.h>
#endif
@@ -59,7 +60,7 @@ class LLMutex ;
LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment);
#ifdef SHOW_ASSERT
-#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(reinterpret_cast<uintptr_t>(ptr),((U32)alignment))
+#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(uintptr_t(ptr),((U32)alignment))
#else
#define ll_assert_aligned(ptr,alignment)
#endif
@@ -69,13 +70,13 @@ LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment);
template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address)
{
return reinterpret_cast<T*>(
- (reinterpret_cast<uintptr_t>(address) + 0xF) & ~0xF);
+ (uintptr_t(address) + 0xF) & ~0xF);
}
template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)
{
return reinterpret_cast<T*>(
- (reinterpret_cast<uintptr_t>(address) + 0x3F) & ~0x3F);
+ (uintptr_t(address) + 0x3F) & ~0x3F);
}
#if LL_LINUX || LL_DARWIN
diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h
index 3659a319a2..ea535cee86 100644
--- a/indra/llcommon/llmutex.h
+++ b/indra/llcommon/llmutex.h
@@ -33,6 +33,10 @@
#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
+#if MUTEX_DEBUG
+#include <map>
+#endif
+
struct apr_thread_mutex_t;
struct apr_pool_t;
struct apr_thread_cond_t;
diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h
index 02f10fa2ba..0435cb8a08 100755
--- a/indra/llcommon/llstl.h
+++ b/indra/llcommon/llstl.h
@@ -27,6 +27,7 @@
#ifndef LL_LLSTL_H
#define LL_LLSTL_H
+#include "stdtypes.h"
#include <functional>
#include <algorithm>
#include <map>
@@ -272,6 +273,7 @@ inline T get_if_there(const std::map<K,T>& inmap, const K& key, T default_value)
}
};
+// Useful for replacing the removeObj() functionality of LLDynamicArray
// Example:
// for (std::vector<T>::iterator iter = mList.begin(); iter != mList.end(); )
// {
@@ -530,7 +532,7 @@ bool before(const std::type_info* lhs, const std::type_info* rhs)
return strcmp(lhs->name(), rhs->name()) < 0;
#else // not Linux, or gcc 4.4+
// Just use before(), as we normally would
- return lhs->before(*rhs);
+ return lhs->before(*rhs) ? true : false;
#endif
}
diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt
index a0b1ea13b1..9631e960c5 100755
--- a/indra/llcorehttp/CMakeLists.txt
+++ b/indra/llcorehttp/CMakeLists.txt
@@ -134,9 +134,13 @@ if (LL_TESTS)
${BOOST_THREAD_LIBRARY}
)
+ # If http_proxy is in the current environment (e.g. to fetch s3-proxy
+ # autobuild packages), suppress it for this integration test: it screws up
+ # the tests.
LL_ADD_INTEGRATION_TEST(llcorehttp
"${llcorehttp_TEST_SOURCE_FILES}"
"${test_libs}"
+ "-Dhttp_proxy"
${PYTHON_EXECUTABLE}
"${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llcorehttp_peer.py"
)
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index c2198b91a7..4703e6cf1a 100755
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -6072,7 +6072,7 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
if (new_verts > mNumAllocatedVertices)
{
- //double buffer size on expansion
+ // double buffer size on expansion
new_verts *= 2;
S32 new_tc_size = ((new_verts*8)+0xF) & ~0xF;
@@ -6088,18 +6088,21 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
mNormals = mPositions+new_verts;
mTexCoords = (LLVector2*) (mNormals+new_verts);
- //positions
- LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) old_buf, old_vsize);
-
- //normals
- LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) (old_buf+mNumVertices), old_vsize);
+ if (old_buf != NULL)
+ {
+ // copy old positions into new buffer
+ LLVector4a::memcpyNonAliased16((F32*)mPositions, (F32*)old_buf, old_vsize);
- //tex coords
- LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) (old_buf+mNumVertices*2), old_tc_size);
+ // normals
+ LLVector4a::memcpyNonAliased16((F32*)mNormals, (F32*)(old_buf + mNumVertices), old_vsize);
- //just clear tangents
- ll_aligned_free_16(mTangents);
- mTangents = NULL;
+ // tex coords
+ LLVector4a::memcpyNonAliased16((F32*)mTexCoords, (F32*)(old_buf + mNumVertices * 2), old_tc_size);
+ }
+
+ // just clear tangents
+ ll_aligned_free_16(mTangents);
+ mTangents = NULL;
ll_aligned_free<64>(old_buf);
mNumAllocatedVertices = new_verts;
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index c8476f6897..625f7cff02 100755
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -968,6 +968,7 @@ protected:
~LLVolume(); // use unref
public:
+ typedef std::vector<LLVolumeFace> face_list_t;
struct FaceParams
{
@@ -1041,6 +1042,10 @@ public:
// conversion if *(LLVolume*) to LLVolume&
const LLVolumeFace &getVolumeFace(const S32 f) const {return mVolumeFaces[f];} // DO NOT DELETE VOLUME WHILE USING THIS REFERENCE, OR HOLD A POINTER TO THIS VOLUMEFACE
+ LLVolumeFace &getVolumeFace(const S32 f) {return mVolumeFaces[f];} // DO NOT DELETE VOLUME WHILE USING THIS REFERENCE, OR HOLD A POINTER TO THIS VOLUMEFACE
+
+ face_list_t& getVolumeFaces() { return mVolumeFaces; }
+
U32 mFaceMask; // bit array of which faces exist in this volume
LLVector3 mLODScaleBias; // vector for biasing LOD based on scale
@@ -1080,7 +1085,6 @@ public:
BOOL mGenerateSingleFace;
- typedef std::vector<LLVolumeFace> face_list_t;
face_list_t mVolumeFaces;
public:
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index 6a1b4143cf..d89c482804 100755
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -274,6 +274,19 @@ const LLMatrix4& LLMatrix4::invert(void)
return *this;
}
+// Convenience func for simplifying comparison-heavy code by
+// intentionally stomping values in [-FLT_EPS,FLT_EPS] to 0.0f
+//
+void LLMatrix4::condition(void)
+{
+ U32 i;
+ U32 j;
+ for (i = 0; i < 3;i++)
+ for (j = 0; j < 3;j++)
+ mMatrix[i][j] = ((mMatrix[i][j] > -FLT_EPSILON)
+ && (mMatrix[i][j] < FLT_EPSILON)) ? 0.0f : mMatrix[i][j];
+}
+
LLVector4 LLMatrix4::getFwdRow4() const
{
return LLVector4(mMatrix[VX][VX], mMatrix[VX][VY], mMatrix[VX][VZ], mMatrix[VX][VW]);
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index a7dce10397..a77c5bc76d 100755
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -180,6 +180,11 @@ public:
const LLMatrix4& setTranslation(const LLVector4 &translation);
const LLMatrix4& setTranslation(const LLVector3 &translation);
+ // Convenience func for simplifying comparison-heavy code by
+ // intentionally stomping values [-FLT_EPS,FLT_EPS] to 0.0
+ //
+ void condition(void);
+
///////////////////////////
//
// Get properties of a matrix
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index d1475cf734..75ce624a58 100755
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -8,6 +8,7 @@ include(LLMath)
include(LLMessage)
include(LLXML)
include(LLPhysicsExtensions)
+include(LLCharacter)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@@ -16,6 +17,7 @@ include_directories(
${LLXML_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada
${LIBS_PREBUILT_DIR}/include/collada/1.4
+ ${LLCHARACTER_INCLUDE_DIRS}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
@@ -24,11 +26,13 @@ include_directories(SYSTEM
)
set(llprimitive_SOURCE_FILES
+ lldaeloader.cpp
llmaterialid.cpp
llmaterial.cpp
llmaterialtable.cpp
llmediaentry.cpp
llmodel.cpp
+ llmodelloader.cpp
llprimitive.cpp
llprimtexturelist.cpp
lltextureanim.cpp
@@ -40,16 +44,17 @@ set(llprimitive_SOURCE_FILES
set(llprimitive_HEADER_FILES
CMakeLists.txt
-
+ lldaeloader.h
legacy_object_types.h
- lllslconstants.h
llmaterial.h
llmaterialid.h
llmaterialtable.h
llmediaentry.h
llmodel.h
+ llmodelloader.h
llprimitive.h
llprimtexturelist.h
+ lllslconstants.h
lltextureanim.h
lltextureentry.h
lltreeparams.h
@@ -72,6 +77,7 @@ target_link_libraries(llprimitive
${LLMESSAGE_LIBRARIES}
${LLXML_LIBRARIES}
${LLPHYSICSEXTENSIONS_LIBRARIES}
+ ${LLCHARACTER_LIBRARIES}
)
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
new file mode 100644
index 0000000000..c1b74b1fd7
--- /dev/null
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -0,0 +1,2436 @@
+/**
+ * @file lldaeloader.cpp
+ * @brief LLDAELoader class implementation
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#if LL_MSVC
+#pragma warning (disable : 4263)
+#pragma warning (disable : 4264)
+#endif
+#include "dae.h"
+#include "dom/domAsset.h"
+#include "dom/domBind_material.h"
+#include "dom/domCOLLADA.h"
+#include "dom/domConstants.h"
+#include "dom/domController.h"
+#include "dom/domEffect.h"
+#include "dom/domGeometry.h"
+#include "dom/domInstance_geometry.h"
+#include "dom/domInstance_material.h"
+#include "dom/domInstance_node.h"
+#include "dom/domInstance_effect.h"
+#include "dom/domMaterial.h"
+#include "dom/domMatrix.h"
+#include "dom/domNode.h"
+#include "dom/domProfile_COMMON.h"
+#include "dom/domRotate.h"
+#include "dom/domScale.h"
+#include "dom/domTranslate.h"
+#include "dom/domVisual_scene.h"
+#if LL_MSVC
+#pragma warning (default : 4263)
+#pragma warning (default : 4264)
+#endif
+
+#include <boost/lexical_cast.hpp>
+
+#include "lldaeloader.h"
+#include "llsdserialize.h"
+#include "lljoint.h"
+
+#include "glh/glh_linear.h"
+#include "llmatrix4a.h"
+
+std::string colladaVersion[VERSIONTYPE_COUNT+1] =
+{
+ "1.4.0",
+ "1.4.1",
+ "Unsupported"
+};
+
+static const std::string lod_suffix[LLModel::NUM_LODS] =
+{
+ "_LOD0",
+ "_LOD1",
+ "_LOD2",
+ "",
+ "_PHYS",
+};
+
+const U32 LIMIT_MATERIALS_OUTPUT = 12;
+
+bool get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride,
+ domSource* &pos_source, domSource* &tc_source, domSource* &norm_source)
+{
+ idx_stride = 0;
+
+ for (U32 j = 0; j < inputs.getCount(); ++j)
+ {
+ idx_stride = llmax((S32) inputs[j]->getOffset(), idx_stride);
+
+ if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[j]->getSemantic()) == 0)
+ { //found vertex array
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ domVertices* vertices = (domVertices*) elem.cast();
+ if ( !vertices )
+ {
+ return false;
+ }
+
+ domInputLocal_Array& v_inp = vertices->getInput_array();
+
+
+ for (U32 k = 0; k < v_inp.getCount(); ++k)
+ {
+ if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
+ {
+ pos_offset = inputs[j]->getOffset();
+
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ pos_source = (domSource*) elem.cast();
+ }
+
+ if (strcmp(COMMON_PROFILE_INPUT_NORMAL, v_inp[k]->getSemantic()) == 0)
+ {
+ norm_offset = inputs[j]->getOffset();
+
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ norm_source = (domSource*) elem.cast();
+ }
+ }
+ }
+
+ if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[j]->getSemantic()) == 0)
+ {
+ //found normal array for this triangle list
+ norm_offset = inputs[j]->getOffset();
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ norm_source = (domSource*) elem.cast();
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[j]->getSemantic()) == 0)
+ { //found texCoords
+ tc_offset = inputs[j]->getOffset();
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ tc_source = (domSource*) elem.cast();
+ }
+ }
+
+ idx_stride += 1;
+
+ return true;
+}
+
+LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
+{
+ LLVolumeFace face;
+ std::vector<LLVolumeFace::VertexData> verts;
+ std::vector<U16> indices;
+
+ const domInputLocalOffset_Array& inputs = tri->getInput_array();
+
+ S32 pos_offset = -1;
+ S32 tc_offset = -1;
+ S32 norm_offset = -1;
+
+ domSource* pos_source = NULL;
+ domSource* tc_source = NULL;
+ domSource* norm_source = NULL;
+
+ S32 idx_stride = 0;
+
+ if ( !get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source))
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+
+ if (!pos_source || !pos_source->getFloat_array())
+ {
+ LL_WARNS() << "Unable to process mesh without position data; invalid model; invalid model." << LL_ENDL;
+ return LLModel::BAD_ELEMENT;
+ }
+
+ domPRef p = tri->getP();
+ domListOfUInts& idx = p->getValue();
+
+ domListOfFloats dummy ;
+ domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ;
+ domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
+ domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
+
+ if (pos_source)
+ {
+ if(v.getCount() == 0)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+ }
+
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ for (U32 i = 0; i < idx.getCount(); i += idx_stride)
+ {
+ LLVolumeFace::VertexData cv;
+ if (pos_source)
+ {
+ cv.setPosition(LLVector4a(v[idx[i+pos_offset]*3+0],
+ v[idx[i+pos_offset]*3+1],
+ v[idx[i+pos_offset]*3+2]));
+ }
+
+ if (tc_source)
+ {
+ cv.mTexCoord.setVec(tc[idx[i+tc_offset]*2+0],
+ tc[idx[i+tc_offset]*2+1]);
+ }
+
+ if (norm_source)
+ {
+ cv.setNormal(LLVector4a(n[idx[i+norm_offset]*3+0],
+ n[idx[i+norm_offset]*3+1],
+ n[idx[i+norm_offset]*3+2]));
+ }
+
+ BOOL found = FALSE;
+
+ LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
+ point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr()));
+
+ if (point_iter != point_map.end())
+ {
+ for (U32 j = 0; j < point_iter->second.size(); ++j)
+ {
+ // We have a matching loc
+ //
+ if ((point_iter->second)[j] == cv)
+ {
+ U16 shared_index = (point_iter->second)[j].mIndex;
+
+ // Don't share verts within the same tri, degenerate
+ //
+ if ((indices.size() % 3) && (indices[indices.size()-1] != shared_index))
+ {
+ found = true;
+ indices.push_back(shared_index);
+ }
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
+ verts.push_back(cv);
+ if (verts.size() >= 65535)
+ {
+ //llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << LL_ENDL;
+ return LLModel::VERTEX_NUMBER_OVERFLOW ;
+ }
+ U16 index = (U16) (verts.size()-1);
+ indices.push_back(index);
+
+ LLVolumeFace::VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d);
+ }
+ }
+
+ if (indices.size()%3 == 0 && verts.size() >= 65532)
+ {
+ std::string material;
+
+ if (tri->getMaterial())
+ {
+ material = std::string(tri->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ //ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ //ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
+ face = LLVolumeFace();
+ point_map.clear();
+ }
+ }
+
+ if (!verts.empty())
+ {
+ std::string material;
+
+ if (tri->getMaterial())
+ {
+ material = std::string(tri->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ //ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ //ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
+{
+ domPRef p = poly->getP();
+ domListOfUInts& idx = p->getValue();
+
+ if (idx.getCount() == 0)
+ {
+ return LLModel::NO_ERRORS ;
+ }
+
+ const domInputLocalOffset_Array& inputs = poly->getInput_array();
+
+
+ domListOfUInts& vcount = poly->getVcount()->getValue();
+
+ S32 pos_offset = -1;
+ S32 tc_offset = -1;
+ S32 norm_offset = -1;
+
+ domSource* pos_source = NULL;
+ domSource* tc_source = NULL;
+ domSource* norm_source = NULL;
+
+ S32 idx_stride = 0;
+
+ if (!get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source))
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+
+ LLVolumeFace face;
+
+ std::vector<U16> indices;
+ std::vector<LLVolumeFace::VertexData> verts;
+
+ domListOfFloats v;
+ domListOfFloats tc;
+ domListOfFloats n;
+
+ if (pos_source)
+ {
+ v = pos_source->getFloat_array()->getValue();
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+ }
+
+ if (tc_source)
+ {
+ tc = tc_source->getFloat_array()->getValue();
+ }
+
+ if (norm_source)
+ {
+ n = norm_source->getFloat_array()->getValue();
+ }
+
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ U32 cur_idx = 0;
+ for (U32 i = 0; i < vcount.getCount(); ++i)
+ { //for each polygon
+ U32 first_index = 0;
+ U32 last_index = 0;
+ for (U32 j = 0; j < vcount[i]; ++j)
+ { //for each vertex
+
+ LLVolumeFace::VertexData cv;
+
+ if (pos_source)
+ {
+ cv.getPosition().set(v[idx[cur_idx+pos_offset]*3+0],
+ v[idx[cur_idx+pos_offset]*3+1],
+ v[idx[cur_idx+pos_offset]*3+2]);
+ if (!cv.getPosition().isFinite3())
+ {
+ LL_WARNS() << "Found NaN while loading position data from DAE-Model, invalid model." << LL_ENDL;
+ return LLModel::BAD_ELEMENT;
+ }
+ }
+
+ if (tc_source)
+ {
+ cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0],
+ tc[idx[cur_idx+tc_offset]*2+1]);
+ }
+
+ if (norm_source)
+ {
+ cv.getNormal().set(n[idx[cur_idx+norm_offset]*3+0],
+ n[idx[cur_idx+norm_offset]*3+1],
+ n[idx[cur_idx+norm_offset]*3+2]);
+
+ if (!cv.getNormal().isFinite3())
+ {
+ LL_WARNS() << "Found NaN while loading normals from DAE-Model, invalid model." << LL_ENDL;
+ return LLModel::BAD_ELEMENT;
+ }
+ }
+
+ cur_idx += idx_stride;
+
+ BOOL found = FALSE;
+
+ LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
+ LLVector3 pos3(cv.getPosition().getF32ptr());
+ point_iter = point_map.find(pos3);
+
+ if (point_iter != point_map.end())
+ {
+ for (U32 k = 0; k < point_iter->second.size(); ++k)
+ {
+ if ((point_iter->second)[k] == cv)
+ {
+ found = TRUE;
+ U32 index = (point_iter->second)[k].mIndex;
+ if (j == 0)
+ {
+ first_index = index;
+ }
+ else if (j == 1)
+ {
+ last_index = index;
+ }
+ else
+ {
+ // if these are the same, we have a very, very skinny triangle (coincident verts on one or more edges)
+ //
+ llassert((first_index != last_index) && (last_index != index) && (first_index != index));
+ indices.push_back(first_index);
+ indices.push_back(last_index);
+ indices.push_back(index);
+ last_index = index;
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
+ verts.push_back(cv);
+ if (verts.size() >= 65535)
+ {
+ //llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << LL_ENDL;
+ return LLModel::VERTEX_NUMBER_OVERFLOW ;
+ }
+ U16 index = (U16) (verts.size()-1);
+
+ if (j == 0)
+ {
+ first_index = index;
+ }
+ else if (j == 1)
+ {
+ last_index = index;
+ }
+ else
+ {
+ // detect very skinny degenerate triangles with collapsed edges
+ //
+ llassert((first_index != last_index) && (last_index != index) && (first_index != index));
+ indices.push_back(first_index);
+ indices.push_back(last_index);
+ indices.push_back(index);
+ last_index = index;
+ }
+
+ LLVolumeFace::VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[pos3].push_back(d);
+ }
+ }
+
+ if (indices.size()%3 == 0 && indices.size() >= 65532)
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ //ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ //ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
+ face = LLVolumeFace();
+ verts.clear();
+ indices.clear();
+ point_map.clear();
+ }
+ }
+ }
+
+ if (!verts.empty())
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ //ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ //ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolygonsRef& poly)
+{
+ LLVolumeFace face;
+ std::vector<U16> indices;
+ std::vector<LLVolumeFace::VertexData> verts;
+
+ const domInputLocalOffset_Array& inputs = poly->getInput_array();
+
+ S32 v_offset = -1;
+ S32 n_offset = -1;
+ S32 t_offset = -1;
+
+ domListOfFloats* v = NULL;
+ domListOfFloats* n = NULL;
+ domListOfFloats* t = NULL;
+
+ U32 stride = 0;
+ for (U32 i = 0; i < inputs.getCount(); ++i)
+ {
+ stride = llmax((U32) inputs[i]->getOffset()+1, stride);
+
+ if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[i]->getSemantic()) == 0)
+ { //found vertex array
+ v_offset = inputs[i]->getOffset();
+
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domVertices* vertices = (domVertices*) elem.cast();
+ if (!vertices)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ domInputLocal_Array& v_inp = vertices->getInput_array();
+
+ for (U32 k = 0; k < v_inp.getCount(); ++k)
+ {
+ if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
+ {
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ v = &(src->getFloat_array()->getValue());
+ }
+ }
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[i]->getSemantic()) == 0)
+ {
+ n_offset = inputs[i]->getOffset();
+ //found normal array for this triangle list
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ n = &(src->getFloat_array()->getValue());
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[i]->getSemantic()) == 0 && inputs[i]->getSet() == 0)
+ { //found texCoords
+ t_offset = inputs[i]->getOffset();
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ t = &(src->getFloat_array()->getValue());
+ }
+ }
+
+ domP_Array& ps = poly->getP_array();
+
+ //make a triangle list in <verts>
+ for (U32 i = 0; i < ps.getCount(); ++i)
+ { //for each polygon
+ domListOfUInts& idx = ps[i]->getValue();
+ for (U32 j = 0; j < idx.getCount()/stride; ++j)
+ { //for each vertex
+ if (j > 2)
+ {
+ U32 size = verts.size();
+ LLVolumeFace::VertexData v0 = verts[size-3];
+ LLVolumeFace::VertexData v1 = verts[size-1];
+
+ verts.push_back(v0);
+ verts.push_back(v1);
+ }
+
+ LLVolumeFace::VertexData vert;
+
+
+ if (v)
+ {
+ U32 v_idx = idx[j*stride+v_offset]*3;
+ v_idx = llclamp(v_idx, (U32) 0, (U32) v->getCount());
+ vert.getPosition().set(v->get(v_idx),
+ v->get(v_idx+1),
+ v->get(v_idx+2));
+ }
+
+ //bounds check n and t lookups because some FBX to DAE converters
+ //use negative indices and empty arrays to indicate data does not exist
+ //for a particular channel
+ if (n && n->getCount() > 0)
+ {
+ U32 n_idx = idx[j*stride+n_offset]*3;
+ n_idx = llclamp(n_idx, (U32) 0, (U32) n->getCount());
+ vert.getNormal().set(n->get(n_idx),
+ n->get(n_idx+1),
+ n->get(n_idx+2));
+ }
+ else
+ {
+ vert.getNormal().clear();
+ }
+
+
+ if (t && t->getCount() > 0)
+ {
+ U32 t_idx = idx[j*stride+t_offset]*2;
+ t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount());
+ vert.mTexCoord.setVec(t->get(t_idx),
+ t->get(t_idx+1));
+ }
+ else
+ {
+ vert.mTexCoord.clear();
+ }
+
+
+ verts.push_back(vert);
+ }
+ }
+
+ if (verts.empty())
+ {
+ return LLModel::NO_ERRORS;
+ }
+
+ face.mExtents[0] = verts[0].getPosition();
+ face.mExtents[1] = verts[0].getPosition();
+
+ //create a map of unique vertices to indices
+ std::map<LLVolumeFace::VertexData, U32> vert_idx;
+
+ U32 cur_idx = 0;
+ for (U32 i = 0; i < verts.size(); ++i)
+ {
+ std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.find(verts[i]);
+ if (iter == vert_idx.end())
+ {
+ vert_idx[verts[i]] = cur_idx++;
+ }
+ }
+
+ //build vertex array from map
+ std::vector<LLVolumeFace::VertexData> new_verts;
+ new_verts.resize(vert_idx.size());
+
+ for (std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.begin(); iter != vert_idx.end(); ++iter)
+ {
+ new_verts[iter->second] = iter->first;
+ update_min_max(face.mExtents[0], face.mExtents[1], iter->first.getPosition());
+ }
+
+ //build index array from map
+ indices.resize(verts.size());
+
+ for (U32 i = 0; i < verts.size(); ++i)
+ {
+ indices[i] = vert_idx[verts[i]];
+ llassert(!i || (indices[i-1] != indices[i]));
+ }
+
+ // DEBUG just build an expanded triangle list
+ /*for (U32 i = 0; i < verts.size(); ++i)
+ {
+ indices.push_back((U16) i);
+ update_min_max(face.mExtents[0], face.mExtents[1], verts[i].getPosition());
+ }*/
+
+ if (!new_verts.empty())
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(new_verts, indices);
+
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!n)
+ {
+ //ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!t)
+ {
+ //ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+//-----------------------------------------------------------------------------
+// LLDAELoader
+//-----------------------------------------------------------------------------
+LLDAELoader::LLDAELoader(
+ std::string filename,
+ S32 lod,
+ load_callback_t load_cb,
+ joint_lookup_func_t joint_lookup_func,
+ texture_load_func_t texture_load_func,
+ state_callback_t state_cb,
+ void* opaque_userdata,
+ JointTransformMap& jointMap,
+ JointSet& jointsFromNodes,
+ U32 modelLimit)
+: LLModelLoader(
+ filename,
+ lod,
+ load_cb,
+ joint_lookup_func,
+ texture_load_func,
+ state_cb,
+ opaque_userdata,
+ jointMap,
+ jointsFromNodes),
+mGeneratedModelLimit(modelLimit)
+{
+}
+
+LLDAELoader::~LLDAELoader()
+{
+}
+
+struct ModelSort
+{
+ bool operator()(const LLPointer< LLModel >& lhs, const LLPointer< LLModel >& rhs)
+ {
+ if (lhs->mSubmodelID < rhs->mSubmodelID)
+ {
+ return true;
+ }
+ return LLStringUtil::compareInsensitive(lhs->mLabel, rhs->mLabel) < 0;
+ }
+};
+
+bool LLDAELoader::OpenFile(const std::string& filename)
+{
+ //no suitable slm exists, load from the .dae file
+ DAE dae;
+ domCOLLADA* dom = dae.open(filename);
+
+ if (!dom)
+ {
+ LL_INFOS() <<" Error with dae - traditionally indicates a corrupt file."<<LL_ENDL;
+ setLoadState( ERROR_PARSING );
+ return false;
+ }
+ //Dom version
+ daeString domVersion = dae.getDomVersion();
+ std::string sldom(domVersion);
+ LL_INFOS()<<"Collada Importer Version: "<<sldom<<LL_ENDL;
+ //Dae version
+ domVersionType docVersion = dom->getVersion();
+ //0=1.4
+ //1=1.4.1
+ //2=Currently unsupported, however may work
+ if (docVersion > 1 )
+ {
+ docVersion = VERSIONTYPE_COUNT;
+ }
+ LL_INFOS()<<"Dae version "<<colladaVersion[docVersion]<<LL_ENDL;
+
+
+ daeDatabase* db = dae.getDatabase();
+
+ daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
+
+ daeDocument* doc = dae.getDoc(mFilename);
+ if (!doc)
+ {
+ LL_WARNS() << "can't find internal doc" << LL_ENDL;
+ return false;
+ }
+
+ daeElement* root = doc->getDomRoot();
+ if (!root)
+ {
+ LL_WARNS() << "document has no root" << LL_ENDL;
+ return false;
+ }
+
+ //Verify some basic properties of the dae
+ //1. Basic validity check on controller
+ U32 controllerCount = (int) db->getElementCount( NULL, "controller" );
+ bool result = false;
+ for ( int i=0; i<controllerCount; ++i )
+ {
+ domController* pController = NULL;
+ db->getElement( (daeElement**) &pController, i , NULL, "controller" );
+ result = verifyController( pController );
+ if (!result)
+ {
+ LL_INFOS() << "Could not verify controller" << LL_ENDL;
+ setLoadState( ERROR_PARSING );
+ return true;
+ }
+ }
+
+
+ //get unit scale
+ mTransform.setIdentity();
+
+ domAsset::domUnit* unit = daeSafeCast<domAsset::domUnit>(root->getDescendant(daeElement::matchType(domAsset::domUnit::ID())));
+
+ if (unit)
+ {
+ F32 meter = unit->getMeter();
+ mTransform.mMatrix[0][0] = meter;
+ mTransform.mMatrix[1][1] = meter;
+ mTransform.mMatrix[2][2] = meter;
+ }
+
+ //get up axis rotation
+ LLMatrix4 rotation;
+
+ domUpAxisType up = UPAXISTYPE_Y_UP; // default is Y_UP
+ domAsset::domUp_axis* up_axis =
+ daeSafeCast<domAsset::domUp_axis>(root->getDescendant(daeElement::matchType(domAsset::domUp_axis::ID())));
+
+ if (up_axis)
+ {
+ up = up_axis->getValue();
+ }
+
+ if (up == UPAXISTYPE_X_UP)
+ {
+ rotation.initRotation(0.0f, 90.0f * DEG_TO_RAD, 0.0f);
+ }
+ else if (up == UPAXISTYPE_Y_UP)
+ {
+ rotation.initRotation(90.0f * DEG_TO_RAD, 0.0f, 0.0f);
+ }
+
+ rotation *= mTransform;
+ mTransform = rotation;
+
+ mTransform.condition();
+
+ U32 submodel_limit = count > 0 ? mGeneratedModelLimit/count : 0;
+ for (daeInt idx = 0; idx < count; ++idx)
+ { //build map of domEntities to LLModel
+ domMesh* mesh = NULL;
+ db->getElement((daeElement**) &mesh, idx, NULL, COLLADA_TYPE_MESH);
+
+ if (mesh)
+ {
+
+ std::vector<LLModel*> models;
+
+ loadModelsFromDomMesh(mesh, models, submodel_limit);
+
+ std::vector<LLModel*>::iterator i;
+ i = models.begin();
+ while (i != models.end())
+ {
+ LLModel* mdl = *i;
+ if(mdl->getStatus() != LLModel::NO_ERRORS)
+ {
+ setLoadState(ERROR_MODEL + mdl->getStatus()) ;
+ return false; //abort
+ }
+
+ if (mdl && validate_model(mdl))
+ {
+ mModelList.push_back(mdl);
+ mModelsMap[mesh].push_back(mdl);
+ }
+ i++;
+ }
+ }
+ }
+
+ std::sort(mModelList.begin(), mModelList.end(), ModelSort());
+
+ model_list::iterator model_iter = mModelList.begin();
+ while (model_iter != mModelList.end())
+ {
+ LLModel* mdl = *model_iter;
+ U32 material_count = mdl->mMaterialList.size();
+ LL_INFOS() << "Importing " << mdl->mLabel << " model with " << material_count << " material references" << LL_ENDL;
+ std::vector<std::string>::iterator mat_iter = mdl->mMaterialList.begin();
+ std::vector<std::string>::iterator end_iter = material_count > LIMIT_MATERIALS_OUTPUT
+ ? mat_iter + LIMIT_MATERIALS_OUTPUT
+ : mdl->mMaterialList.end();
+ while (mat_iter != end_iter)
+ {
+ LL_INFOS() << mdl->mLabel << " references " << (*mat_iter) << LL_ENDL;
+ mat_iter++;
+ }
+ model_iter++;
+ }
+
+ count = db->getElementCount(NULL, COLLADA_TYPE_SKIN);
+ for (daeInt idx = 0; idx < count; ++idx)
+ { //add skinned meshes as instances
+ domSkin* skin = NULL;
+ db->getElement((daeElement**) &skin, idx, NULL, COLLADA_TYPE_SKIN);
+
+ if (skin)
+ {
+ domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement());
+
+ if (geom)
+ {
+ domMesh* mesh = geom->getMesh();
+ if (mesh)
+ {
+ std::vector< LLPointer< LLModel > >::iterator i = mModelsMap[mesh].begin();
+ while (i != mModelsMap[mesh].end())
+ {
+ LLPointer<LLModel> mdl = *i;
+ LLDAELoader::processDomModel(mdl, &dae, root, mesh, skin);
+ i++;
+ }
+ }
+ }
+ }
+ }
+
+ LL_INFOS()<< "Collada skins processed: " << count <<LL_ENDL;
+
+ daeElement* scene = root->getDescendant("visual_scene");
+
+ if (!scene)
+ {
+ LL_WARNS() << "document has no visual_scene" << LL_ENDL;
+ setLoadState( ERROR_PARSING );
+ return true;
+ }
+
+ setLoadState( DONE );
+
+ bool badElement = false;
+
+ processElement( scene, badElement, &dae );
+
+ if ( badElement )
+ {
+ LL_INFOS()<<"Scene could not be parsed"<<LL_ENDL;
+ setLoadState( ERROR_PARSING );
+ }
+
+ return true;
+}
+
+void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, domMesh* mesh, domSkin* skin)
+{
+ llassert(model && dae && mesh && skin);
+
+ if (model)
+ {
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 normalized_transformation;
+ normalized_transformation.setTranslation(mesh_translation_vector);
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= normalized_transformation;
+ normalized_transformation = mesh_scale;
+
+ glh::matrix4f inv_mat((F32*) normalized_transformation.mMatrix);
+ inv_mat = inv_mat.inverse();
+ LLMatrix4 inverse_normalized_transformation(inv_mat.m);
+
+ domSkin::domBind_shape_matrix* bind_mat = skin->getBind_shape_matrix();
+
+ if (bind_mat)
+ { //get bind shape matrix
+ domFloat4x4& dom_value = bind_mat->getValue();
+
+ LLMeshSkinInfo& skin_info = model->mSkinInfo;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ skin_info.mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
+ }
+ }
+
+ LLMatrix4 trans = normalized_transformation;
+ trans *= skin_info.mBindShapeMatrix;
+ skin_info.mBindShapeMatrix = trans;
+ }
+
+
+ //Some collada setup for accessing the skeleton
+ daeElement* pElement = 0;
+ dae->getDatabase()->getElement( &pElement, 0, 0, "skeleton" );
+
+ //Try to get at the skeletal instance controller
+ domInstance_controller::domSkeleton* pSkeleton = daeSafeCast<domInstance_controller::domSkeleton>( pElement );
+ bool missingSkeletonOrScene = false;
+
+ //If no skeleton, do a breadth-first search to get at specific joints
+ bool rootNode = false;
+
+ //Need to test for a skeleton that does not have a root node
+ //This occurs when your instance controller does not have an associated scene
+ if ( pSkeleton )
+ {
+ daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
+ if ( pSkeletonRootNode )
+ {
+ rootNode = true;
+ }
+
+ }
+ if ( !pSkeleton || !rootNode )
+ {
+ daeElement* pScene = root->getDescendant("visual_scene");
+ if ( !pScene )
+ {
+ LL_WARNS()<<"No visual scene - unable to parse bone offsets "<<LL_ENDL;
+ missingSkeletonOrScene = true;
+ }
+ else
+ {
+ //Get the children at this level
+ daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
+ S32 childCount = children.getCount();
+
+ //Process any children that are joints
+ //Not all children are joints, some code be ambient lights, cameras, geometry etc..
+ for (S32 i = 0; i < childCount; ++i)
+ {
+ domNode* pNode = daeSafeCast<domNode>(children[i]);
+ if ( isNodeAJoint( pNode ) )
+ {
+ processJointNode( pNode, mJointList );
+ }
+ }
+ }
+ }
+ else
+ //Has Skeleton
+ {
+ //Get the root node of the skeleton
+ daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
+ if ( pSkeletonRootNode )
+ {
+ //Once we have the root node - start acccessing it's joint components
+ const int jointCnt = mJointMap.size();
+ JointMap :: const_iterator jointIt = mJointMap.begin();
+
+ //Loop over all the possible joints within the .dae - using the allowed joint list in the ctor.
+ for ( int i=0; i<jointCnt; ++i, ++jointIt )
+ {
+ //Build a joint for the resolver to work with
+ char str[64]={0};
+ sprintf(str,"./%s",(*jointIt).first.c_str() );
+ //LL_WARNS()<<"Joint "<< str <<LL_ENDL;
+
+ //Setup the resolver
+ daeSIDResolver resolver( pSkeletonRootNode, str );
+
+ //Look for the joint
+ domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() );
+ if ( pJoint )
+ {
+ //Pull out the translate id and store it in the jointTranslations map
+ daeSIDResolver jointResolverA( pJoint, "./translate" );
+ domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
+ daeSIDResolver jointResolverB( pJoint, "./location" );
+ domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
+
+ LLMatrix4 workingTransform;
+
+ //Translation via SID
+ if ( pTranslateA )
+ {
+ extractTranslation( pTranslateA, workingTransform );
+ }
+ else
+ if ( pTranslateB )
+ {
+ extractTranslation( pTranslateB, workingTransform );
+ }
+ else
+ {
+ //Translation via child from element
+ daeElement* pTranslateElement = getChildFromElement( pJoint, "translate" );
+ if ( pTranslateElement && pTranslateElement->typeID() != domTranslate::ID() )
+ {
+ LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
+ missingSkeletonOrScene = true;
+ }
+ else
+ if ( pTranslateElement )
+ {
+ extractTranslationViaElement( pTranslateElement, workingTransform );
+ }
+ else
+ {
+ extractTranslationViaSID( pJoint, workingTransform );
+ }
+
+ }
+
+ //Store the joint transform w/respect to it's name.
+ mJointList[(*jointIt).second.c_str()] = workingTransform;
+ }
+ }
+
+ //If anything failed in regards to extracting the skeleton, joints or translation id,
+ //mention it
+ if ( missingSkeletonOrScene )
+ {
+ LL_WARNS()<< "Partial jointmap found in asset - did you mean to just have a partial map?" << LL_ENDL;
+ }
+ }//got skeleton?
+ }
+
+
+ domSkin::domJoints* joints = skin->getJoints();
+
+ domInputLocal_Array& joint_input = joints->getInput_array();
+
+ for (size_t i = 0; i < joint_input.getCount(); ++i)
+ {
+ domInputLocal* input = joint_input.get(i);
+ xsNMTOKEN semantic = input->getSemantic();
+
+ if (strcmp(semantic, COMMON_PROFILE_INPUT_JOINT) == 0)
+ { //found joint source, fill model->mJointMap and model->mSkinInfo.mJointNames
+ daeElement* elem = input->getSource().getElement();
+
+ domSource* source = daeSafeCast<domSource>(elem);
+ if (source)
+ {
+
+
+ domName_array* names_source = source->getName_array();
+
+ if (names_source)
+ {
+ domListOfNames &names = names_source->getValue();
+
+ for (size_t j = 0; j < names.getCount(); ++j)
+ {
+ std::string name(names.get(j));
+ if (mJointMap.find(name) != mJointMap.end())
+ {
+ name = mJointMap[name];
+ }
+ model->mSkinInfo.mJointNames.push_back(name);
+ model->mSkinInfo.mJointMap[name] = j;
+ }
+ }
+ else
+ {
+ domIDREF_array* names_source = source->getIDREF_array();
+ if (names_source)
+ {
+ xsIDREFS& names = names_source->getValue();
+
+ for (size_t j = 0; j < names.getCount(); ++j)
+ {
+ std::string name(names.get(j).getID());
+ if (mJointMap.find(name) != mJointMap.end())
+ {
+ name = mJointMap[name];
+ }
+ model->mSkinInfo.mJointNames.push_back(name);
+ model->mSkinInfo.mJointMap[name] = j;
+ }
+ }
+ }
+ }
+ }
+ else if (strcmp(semantic, COMMON_PROFILE_INPUT_INV_BIND_MATRIX) == 0)
+ { //found inv_bind_matrix array, fill model->mInvBindMatrix
+ domSource* source = daeSafeCast<domSource>(input->getSource().getElement());
+ if (source)
+ {
+ domFloat_array* t = source->getFloat_array();
+ if (t)
+ {
+ domListOfFloats& transform = t->getValue();
+ S32 count = transform.getCount()/16;
+
+ for (S32 k = 0; k < count; ++k)
+ {
+ LLMatrix4 mat;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ mat.mMatrix[i][j] = transform[k*16 + i + j*4];
+ }
+ }
+
+ model->mSkinInfo.mInvBindMatrix.push_back(mat);
+ }
+ }
+ }
+ }
+ }
+
+ //Now that we've parsed the joint array, let's determine if we have a full rig
+ //(which means we have all the joint sthat are required for an avatar versus
+ //a skinned asset attached to a node in a file that contains an entire skeleton,
+ //but does not use the skeleton).
+ buildJointToNodeMappingFromScene( root );
+ critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
+
+ if ( !missingSkeletonOrScene )
+ {
+ //Set the joint translations on the avatar - if it's a full mapping
+ //The joints are reset in the dtor
+ if ( getRigWithSceneParity() )
+ {
+ JointMap :: const_iterator masterJointIt = mJointMap.begin();
+ JointMap :: const_iterator masterJointItEnd = mJointMap.end();
+ for (;masterJointIt!=masterJointItEnd;++masterJointIt )
+ {
+ std::string lookingForJoint = (*masterJointIt).first.c_str();
+
+ if ( mJointList.find( lookingForJoint ) != mJointList.end() )
+ {
+ //LL_INFOS()<<"joint "<<lookingForJoint.c_str()<<LL_ENDL;
+ LLMatrix4 jointTransform = mJointList[lookingForJoint];
+ LLJoint* pJoint = mJointLookupFunc(lookingForJoint,mOpaqueData);
+ if ( pJoint )
+ {
+ LLUUID fake_mesh_id;
+ fake_mesh_id.generate();
+ pJoint->addAttachmentPosOverride( jointTransform.getTranslation(), fake_mesh_id, "");
+ }
+ else
+ {
+ //Most likely an error in the asset.
+ LL_WARNS()<<"Tried to apply joint position from .dae, but it did not exist in the avatar rig." << LL_ENDL;
+ }
+ }
+ }
+ }
+ } //missingSkeletonOrScene
+
+ //We need to construct the alternate bind matrix (which contains the new joint positions)
+ //in the same order as they were stored in the joint buffer. The joints associated
+ //with the skeleton are not stored in the same order as they are in the exported joint buffer.
+ //This remaps the skeletal joints to be in the same order as the joints stored in the model.
+ std::vector<std::string> :: const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
+ const int jointCnt = model->mSkinInfo.mJointNames.size();
+ for ( int i=0; i<jointCnt; ++i, ++jointIt )
+ {
+ std::string lookingForJoint = (*jointIt).c_str();
+ //Look for the joint xform that we extracted from the skeleton, using the jointIt as the key
+ //and store it in the alternate bind matrix
+ if ( mJointList.find( lookingForJoint ) != mJointList.end() )
+ {
+ LLMatrix4 jointTransform = mJointList[lookingForJoint];
+ LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];
+ newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() );
+ model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse );
+ }
+ else
+ {
+ LL_WARNS()<<"Possibly misnamed/missing joint [" <<lookingForJoint.c_str()<<" ] "<<LL_ENDL;
+ }
+ }
+
+ //grab raw position array
+
+ domVertices* verts = mesh->getVertices();
+ if (verts)
+ {
+ domInputLocal_Array& inputs = verts->getInput_array();
+ for (size_t i = 0; i < inputs.getCount() && model->mPosition.empty(); ++i)
+ {
+ if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_POSITION) == 0)
+ {
+ domSource* pos_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
+ if (pos_source)
+ {
+ domFloat_array* pos_array = pos_source->getFloat_array();
+ if (pos_array)
+ {
+ domListOfFloats& pos = pos_array->getValue();
+
+ for (size_t j = 0; j < pos.getCount(); j += 3)
+ {
+ if (pos.getCount() <= j+2)
+ {
+ LL_ERRS() << "Invalid position array size." << LL_ENDL;
+ }
+
+ LLVector3 v(pos[j], pos[j+1], pos[j+2]);
+
+ //transform from COLLADA space to volume space
+ v = v * inverse_normalized_transformation;
+
+ model->mPosition.push_back(v);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //grab skin weights array
+ domSkin::domVertex_weights* weights = skin->getVertex_weights();
+ if (weights)
+ {
+ domInputLocalOffset_Array& inputs = weights->getInput_array();
+ domFloat_array* vertex_weights = NULL;
+ for (size_t i = 0; i < inputs.getCount(); ++i)
+ {
+ if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_WEIGHT) == 0)
+ {
+ domSource* weight_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
+ if (weight_source)
+ {
+ vertex_weights = weight_source->getFloat_array();
+ }
+ }
+ }
+
+ if (vertex_weights)
+ {
+ domListOfFloats& w = vertex_weights->getValue();
+ domListOfUInts& vcount = weights->getVcount()->getValue();
+ domListOfInts& v = weights->getV()->getValue();
+
+ U32 c_idx = 0;
+ for (size_t vc_idx = 0; vc_idx < vcount.getCount(); ++vc_idx)
+ { //for each vertex
+ daeUInt count = vcount[vc_idx];
+
+ //create list of weights that influence this vertex
+ LLModel::weight_list weight_list;
+
+ for (daeUInt i = 0; i < count; ++i)
+ { //for each weight
+ daeInt joint_idx = v[c_idx++];
+ daeInt weight_idx = v[c_idx++];
+
+ if (joint_idx == -1)
+ {
+ //ignore bindings to bind_shape_matrix
+ continue;
+ }
+
+ F32 weight_value = w[weight_idx];
+
+ weight_list.push_back(LLModel::JointWeight(joint_idx, weight_value));
+ }
+
+ //sort by joint weight
+ std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater());
+
+ std::vector<LLModel::JointWeight> wght;
+
+ F32 total = 0.f;
+
+ for (U32 i = 0; i < llmin((U32) 4, (U32) weight_list.size()); ++i)
+ { //take up to 4 most significant weights
+ if (weight_list[i].mWeight > 0.f)
+ {
+ wght.push_back( weight_list[i] );
+ total += weight_list[i].mWeight;
+ }
+ }
+
+ F32 scale = 1.f/total;
+ if (scale != 1.f)
+ { //normalize weights
+ for (U32 i = 0; i < wght.size(); ++i)
+ {
+ wght[i].mWeight *= scale;
+ }
+ }
+
+ model->mSkinWeights[model->mPosition[vc_idx]] = wght;
+ }
+ }
+
+ }
+
+ //add instance to scene for this model
+
+ LLMatrix4 transformation;
+ transformation.initScale(mesh_scale_vector);
+ transformation.setTranslation(mesh_translation_vector);
+ transformation *= mTransform;
+
+ std::map<std::string, LLImportMaterial> materials;
+ for (U32 i = 0; i < model->mMaterialList.size(); ++i)
+ {
+ materials[model->mMaterialList[i]] = LLImportMaterial();
+ }
+ mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
+ stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// buildJointToNodeMappingFromScene()
+//-----------------------------------------------------------------------------
+void LLDAELoader::buildJointToNodeMappingFromScene( daeElement* pRoot )
+{
+ daeElement* pScene = pRoot->getDescendant("visual_scene");
+ if ( pScene )
+ {
+ daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
+ S32 childCount = children.getCount();
+ for (S32 i = 0; i < childCount; ++i)
+ {
+ domNode* pNode = daeSafeCast<domNode>(children[i]);
+ processJointToNodeMapping( pNode );
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// processJointToNodeMapping()
+//-----------------------------------------------------------------------------
+void LLDAELoader::processJointToNodeMapping( domNode* pNode )
+{
+ if ( isNodeAJoint( pNode ) )
+ {
+ //1.Store the parent
+ std::string nodeName = pNode->getName();
+ if ( !nodeName.empty() )
+ {
+ mJointsFromNode.push_front( pNode->getName() );
+ }
+ //2. Handle the kiddo's
+ processChildJoints( pNode );
+ }
+ else
+ {
+ //Determine if the're any children wrt to this failed node.
+ //This occurs when an armature is exported and ends up being what essentially amounts to
+ //as the root for the visual_scene
+ if ( pNode )
+ {
+ processChildJoints( pNode );
+ }
+ else
+ {
+ LL_INFOS()<<"Node is NULL"<<LL_ENDL;
+ }
+
+ }
+}
+//-----------------------------------------------------------------------------
+// processChildJoint()
+//-----------------------------------------------------------------------------
+void LLDAELoader::processChildJoints( domNode* pParentNode )
+{
+ daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren();
+ S32 childOfChildCount = childOfChild.getCount();
+ for (S32 i = 0; i < childOfChildCount; ++i)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
+ {
+ processJointToNodeMapping( pChildNode );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// isNodeAJoint()
+//-----------------------------------------------------------------------------
+bool LLDAELoader::isNodeAJoint( domNode* pNode )
+{
+ if ( !pNode )
+ {
+ LL_INFOS()<<"Created node is NULL"<<LL_ENDL;
+ return false;
+ }
+
+ return LLModelLoader::isNodeAJoint(pNode->getName());
+}
+//-----------------------------------------------------------------------------
+// verifyCount
+//-----------------------------------------------------------------------------
+bool LLDAELoader::verifyCount( int expected, int result )
+{
+ if ( expected != result )
+ {
+ LL_INFOS()<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<LL_ENDL;
+ return false;
+ }
+ return true;
+}
+//-----------------------------------------------------------------------------
+// verifyController
+//-----------------------------------------------------------------------------
+bool LLDAELoader::verifyController( domController* pController )
+{
+
+ bool result = true;
+
+ domSkin* pSkin = pController->getSkin();
+
+ if ( pSkin )
+ {
+ xsAnyURI & uri = pSkin->getSource();
+ domElement* pElement = uri.getElement();
+
+ if ( !pElement )
+ {
+ LL_INFOS()<<"Can't resolve skin source"<<LL_ENDL;
+ return false;
+ }
+
+ daeString type_str = pElement->getTypeName();
+ if ( stricmp(type_str, "geometry") == 0 )
+ {
+ //Skin is reference directly by geometry and get the vertex count from skin
+ domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights();
+ U32 vertexWeightsCount = pVertexWeights->getCount();
+ domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement();
+ domMesh* pMesh = pGeometry->getMesh();
+
+ if ( pMesh )
+ {
+ //Get vertex count from geometry
+ domVertices* pVertices = pMesh->getVertices();
+ if ( !pVertices )
+ {
+ LL_INFOS()<<"No vertices!"<<LL_ENDL;
+ return false;
+ }
+
+ if ( pVertices )
+ {
+ xsAnyURI src = pVertices->getInput_array()[0]->getSource();
+ domSource* pSource = (domSource*) (domElement*) src.getElement();
+ U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount();
+ result = verifyCount( verticesCount, vertexWeightsCount );
+ if ( !result )
+ {
+ return result;
+ }
+ }
+ }
+
+ U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount();
+ result = verifyCount( vcountCount, vertexWeightsCount );
+ if ( !result )
+ {
+ return result;
+ }
+
+ domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array();
+ U32 sum = 0;
+ for (size_t i=0; i<vcountCount; i++)
+ {
+ sum += pVertexWeights->getVcount()->getValue()[i];
+ }
+ result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() );
+ }
+ }
+
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+// extractTranslation()
+//-----------------------------------------------------------------------------
+void LLDAELoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& transform )
+{
+ domFloat3 jointTrans = pTranslate->getValue();
+ LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] );
+ transform.setTranslation( singleJointTranslation );
+}
+//-----------------------------------------------------------------------------
+// extractTranslationViaElement()
+//-----------------------------------------------------------------------------
+void LLDAELoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform )
+{
+ if ( pTranslateElement )
+ {
+ domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement );
+ domFloat3 translateChild = pTranslateChild->getValue();
+ LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] );
+ transform.setTranslation( singleJointTranslation );
+ }
+}
+//-----------------------------------------------------------------------------
+// extractTranslationViaSID()
+//-----------------------------------------------------------------------------
+void LLDAELoader::extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform )
+{
+ if ( pElement )
+ {
+ daeSIDResolver resolver( pElement, "./transform" );
+ domMatrix* pMatrix = daeSafeCast<domMatrix>( resolver.getElement() );
+ //We are only extracting out the translational component atm
+ LLMatrix4 workingTransform;
+ if ( pMatrix )
+ {
+ domFloat4x4 domArray = pMatrix->getValue();
+ for ( int i = 0; i < 4; i++ )
+ {
+ for( int j = 0; j < 4; j++ )
+ {
+ workingTransform.mMatrix[i][j] = domArray[i + j*4];
+ }
+ }
+ LLVector3 trans = workingTransform.getTranslation();
+ transform.setTranslation( trans );
+ }
+ }
+ else
+ {
+ LL_WARNS()<<"Element is nonexistent - empty/unsupported node."<<LL_ENDL;
+ }
+}
+//-----------------------------------------------------------------------------
+// processJointNode()
+//-----------------------------------------------------------------------------
+void LLDAELoader::processJointNode( domNode* pNode, JointTransformMap& jointTransforms )
+{
+ if (pNode->getName() == NULL)
+ {
+ LL_WARNS() << "nameless node, can't process" << LL_ENDL;
+ return;
+ }
+
+ //LL_WARNS()<<"ProcessJointNode# Node:" <<pNode->getName()<<LL_ENDL;
+
+ //1. handle the incoming node - extract out translation via SID or element
+
+ LLMatrix4 workingTransform;
+
+ //Pull out the translate id and store it in the jointTranslations map
+ daeSIDResolver jointResolverA( pNode, "./translate" );
+ domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
+ daeSIDResolver jointResolverB( pNode, "./location" );
+ domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
+
+ //Translation via SID was successful
+ if ( pTranslateA )
+ {
+ extractTranslation( pTranslateA, workingTransform );
+ }
+ else
+ if ( pTranslateB )
+ {
+ extractTranslation( pTranslateB, workingTransform );
+ }
+ else
+ {
+ //Translation via child from element
+ daeElement* pTranslateElement = getChildFromElement( pNode, "translate" );
+ if ( !pTranslateElement || pTranslateElement->typeID() != domTranslate::ID() )
+ {
+ //LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
+ daeSIDResolver jointResolver( pNode, "./matrix" );
+ domMatrix* pMatrix = daeSafeCast<domMatrix>( jointResolver.getElement() );
+ if ( pMatrix )
+ {
+ //LL_INFOS()<<"A matrix SID was however found!"<<LL_ENDL;
+ domFloat4x4 domArray = pMatrix->getValue();
+ for ( int i = 0; i < 4; i++ )
+ {
+ for( int j = 0; j < 4; j++ )
+ {
+ workingTransform.mMatrix[i][j] = domArray[i + j*4];
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS()<< "The found element is not translate or matrix node - most likely a corrupt export!" <<LL_ENDL;
+ }
+ }
+ else
+ {
+ extractTranslationViaElement( pTranslateElement, workingTransform );
+ }
+ }
+
+ //Store the working transform relative to the nodes name.
+ jointTransforms[ pNode->getName() ] = workingTransform;
+
+ //2. handle the nodes children
+
+ //Gather and handle the incoming nodes children
+ daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren();
+ S32 childOfChildCount = childOfChild.getCount();
+
+ for (S32 i = 0; i < childOfChildCount; ++i)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
+ {
+ processJointNode( pChildNode, jointTransforms );
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// getChildFromElement()
+//-----------------------------------------------------------------------------
+daeElement* LLDAELoader::getChildFromElement( daeElement* pElement, std::string const & name )
+{
+ daeElement* pChildOfElement = pElement->getChild( name.c_str() );
+ if ( pChildOfElement )
+ {
+ return pChildOfElement;
+ }
+ LL_WARNS()<< "Could not find a child [" << name << "] for the element: \"" << pElement->getAttribute("id") << "\"" << LL_ENDL;
+ return NULL;
+}
+
+void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* dae )
+{
+ LLMatrix4 saved_transform;
+ bool pushed_mat = false;
+
+ domNode* node = daeSafeCast<domNode>(element);
+ if (node)
+ {
+ pushed_mat = true;
+ saved_transform = mTransform;
+ }
+
+ domTranslate* translate = daeSafeCast<domTranslate>(element);
+ if (translate)
+ {
+ domFloat3 dom_value = translate->getValue();
+
+ LLMatrix4 translation;
+ translation.setTranslation(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
+
+ translation *= mTransform;
+ mTransform = translation;
+ mTransform.condition();
+ }
+
+ domRotate* rotate = daeSafeCast<domRotate>(element);
+ if (rotate)
+ {
+ domFloat4 dom_value = rotate->getValue();
+
+ LLMatrix4 rotation;
+ rotation.initRotTrans(dom_value[3] * DEG_TO_RAD, LLVector3(dom_value[0], dom_value[1], dom_value[2]), LLVector3(0, 0, 0));
+
+ rotation *= mTransform;
+ mTransform = rotation;
+ mTransform.condition();
+ }
+
+ domScale* scale = daeSafeCast<domScale>(element);
+ if (scale)
+ {
+ domFloat3 dom_value = scale->getValue();
+
+
+ LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]);
+ scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes
+ LLMatrix4 scaling;
+ scaling.initScale(scale_vector);
+
+ scaling *= mTransform;
+ mTransform = scaling;
+ mTransform.condition();
+ }
+
+ domMatrix* matrix = daeSafeCast<domMatrix>(element);
+ if (matrix)
+ {
+ domFloat4x4 dom_value = matrix->getValue();
+
+ LLMatrix4 matrix_transform;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ matrix_transform.mMatrix[i][j] = dom_value[i + j*4];
+ }
+ }
+
+ matrix_transform *= mTransform;
+ mTransform = matrix_transform;
+ mTransform.condition();
+ }
+
+ domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element);
+ if (instance_geo)
+ {
+ domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement());
+ if (geo)
+ {
+ domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID())));
+ if (mesh)
+ {
+
+ std::vector< LLPointer< LLModel > >::iterator i = mModelsMap[mesh].begin();
+ while (i != mModelsMap[mesh].end())
+ {
+ LLModel* model = *i;
+
+ LLMatrix4 transformation = mTransform;
+
+ if (mTransform.determinant() < 0)
+ { //negative scales are not supported
+ LL_INFOS() << "Negative scale detected, unsupported transform. domInstance_geometry: " << getElementLabel(instance_geo) << LL_ENDL;
+ badElement = true;
+ }
+
+ LLModelLoader::material_map materials = getMaterials(model, instance_geo, dae);
+
+ // adjust the transformation to compensate for mesh normalization
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 mesh_translation;
+ mesh_translation.setTranslation(mesh_translation_vector);
+ mesh_translation *= transformation;
+ transformation = mesh_translation;
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= transformation;
+ transformation = mesh_scale;
+
+ if (transformation.determinant() < 0)
+ { //negative scales are not supported
+ LL_INFOS() << "Negative scale detected, unsupported post-normalization transform. domInstance_geometry: " << getElementLabel(instance_geo) << LL_ENDL;
+ badElement = true;
+ }
+
+ std::string label;
+
+ if (model->mLabel.empty())
+ {
+ label = getLodlessLabel(instance_geo);
+
+ llassert(!label.empty());
+
+ if (model->mSubmodelID)
+ {
+ label += (char)((int)'a' + model->mSubmodelID);
+ }
+
+ model->mLabel = label + lod_suffix[mLod];
+ }
+ else
+ {
+ // Don't change model's name if possible, it will play havoc with scenes that already use said model.
+ size_t ext_pos = getSuffixPosition(model->mLabel);
+ if (ext_pos != -1)
+ {
+ label = model->mLabel.substr(0, ext_pos);
+ }
+ else
+ {
+ label = model->mLabel;
+ }
+ }
+
+ mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
+ stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
+ i++;
+ }
+ }
+ }
+ else
+ {
+ LL_INFOS()<<"Unable to resolve geometry URL."<<LL_ENDL;
+ badElement = true;
+ }
+
+ }
+
+ domInstance_node* instance_node = daeSafeCast<domInstance_node>(element);
+ if (instance_node)
+ {
+ daeElement* instance = instance_node->getUrl().getElement();
+ if (instance)
+ {
+ processElement(instance,badElement, dae);
+ }
+ }
+
+ //process children
+ daeTArray< daeSmartRef<daeElement> > children = element->getChildren();
+ int childCount = children.getCount();
+ for (S32 i = 0; i < childCount; i++)
+ {
+ processElement(children[i],badElement, dae);
+ }
+
+ if (pushed_mat)
+ { //this element was a node, restore transform before processiing siblings
+ mTransform = saved_transform;
+ }
+}
+
+std::map<std::string, LLImportMaterial> LLDAELoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo, DAE* dae)
+{
+ std::map<std::string, LLImportMaterial> materials;
+ for (int i = 0; i < model->mMaterialList.size(); i++)
+ {
+ LLImportMaterial import_material;
+
+ domInstance_material* instance_mat = NULL;
+
+ domBind_material::domTechnique_common* technique =
+ daeSafeCast<domBind_material::domTechnique_common>(instance_geo->getDescendant(daeElement::matchType(domBind_material::domTechnique_common::ID())));
+
+ if (technique)
+ {
+ daeTArray< daeSmartRef<domInstance_material> > inst_materials = technique->getChildrenByType<domInstance_material>();
+ for (int j = 0; j < inst_materials.getCount(); j++)
+ {
+ std::string symbol(inst_materials[j]->getSymbol());
+
+ if (symbol == model->mMaterialList[i]) // found the binding
+ {
+ instance_mat = inst_materials[j];
+ break;
+ }
+ }
+ }
+
+ if (instance_mat)
+ {
+ domMaterial* material = daeSafeCast<domMaterial>(instance_mat->getTarget().getElement());
+ if (material)
+ {
+ domInstance_effect* instance_effect =
+ daeSafeCast<domInstance_effect>(material->getDescendant(daeElement::matchType(domInstance_effect::ID())));
+ if (instance_effect)
+ {
+ domEffect* effect = daeSafeCast<domEffect>(instance_effect->getUrl().getElement());
+ if (effect)
+ {
+ domProfile_COMMON* profile =
+ daeSafeCast<domProfile_COMMON>(effect->getDescendant(daeElement::matchType(domProfile_COMMON::ID())));
+ if (profile)
+ {
+ import_material = profileToMaterial(profile, dae);
+ }
+ }
+ }
+ }
+ }
+
+ import_material.mBinding = model->mMaterialList[i];
+ materials[model->mMaterialList[i]] = import_material;
+ }
+
+ return materials;
+}
+
+LLImportMaterial LLDAELoader::profileToMaterial(domProfile_COMMON* material, DAE* dae)
+{
+ LLImportMaterial mat;
+ mat.mFullbright = FALSE;
+
+ daeElement* diffuse = material->getDescendant("diffuse");
+ if (diffuse)
+ {
+ domCommon_color_or_texture_type_complexType::domTexture* texture =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domTexture>(diffuse->getDescendant("texture"));
+ if (texture)
+ {
+ domCommon_newparam_type_Array newparams = material->getNewparam_array();
+ if (newparams.getCount())
+ {
+
+ for (S32 i = 0; i < newparams.getCount(); i++)
+ {
+ domFx_surface_common* surface = newparams[i]->getSurface();
+ if (surface)
+ {
+ domFx_surface_init_common* init = surface->getFx_surface_init_common();
+ if (init)
+ {
+ domFx_surface_init_from_common_Array init_from = init->getInit_from_array();
+
+ if (init_from.getCount() > i)
+ {
+ domImage* image = daeSafeCast<domImage>(init_from[i]->getValue().getElement());
+ if (image)
+ {
+ // we only support init_from now - embedded data will come later
+ domImage::domInit_from* init = image->getInit_from();
+ if (init)
+ {
+ mat.mDiffuseMapFilename = cdom::uriToNativePath(init->getValue().str());
+ mat.mDiffuseMapLabel = getElementLabel(material);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else if (texture->getTexture())
+ {
+ domImage* image = NULL;
+ dae->getDatabase()->getElement((daeElement**) &image, 0, texture->getTexture(), COLLADA_TYPE_IMAGE);
+ if (image)
+ {
+ // we only support init_from now - embedded data will come later
+ domImage::domInit_from* init = image->getInit_from();
+ if (init)
+ {
+ std::string image_path_value = cdom::uriToNativePath(init->getValue().str());
+
+#if LL_WINDOWS
+ // Work-around DOM tendency to resort to UNC names which are only confusing for downstream...
+ //
+ std::string::iterator i = image_path_value.begin();
+ while (*i == '\\')
+ i++;
+ mat.mDiffuseMapFilename.assign(i, image_path_value.end());
+#else
+ mat.mDiffuseMapFilename = image_path_value;
+#endif
+ mat.mDiffuseMapLabel = getElementLabel(material);
+ }
+ }
+ }
+ }
+
+ domCommon_color_or_texture_type_complexType::domColor* color =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(diffuse->getDescendant("color"));
+ if (color)
+ {
+ domFx_color_common domfx_color = color->getValue();
+ LLColor4 value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
+ mat.mDiffuseColor = value;
+ }
+ }
+
+ daeElement* emission = material->getDescendant("emission");
+ if (emission)
+ {
+ LLColor4 emission_color = getDaeColor(emission);
+ if (((emission_color[0] + emission_color[1] + emission_color[2]) / 3.0) > 0.25)
+ {
+ mat.mFullbright = TRUE;
+ }
+ }
+
+ return mat;
+}
+
+// try to get a decent label for this element
+std::string LLDAELoader::getElementLabel(daeElement *element)
+{
+ // if we have a name attribute, use it
+ std::string name = element->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if we have an ID attribute, use it
+ if (element->getID())
+ {
+ return std::string(element->getID());
+ }
+
+ // if we have a parent, use it
+ daeElement* parent = element->getParent();
+ std::string index_string;
+ if (parent)
+ {
+ // retrieve index to distinguish items inside same parent
+ size_t ind = 0;
+ parent->getChildren().find(element, ind);
+ index_string = "_" + boost::lexical_cast<std::string>(ind);
+
+ // if parent has a name or ID, use it
+ std::string name = parent->getAttribute("name");
+ if (!name.length())
+ {
+ name = std::string(parent->getID());
+ }
+
+ if (name.length())
+ {
+ // make sure that index won't mix up with pre-named lod extensions
+ size_t ext_pos = getSuffixPosition(name);
+
+ if (ext_pos == -1)
+ {
+ return name + index_string;
+ }
+ else
+ {
+ return name.insert(ext_pos, index_string);
+ }
+ }
+ }
+
+ // try to use our type
+ daeString element_name = element->getElementName();
+ if (element_name)
+ {
+ return std::string(element_name) + index_string;
+ }
+
+ // if all else fails, use "object"
+ return std::string("object") + index_string;
+}
+
+// static
+size_t LLDAELoader::getSuffixPosition(std::string label)
+{
+ if ((label.find("_LOD") != -1) || (label.find("_PHYS") != -1))
+ {
+ return label.rfind('_');
+ }
+ return -1;
+}
+
+// static
+std::string LLDAELoader::getLodlessLabel(daeElement *element)
+{
+ std::string label = getElementLabel(element);
+ size_t ext_pos = getSuffixPosition(label);
+ if (ext_pos != -1)
+ {
+ return label.substr(0, ext_pos);
+ }
+ return label;
+}
+
+LLColor4 LLDAELoader::getDaeColor(daeElement* element)
+{
+ LLColor4 value;
+ domCommon_color_or_texture_type_complexType::domColor* color =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(element->getDescendant("color"));
+ if (color)
+ {
+ domFx_color_common domfx_color = color->getValue();
+ value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
+ }
+
+ return value;
+}
+
+bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)
+{
+ LLModel::EModelStatus status = LLModel::NO_ERRORS;
+ domTriangles_Array& tris = mesh->getTriangles_array();
+
+ for (U32 i = 0; i < tris.getCount(); ++i)
+ {
+ domTrianglesRef& tri = tris.get(i);
+
+ status = load_face_from_dom_triangles(pModel->getVolumeFaces(), pModel->getMaterialList(), tri);
+ pModel->mStatus = status;
+ if(status != LLModel::NO_ERRORS)
+ {
+ pModel->ClearFacesAndMaterials();
+ return false;
+ }
+ }
+
+ domPolylist_Array& polys = mesh->getPolylist_array();
+ for (U32 i = 0; i < polys.getCount(); ++i)
+ {
+ domPolylistRef& poly = polys.get(i);
+ status = load_face_from_dom_polylist(pModel->getVolumeFaces(), pModel->getMaterialList(), poly);
+
+ if(status != LLModel::NO_ERRORS)
+ {
+ pModel->ClearFacesAndMaterials();
+ return false;
+ }
+ }
+
+ domPolygons_Array& polygons = mesh->getPolygons_array();
+
+ for (U32 i = 0; i < polygons.getCount(); ++i)
+ {
+ domPolygonsRef& poly = polygons.get(i);
+ status = load_face_from_dom_polygons(pModel->getVolumeFaces(), pModel->getMaterialList(), poly);
+
+ if(status != LLModel::NO_ERRORS)
+ {
+ pModel->ClearFacesAndMaterials();
+ return false;
+ }
+ }
+
+ return (status == LLModel::NO_ERRORS);
+}
+
+//static
+LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
+{
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ LLModel* ret = new LLModel(volume_params, 0.f);
+ createVolumeFacesFromDomMesh(ret, mesh);
+ if (ret->mLabel.empty())
+ {
+ ret->mLabel = getElementLabel(mesh);
+ }
+ return ret;
+}
+
+//static diff version supports creating multiple models when material counts spill
+// over the 8 face server-side limit
+//
+bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit)
+{
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ models_out.clear();
+
+ LLModel* ret = new LLModel(volume_params, 0.f);
+
+ std::string model_name = getLodlessLabel(mesh);
+ ret->mLabel = model_name + lod_suffix[mLod];
+
+ llassert(!ret->mLabel.empty());
+
+ // Like a monkey, ready to be shot into space
+ //
+ ret->ClearFacesAndMaterials();
+
+ // Get the whole set of volume faces
+ //
+ addVolumeFacesFromDomMesh(ret, mesh);
+
+ U32 volume_faces = ret->getNumVolumeFaces();
+
+ // Side-steps all manner of issues when splitting models
+ // and matching lower LOD materials to base models
+ //
+ ret->sortVolumeFacesByMaterialName();
+
+ bool normalized = false;
+
+ int submodelID = 0;
+
+ // remove all faces that definitely won't fit into one model and submodel limit
+ U32 face_limit = (submodel_limit + 1) * LL_SCULPT_MESH_MAX_FACES;
+ if (face_limit < volume_faces)
+ {
+ ret->setNumVolumeFaces(face_limit);
+ }
+
+ LLVolume::face_list_t remainder;
+ do
+ {
+ // Insure we do this once with the whole gang and not per-model
+ //
+ if (!normalized && !mNoNormalize)
+ {
+ normalized = true;
+ ret->normalizeVolumeFaces();
+ }
+
+ ret->trimVolumeFacesToSize(LL_SCULPT_MESH_MAX_FACES, &remainder);
+
+ if (!mNoOptimize)
+ {
+ ret->optimizeVolumeFaces();
+ }
+
+ volume_faces = remainder.size();
+
+ models_out.push_back(ret);
+
+ // If we have left-over volume faces, create another model
+ // to absorb them...
+ //
+ if (volume_faces)
+ {
+ LLModel* next = new LLModel(volume_params, 0.f);
+ next->mSubmodelID = ++submodelID;
+ next->mLabel = model_name + (char)((int)'a' + next->mSubmodelID) + lod_suffix[mLod];
+ next->getVolumeFaces() = remainder;
+ next->mNormalizedScale = ret->mNormalizedScale;
+ next->mNormalizedTranslation = ret->mNormalizedTranslation;
+ if ( ret->mMaterialList.size() > LL_SCULPT_MESH_MAX_FACES)
+ {
+ next->mMaterialList.assign(ret->mMaterialList.begin() + LL_SCULPT_MESH_MAX_FACES, ret->mMaterialList.end());
+ }
+ ret = next;
+ }
+
+ remainder.clear();
+
+ } while (volume_faces);
+
+ return true;
+}
+
+bool LLDAELoader::createVolumeFacesFromDomMesh(LLModel* pModel, domMesh* mesh)
+{
+ if (mesh)
+ {
+ pModel->ClearFacesAndMaterials();
+
+ addVolumeFacesFromDomMesh(pModel, mesh);
+
+ if (pModel->getNumVolumeFaces() > 0)
+ {
+ pModel->normalizeVolumeFaces();
+ pModel->optimizeVolumeFaces();
+
+ if (pModel->getNumVolumeFaces() > 0)
+ {
+ return true;
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS() << "no mesh found" << LL_ENDL;
+ }
+
+ return false;
+}
diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h
new file mode 100644
index 0000000000..7d91a6063b
--- /dev/null
+++ b/indra/llprimitive/lldaeloader.h
@@ -0,0 +1,107 @@
+/**
+ * @file lldaeloader.h
+ * @brief LLDAELoader class definition
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLDAELOADER_H
+#define LL_LLDAELOADER_H
+
+#include "llmodelloader.h"
+
+class DAE;
+class daeElement;
+class domProfile_COMMON;
+class domInstance_geometry;
+class domNode;
+class domTranslate;
+class domController;
+class domSkin;
+class domMesh;
+
+class LLDAELoader : public LLModelLoader
+{
+public:
+ typedef std::map<std::string, LLImportMaterial> material_map;
+ typedef std::map<daeElement*, std::vector<LLPointer<LLModel> > > dae_model_map;
+ dae_model_map mModelsMap;
+
+ LLDAELoader(
+ std::string filename,
+ S32 lod,
+ LLModelLoader::load_callback_t load_cb,
+ LLModelLoader::joint_lookup_func_t joint_lookup_func,
+ LLModelLoader::texture_load_func_t texture_load_func,
+ LLModelLoader::state_callback_t state_cb,
+ void* opaque_userdata,
+ JointTransformMap& jointMap,
+ JointSet& jointsFromNodes,
+ U32 modelLimit);
+ virtual ~LLDAELoader() ;
+
+ virtual bool OpenFile(const std::string& filename);
+
+protected:
+
+ void processElement(daeElement* element, bool& badElement, DAE* dae);
+ void processDomModel(LLModel* model, DAE* dae, daeElement* pRoot, domMesh* mesh, domSkin* skin);
+
+ material_map getMaterials(LLModel* model, domInstance_geometry* instance_geo, DAE* dae);
+ LLImportMaterial profileToMaterial(domProfile_COMMON* material, DAE* dae);
+ LLColor4 getDaeColor(daeElement* element);
+
+ daeElement* getChildFromElement( daeElement* pElement, std::string const & name );
+
+ bool isNodeAJoint( domNode* pNode );
+ void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );
+ void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
+ void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
+ void extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform );
+ void buildJointToNodeMappingFromScene( daeElement* pRoot );
+ void processJointToNodeMapping( domNode* pNode );
+ void processChildJoints( domNode* pParentNode );
+
+ bool verifyCount( int expected, int result );
+
+ //Verify that a controller matches vertex counts
+ bool verifyController( domController* pController );
+
+ static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh);
+ static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh);
+
+ static LLModel* loadModelFromDomMesh(domMesh* mesh);
+
+ // Loads a mesh breaking it into one or more models as necessary
+ // to get around volume face limitations while retaining >8 materials
+ //
+ bool loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit);
+
+ static std::string getElementLabel(daeElement *element);
+ static size_t getSuffixPosition(std::string label);
+ static std::string getLodlessLabel(daeElement *element);
+
+private:
+ U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
+
+};
+#endif // LL_LLDAELLOADER_H
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index ed903146ef..e494c55250 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -31,18 +31,6 @@
#include "llconvexdecomposition.h"
#include "llsdserialize.h"
#include "llvector4a.h"
-#if LL_MSVC
-#pragma warning (disable : 4263)
-#pragma warning (disable : 4264)
-#endif
-#include "dae.h"
-#include "dae/daeErrorHandler.h"
-#include "dom/domConstants.h"
-#include "dom/domMesh.h"
-#if LL_MSVC
-#pragma warning (default : 4263)
-#pragma warning (default : 4264)
-#endif
#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
@@ -50,8 +38,6 @@
# include "zlib/zlib.h"
#endif
-
-
std::string model_names[] =
{
"lowest_lod",
@@ -65,7 +51,7 @@ const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
LLModel::LLModel(LLVolumeParams& params, F32 detail)
: LLVolume(params, detail), mNormalizedScale(1,1,1), mNormalizedTranslation(0,0,0)
- , mPelvisOffset( 0.0f ), mStatus(NO_ERRORS)
+ , mPelvisOffset( 0.0f ), mStatus(NO_ERRORS), mSubmodelID(0)
{
mDecompID = -1;
mLocalID = -1;
@@ -79,939 +65,112 @@ LLModel::~LLModel()
}
}
-
-bool get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride,
- domSource* &pos_source, domSource* &tc_source, domSource* &norm_source)
+//static
+std::string LLModel::getStatusString(U32 status)
{
- idx_stride = 0;
+ const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow","bad_element"};
- for (U32 j = 0; j < inputs.getCount(); ++j)
+ if(status < INVALID_STATUS)
{
- idx_stride = llmax((S32) inputs[j]->getOffset(), idx_stride);
-
- if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[j]->getSemantic()) == 0)
- { //found vertex array
- const domURIFragmentType& uri = inputs[j]->getSource();
- daeElementRef elem = uri.getElement();
- domVertices* vertices = (domVertices*) elem.cast();
- if ( !vertices )
- {
- return false;
- }
-
- domInputLocal_Array& v_inp = vertices->getInput_array();
-
-
- for (U32 k = 0; k < v_inp.getCount(); ++k)
- {
- if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
- {
- pos_offset = inputs[j]->getOffset();
-
- const domURIFragmentType& uri = v_inp[k]->getSource();
- daeElementRef elem = uri.getElement();
- pos_source = (domSource*) elem.cast();
- }
-
- if (strcmp(COMMON_PROFILE_INPUT_NORMAL, v_inp[k]->getSemantic()) == 0)
- {
- norm_offset = inputs[j]->getOffset();
-
- const domURIFragmentType& uri = v_inp[k]->getSource();
- daeElementRef elem = uri.getElement();
- norm_source = (domSource*) elem.cast();
- }
- }
- }
-
- if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[j]->getSemantic()) == 0)
+ if(status_strings[status] == std::string())
{
- //found normal array for this triangle list
- norm_offset = inputs[j]->getOffset();
- const domURIFragmentType& uri = inputs[j]->getSource();
- daeElementRef elem = uri.getElement();
- norm_source = (domSource*) elem.cast();
+ //LL_ERRS() << "No valid status string for this status: " << (U32)status << LL_ENDL();
}
- else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[j]->getSemantic()) == 0)
- { //found texCoords
- tc_offset = inputs[j]->getOffset();
- const domURIFragmentType& uri = inputs[j]->getSource();
- daeElementRef elem = uri.getElement();
- tc_source = (domSource*) elem.cast();
- }
- }
-
- idx_stride += 1;
-
- return true;
-}
-
-LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
-{
- LLVolumeFace face;
- std::vector<LLVolumeFace::VertexData> verts;
- std::vector<U16> indices;
-
- const domInputLocalOffset_Array& inputs = tri->getInput_array();
-
- S32 pos_offset = -1;
- S32 tc_offset = -1;
- S32 norm_offset = -1;
-
- domSource* pos_source = NULL;
- domSource* tc_source = NULL;
- domSource* norm_source = NULL;
-
- S32 idx_stride = 0;
-
- if ( !get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source) || !pos_source )
- {
- LL_WARNS() << "Could not find dom sources for basic geo data; invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
+ return status_strings[status] ;
}
- if (!pos_source)
- {
- LL_WARNS() << "Unable to process mesh without position data; invalid model; invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- domPRef p = tri->getP();
- domListOfUInts& idx = p->getValue();
-
- domListOfFloats dummy ;
- domListOfFloats& v = (pos_source && pos_source->getFloat_array()) ? pos_source->getFloat_array()->getValue() : dummy ;
- domListOfFloats& tc = (tc_source && tc_source->getFloat_array()) ? tc_source->getFloat_array()->getValue() : dummy ;
- domListOfFloats& n = (norm_source && norm_source->getFloat_array()) ? norm_source->getFloat_array()->getValue() : dummy ;
+ //LL_ERRS() << "Invalid model status: " << (U32)status << LL_ENDL();
- LLVolumeFace::VertexMapData::PointMap point_map;
-
- U32 index_count = idx.getCount();
- U32 vertex_count = (pos_source && pos_source->getFloat_array()) ? v.getCount() : 0;
- U32 tc_count = (tc_source && tc_source->getFloat_array()) ? tc.getCount() : 0;
- U32 norm_count = (norm_source && norm_source->getFloat_array()) ? n.getCount(): 0;
+ return std::string() ;
+}
- if (vertex_count == 0)
- {
- LL_WARNS() << "Unable to process mesh with empty position array; invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- face.mExtents[0].set(v[0], v[1], v[2]);
- face.mExtents[1].set(v[0], v[1], v[2]);
+void LLModel::offsetMesh( const LLVector3& pivotPoint )
+{
+ LLVector4a pivot( pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ] );
- for (U32 i = 0; i < index_count; i += idx_stride)
- {
- LLVolumeFace::VertexData cv;
- if (pos_source)
- {
- // guard against model data specifiying out of range indices or verts
- //
- if (((i + pos_offset) > index_count)
- || ((idx[i+pos_offset]*3+2) > vertex_count))
- {
- LL_WARNS() << "Out of range index data; invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- cv.setPosition(LLVector4a(v[idx[i+pos_offset]*3+0],
- v[idx[i+pos_offset]*3+1],
- v[idx[i+pos_offset]*3+2]));
-
- if (!cv.getPosition().isFinite3())
- {
- LL_WARNS() << "Nan positional data, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
-
- if (tc_source)
- {
- // guard against model data specifiying out of range indices or tcs
- //
-
- if (((i + tc_offset) > index_count)
- || ((idx[i+tc_offset]*2+1) > tc_count))
- {
- LL_WARNS() << "Out of range TC indices." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- cv.mTexCoord.setVec(tc[idx[i+tc_offset]*2+0],
- tc[idx[i+tc_offset]*2+1]);
-
- if (!cv.mTexCoord.isFinite())
- {
- LL_WARNS() << "Found NaN while loading tex coords from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
-
- if (norm_source)
- {
- // guard against model data specifiying out of range indices or norms
- //
- if (((i + norm_offset) > index_count)
- || ((idx[i+norm_offset]*3+2) > norm_count))
- {
- LL_WARNS() << "Found out of range norm indices, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- cv.setNormal(LLVector4a(n[idx[i+norm_offset]*3+0],
- n[idx[i+norm_offset]*3+1],
- n[idx[i+norm_offset]*3+2]));
-
- if (!cv.getNormal().isFinite3())
- {
- LL_WARNS() << "Found NaN while loading normals from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
-
- BOOL found = FALSE;
-
- LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
- point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr()));
-
- if (point_iter != point_map.end())
- {
- for (U32 j = 0; j < point_iter->second.size(); ++j)
- {
- if ((point_iter->second)[j] == cv)
- {
- found = TRUE;
- indices.push_back((point_iter->second)[j].mIndex);
- break;
- }
- }
- }
-
- if (!found)
- {
- update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
- verts.push_back(cv);
- if (verts.size() >= 65535)
- {
- //LL_ERRS() << "Attempted to write model exceeding 16-bit index buffer limitation." << LL_ENDL;
- return LLModel::VERTEX_NUMBER_OVERFLOW ;
- }
- U16 index = (U16) (verts.size()-1);
- indices.push_back(index);
-
- LLVolumeFace::VertexMapData d;
- d.setPosition(cv.getPosition());
- d.mTexCoord = cv.mTexCoord;
- d.setNormal(cv.getNormal());
- d.mIndex = index;
- if (point_iter != point_map.end())
- {
- point_iter->second.push_back(d);
- }
- else
- {
- point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d);
- }
- }
-
- if (indices.size()%3 == 0 && verts.size() >= 65532)
- {
- std::string material;
-
- if (tri->getMaterial())
- {
- material = std::string(tri->getMaterial());
- }
-
- materials.push_back(material);
- face_list.push_back(face);
- face_list.rbegin()->fillFromLegacyData(verts, indices);
- LLVolumeFace& new_face = *face_list.rbegin();
- if (!norm_source)
- {
- //ll_aligned_free_16(new_face.mNormals);
- new_face.mNormals = NULL;
- }
-
- if (!tc_source)
- {
- //ll_aligned_free_16(new_face.mTexCoords);
- new_face.mTexCoords = NULL;
- }
-
- face = LLVolumeFace();
- point_map.clear();
- }
- }
-
- if (!verts.empty())
+ for (std::vector<LLVolumeFace>::iterator faceIt = mVolumeFaces.begin(); faceIt != mVolumeFaces.end(); )
{
- std::string material;
-
- if (tri->getMaterial())
- {
- material = std::string(tri->getMaterial());
- }
+ std::vector<LLVolumeFace>:: iterator currentFaceIt = faceIt++;
+ LLVolumeFace& face = *currentFaceIt;
+ LLVector4a *pos = (LLVector4a*) face.mPositions;
- materials.push_back(material);
- face_list.push_back(face);
-
- face_list.rbegin()->fillFromLegacyData(verts, indices);
- LLVolumeFace& new_face = *face_list.rbegin();
- if (!norm_source)
- {
- //ll_aligned_free_16(new_face.mNormals);
- new_face.mNormals = NULL;
- }
-
- if (!tc_source)
+ for (U32 i=0; i<face.mNumVertices; ++i )
{
- //ll_aligned_free_16(new_face.mTexCoords);
- new_face.mTexCoords = NULL;
+ pos[i].add( pivot );
}
}
-
- return LLModel::NO_ERRORS ;
}
-LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
+void LLModel::optimizeVolumeFaces()
{
- domPRef p = poly->getP();
- domListOfUInts& idx = p->getValue();
-
- if (idx.getCount() == 0)
- {
- return LLModel::NO_ERRORS ;
- }
-
- const domInputLocalOffset_Array& inputs = poly->getInput_array();
-
-
- domListOfUInts& vcount = poly->getVcount()->getValue();
-
- S32 pos_offset = -1;
- S32 tc_offset = -1;
- S32 norm_offset = -1;
-
- domSource* pos_source = NULL;
- domSource* tc_source = NULL;
- domSource* norm_source = NULL;
-
- S32 idx_stride = 0;
-
- if (!get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source))
- {
- LL_WARNS() << "Could not get DOM sources for basic geo data, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- LLVolumeFace face;
-
- std::vector<U16> indices;
- std::vector<LLVolumeFace::VertexData> verts;
-
- domListOfFloats v;
- domListOfFloats tc;
- domListOfFloats n;
-
- if (pos_source)
- {
- v = pos_source->getFloat_array()->getValue();
- face.mExtents[0].set(v[0], v[1], v[2]);
- face.mExtents[1].set(v[0], v[1], v[2]);
- }
-
- if (tc_source)
- {
- tc = tc_source->getFloat_array()->getValue();
- }
-
- if (norm_source)
- {
- n = norm_source->getFloat_array()->getValue();
- }
-
- LLVolumeFace::VertexMapData::PointMap point_map;
-
- U32 index_count = idx.getCount();
- U32 vertex_count = pos_source ? v.getCount() : 0;
- U32 tc_count = tc_source ? tc.getCount() : 0;
- U32 norm_count = norm_source ? n.getCount() : 0;
-
- U32 cur_idx = 0;
- for (U32 i = 0; i < vcount.getCount(); ++i)
- { //for each polygon
- U32 first_index = 0;
- U32 last_index = 0;
- for (U32 j = 0; j < vcount[i]; ++j)
- { //for each vertex
-
- LLVolumeFace::VertexData cv;
-
- if (pos_source)
- {
- // guard against model data specifiying out of range indices or verts
- //
- if (((cur_idx + pos_offset) > index_count)
- || ((idx[cur_idx+pos_offset]*3+2) > vertex_count))
- {
- LL_WARNS() << "Out of range position indices, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- cv.getPosition().set(v[idx[cur_idx+pos_offset]*3+0],
- v[idx[cur_idx+pos_offset]*3+1],
- v[idx[cur_idx+pos_offset]*3+2]);
-
- if (!cv.getPosition().isFinite3())
- {
- LL_WARNS() << "Found NaN while loading positions from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- }
-
- if (tc_source)
- {
- // guard against model data specifiying out of range indices or tcs
- //
- if (((cur_idx + tc_offset) > index_count)
- || ((idx[cur_idx+tc_offset]*2+1) > tc_count))
- {
- LL_WARNS() << "Out of range TC indices, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0],
- tc[idx[cur_idx+tc_offset]*2+1]);
-
- if (!cv.mTexCoord.isFinite())
- {
- LL_WARNS() << "Found NaN while loading tex coords from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
-
- if (norm_source)
- {
- // guard against model data specifiying out of range indices or norms
- //
- if (((cur_idx + norm_offset) > index_count)
- || ((idx[cur_idx+norm_offset]*3+2) > norm_count))
- {
- LL_WARNS() << "Out of range norm indices, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
-
- cv.getNormal().set(n[idx[cur_idx+norm_offset]*3+0],
- n[idx[cur_idx+norm_offset]*3+1],
- n[idx[cur_idx+norm_offset]*3+2]);
-
- if (!cv.getNormal().isFinite3())
- {
- LL_WARNS() << "Found NaN while loading normals from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
-
- cur_idx += idx_stride;
-
- BOOL found = FALSE;
-
- LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
- LLVector3 pos3(cv.getPosition().getF32ptr());
- point_iter = point_map.find(pos3);
-
- if (point_iter != point_map.end())
- {
- for (U32 k = 0; k < point_iter->second.size(); ++k)
- {
- if ((point_iter->second)[k] == cv)
- {
- found = TRUE;
- U32 index = (point_iter->second)[k].mIndex;
- if (j == 0)
- {
- first_index = index;
- }
- else if (j == 1)
- {
- last_index = index;
- }
- else
- {
- indices.push_back(first_index);
- indices.push_back(last_index);
- indices.push_back(index);
- last_index = index;
- }
-
- break;
- }
- }
- }
-
- if (!found)
- {
- update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
- verts.push_back(cv);
- if (verts.size() >= 65535)
- {
- //LL_ERRS() << "Attempted to write model exceeding 16-bit index buffer limitation." << LL_ENDL;
- return LLModel::VERTEX_NUMBER_OVERFLOW ;
- }
- U16 index = (U16) (verts.size()-1);
-
- if (j == 0)
- {
- first_index = index;
- }
- else if (j == 1)
- {
- last_index = index;
- }
- else
- {
- indices.push_back(first_index);
- indices.push_back(last_index);
- indices.push_back(index);
- last_index = index;
- }
-
- LLVolumeFace::VertexMapData d;
- d.setPosition(cv.getPosition());
- d.mTexCoord = cv.mTexCoord;
- d.setNormal(cv.getNormal());
- d.mIndex = index;
- if (point_iter != point_map.end())
- {
- point_iter->second.push_back(d);
- }
- else
- {
- point_map[pos3].push_back(d);
- }
- }
-
- if (indices.size()%3 == 0 && indices.size() >= 65532)
- {
- std::string material;
-
- if (poly->getMaterial())
- {
- material = std::string(poly->getMaterial());
- }
-
- materials.push_back(material);
- face_list.push_back(face);
- face_list.rbegin()->fillFromLegacyData(verts, indices);
- LLVolumeFace& new_face = *face_list.rbegin();
- if (!norm_source)
- {
- //ll_aligned_free_16(new_face.mNormals);
- new_face.mNormals = NULL;
- }
-
- if (!tc_source)
- {
- //ll_aligned_free_16(new_face.mTexCoords);
- new_face.mTexCoords = NULL;
- }
-
- face = LLVolumeFace();
- verts.clear();
- indices.clear();
- point_map.clear();
- }
- }
- }
-
- if (!verts.empty())
+ for (U32 i = 0; i < getNumVolumeFaces(); ++i)
{
- std::string material;
-
- if (poly->getMaterial())
- {
- material = std::string(poly->getMaterial());
- }
-
- materials.push_back(material);
- face_list.push_back(face);
- face_list.rbegin()->fillFromLegacyData(verts, indices);
-
- LLVolumeFace& new_face = *face_list.rbegin();
- if (!norm_source)
- {
- //ll_aligned_free_16(new_face.mNormals);
- new_face.mNormals = NULL;
- }
-
- if (!tc_source)
- {
- //ll_aligned_free_16(new_face.mTexCoords);
- new_face.mTexCoords = NULL;
- }
+ mVolumeFaces[i].optimize();
}
-
- return LLModel::NO_ERRORS ;
}
-LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolygonsRef& poly)
+struct MaterialBinding
{
- LLVolumeFace face;
- std::vector<U16> indices;
- std::vector<LLVolumeFace::VertexData> verts;
-
- const domInputLocalOffset_Array& inputs = poly->getInput_array();
-
- S32 v_offset = -1;
- S32 n_offset = -1;
- S32 t_offset = -1;
-
- domListOfFloats* v = NULL;
- domListOfFloats* n = NULL;
- domListOfFloats* t = NULL;
-
- U32 stride = 0;
- for (U32 i = 0; i < inputs.getCount(); ++i)
- {
- stride = llmax((U32) inputs[i]->getOffset()+1, stride);
-
- if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[i]->getSemantic()) == 0)
- { //found vertex array
- v_offset = inputs[i]->getOffset();
-
- const domURIFragmentType& uri = inputs[i]->getSource();
- daeElementRef elem = uri.getElement();
- domVertices* vertices = (domVertices*) elem.cast();
- if (!vertices)
- {
- LL_WARNS() << "Could not find vertex source, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- domInputLocal_Array& v_inp = vertices->getInput_array();
-
- for (U32 k = 0; k < v_inp.getCount(); ++k)
- {
- if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
- {
- const domURIFragmentType& uri = v_inp[k]->getSource();
- daeElementRef elem = uri.getElement();
- domSource* src = (domSource*) elem.cast();
- if (!src)
- {
- LL_WARNS() << "Could not find DOM source, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- v = &(src->getFloat_array()->getValue());
- }
- }
- }
- else if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[i]->getSemantic()) == 0)
- {
- n_offset = inputs[i]->getOffset();
- //found normal array for this triangle list
- const domURIFragmentType& uri = inputs[i]->getSource();
- daeElementRef elem = uri.getElement();
- domSource* src = (domSource*) elem.cast();
- if (!src)
- {
- LL_WARNS() << "Could not find DOM source, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- n = &(src->getFloat_array()->getValue());
- }
- else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[i]->getSemantic()) == 0 && inputs[i]->getSet() == 0)
- { //found texCoords
- t_offset = inputs[i]->getOffset();
- const domURIFragmentType& uri = inputs[i]->getSource();
- daeElementRef elem = uri.getElement();
- domSource* src = (domSource*) elem.cast();
- if (!src)
- {
- LL_WARNS() << "Could not find DOM source, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- t = &(src->getFloat_array()->getValue());
- }
- }
-
- domP_Array& ps = poly->getP_array();
-
- //make a triangle list in <verts>
- for (U32 i = 0; i < ps.getCount(); ++i)
- { //for each polygon
- domListOfUInts& idx = ps[i]->getValue();
- for (U32 j = 0; j < idx.getCount()/stride; ++j)
- { //for each vertex
- if (j > 2)
- {
- U32 size = verts.size();
- LLVolumeFace::VertexData v0 = verts[size-3];
- LLVolumeFace::VertexData v1 = verts[size-1];
-
- verts.push_back(v0);
- verts.push_back(v1);
- }
-
- LLVolumeFace::VertexData vert;
-
-
- if (v)
- {
- U32 v_idx = idx[j*stride+v_offset]*3;
- v_idx = llclamp(v_idx, (U32) 0, (U32) v->getCount());
- vert.getPosition().set(v->get(v_idx),
- v->get(v_idx+1),
- v->get(v_idx+2));
-
- if (!vert.getPosition().isFinite3())
- {
- LL_WARNS() << "Found NaN while loading position data from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
-
- //bounds check n and t lookups because some FBX to DAE converters
- //use negative indices and empty arrays to indicate data does not exist
- //for a particular channel
- if (n && n->getCount() > 0)
- {
- U32 n_idx = idx[j*stride+n_offset]*3;
- n_idx = llclamp(n_idx, (U32) 0, (U32) n->getCount());
- vert.getNormal().set(n->get(n_idx),
- n->get(n_idx+1),
- n->get(n_idx+2));
-
- if (!vert.getNormal().isFinite3())
- {
- LL_WARNS() << "Found NaN while loading normals from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
- else
- {
- vert.getNormal().clear();
- }
-
-
- if (t && t->getCount() > 0)
- {
- U32 t_idx = idx[j*stride+t_offset]*2;
- t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount());
- vert.mTexCoord.setVec(t->get(t_idx),
- t->get(t_idx+1));
-
- if (!vert.mTexCoord.isFinite())
- {
- LL_WARNS() << "Found NaN while loading tex coords from DAE-Model, invalid model." << LL_ENDL;
- return LLModel::BAD_ELEMENT;
- }
- }
- else
- {
- vert.mTexCoord.clear();
- }
-
-
- verts.push_back(vert);
- }
- }
-
- if (verts.empty())
- {
- return LLModel::NO_ERRORS;
- }
-
- face.mExtents[0] = verts[0].getPosition();
- face.mExtents[1] = verts[0].getPosition();
-
- //create a map of unique vertices to indices
- std::map<LLVolumeFace::VertexData, U32> vert_idx;
-
- U32 cur_idx = 0;
- for (U32 i = 0; i < verts.size(); ++i)
- {
- std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.find(verts[i]);
- if (iter == vert_idx.end())
- {
- vert_idx[verts[i]] = cur_idx++;
- }
- }
-
- //build vertex array from map
- std::vector<LLVolumeFace::VertexData> new_verts;
- new_verts.resize(vert_idx.size());
-
- for (std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.begin(); iter != vert_idx.end(); ++iter)
- {
- new_verts[iter->second] = iter->first;
- update_min_max(face.mExtents[0], face.mExtents[1], iter->first.getPosition());
- }
-
- //build index array from map
- indices.resize(verts.size());
-
- for (U32 i = 0; i < verts.size(); ++i)
- {
- indices[i] = vert_idx[verts[i]];
- }
-
- // DEBUG just build an expanded triangle list
- /*for (U32 i = 0; i < verts.size(); ++i)
- {
- indices.push_back((U16) i);
- update_min_max(face.mExtents[0], face.mExtents[1], verts[i].getPosition());
- }*/
-
- if (!new_verts.empty())
- {
- std::string material;
-
- if (poly->getMaterial())
- {
- material = std::string(poly->getMaterial());
- }
-
- materials.push_back(material);
- face_list.push_back(face);
- face_list.rbegin()->fillFromLegacyData(new_verts, indices);
-
- LLVolumeFace& new_face = *face_list.rbegin();
- if (!n)
- {
- //ll_aligned_free_16(new_face.mNormals);
- new_face.mNormals = NULL;
- }
-
- if (!t)
- {
- //ll_aligned_free_16(new_face.mTexCoords);
- new_face.mTexCoords = NULL;
- }
- }
-
- return LLModel::NO_ERRORS ;
-}
+ int index;
+ std::string matName;
+};
-//static
-std::string LLModel::getStatusString(U32 status)
+struct MaterialSort
{
- const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow","bad_element"};
-
- if(status < INVALID_STATUS)
+ bool operator()(const MaterialBinding& lhs, const MaterialBinding& rhs)
{
- if(status_strings[status] == std::string())
- {
- LL_ERRS() << "No valid status string for this status: " << (U32)status << LL_ENDL ;
- }
- return status_strings[status] ;
+ return LLStringUtil::compareInsensitive(lhs.matName, rhs.matName) < 0;
}
+};
- LL_ERRS() << "Invalid model status: " << (U32)status << LL_ENDL ;
-
- return std::string() ;
-}
-
-void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
+void LLModel::sortVolumeFacesByMaterialName()
{
- domTriangles_Array& tris = mesh->getTriangles_array();
-
- for (U32 i = 0; i < tris.getCount(); ++i)
- {
- domTrianglesRef& tri = tris.get(i);
+ std::vector<MaterialBinding> bindings;
+ bindings.resize(mVolumeFaces.size());
- mStatus = load_face_from_dom_triangles(mVolumeFaces, mMaterialList, tri);
-
- if(mStatus != NO_ERRORS)
+ for (int i = 0; i < bindings.size(); i++)
+ {
+ bindings[i].index = i;
+ if(i < mMaterialList.size())
{
- mVolumeFaces.clear() ;
- mMaterialList.clear() ;
- return ; //abort
+ bindings[i].matName = mMaterialList[i];
}
}
+ std::sort(bindings.begin(), bindings.end(), MaterialSort());
+ std::vector< LLVolumeFace > new_faces;
- domPolylist_Array& polys = mesh->getPolylist_array();
- for (U32 i = 0; i < polys.getCount(); ++i)
+ // remap the faces to be in the same order the mats now are...
+ //
+ new_faces.resize(bindings.size());
+ for (int i = 0; i < bindings.size(); i++)
{
- domPolylistRef& poly = polys.get(i);
- mStatus = load_face_from_dom_polylist(mVolumeFaces, mMaterialList, poly);
-
- if(mStatus != NO_ERRORS)
+ new_faces[i] = mVolumeFaces[bindings[i].index];
+ if(i < mMaterialList.size())
{
- mVolumeFaces.clear() ;
- mMaterialList.clear() ;
- return ; //abort
+ mMaterialList[i] = bindings[i].matName;
}
}
-
- domPolygons_Array& polygons = mesh->getPolygons_array();
-
- for (U32 i = 0; i < polygons.getCount(); ++i)
- {
- domPolygonsRef& poly = polygons.get(i);
- mStatus = load_face_from_dom_polygons(mVolumeFaces, mMaterialList, poly);
- if(mStatus != NO_ERRORS)
- {
- mVolumeFaces.clear() ;
- mMaterialList.clear() ;
- return ; //abort
- }
- }
-
+ mVolumeFaces = new_faces;
}
-BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
+void LLModel::trimVolumeFacesToSize(U32 new_count, LLVolume::face_list_t* remainder)
{
- if (mesh)
- {
- mVolumeFaces.clear();
- mMaterialList.clear();
-
- addVolumeFacesFromDomMesh(mesh);
-
- if (getNumVolumeFaces() > 0)
- {
- normalizeVolumeFaces();
- optimizeVolumeFaces();
-
- if (getNumVolumeFaces() > 0)
- {
- return TRUE;
- }
- }
- }
- else
- {
- LL_WARNS() << "no mesh found" << LL_ENDL;
- }
-
- return FALSE;
-}
+ llassert(new_count <= LL_SCULPT_MESH_MAX_FACES);
-void LLModel::offsetMesh( const LLVector3& pivotPoint )
-{
- LLVector4a pivot( pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ] );
-
- for (std::vector<LLVolumeFace>::iterator faceIt = mVolumeFaces.begin(); faceIt != mVolumeFaces.end(); )
+ if (new_count && (getNumVolumeFaces() > new_count))
{
- std::vector<LLVolumeFace>:: iterator currentFaceIt = faceIt++;
- LLVolumeFace& face = *currentFaceIt;
- LLVector4a *pos = (LLVector4a*) face.mPositions;
-
- for (U32 i=0; i<face.mNumVertices; ++i )
+ // Copy out remaining volume faces for alternative handling, if provided
+ //
+ if (remainder)
{
- pos[i].add( pivot );
- }
- }
-}
+ (*remainder).assign(mVolumeFaces.begin() + new_count, mVolumeFaces.end());
+ }
-void LLModel::optimizeVolumeFaces()
-{
- for (U32 i = 0; i < getNumVolumeFaces(); ++i)
- {
- mVolumeFaces[i].optimize();
+ // Trim down to the final set of volume faces (now stuffed to the gills!)
+ //
+ mVolumeFaces.resize(new_count);
}
}
@@ -1025,11 +184,6 @@ void LLModel::optimizeVolumeFaces()
// within the unit cube.
void LLModel::normalizeVolumeFaces()
{
-
- // ensure we don't have too many faces
- if (mVolumeFaces.size() > LL_SCULPT_MESH_MAX_FACES)
- mVolumeFaces.resize(LL_SCULPT_MESH_MAX_FACES);
-
if (!mVolumeFaces.empty())
{
LLVector4a min, max;
@@ -1496,68 +650,10 @@ void LLModel::generateNormals(F32 angle_cutoff)
}
}
-//static
-std::string LLModel::getElementLabel(daeElement *element)
-{ // try to get a decent label for this element
- // if we have a name attribute, use it
- std::string name = element->getAttribute("name");
- if (name.length())
- {
- return name;
- }
-
- // if we have an ID attribute, use it
- if (element->getID())
- {
- return std::string(element->getID());
- }
-
- // if we have a parent, use it
- daeElement* parent = element->getParent();
- if (parent)
- {
- // if parent has a name, use it
- std::string name = parent->getAttribute("name");
- if (name.length())
- {
- return name;
- }
-
- // if parent has an ID, use it
- if (parent->getID())
- {
- return std::string(parent->getID());
- }
- }
-
- // try to use our type
- daeString element_name = element->getElementName();
- if (element_name)
- {
- return std::string(element_name);
- }
-
- // if all else fails, use "object"
- return std::string("object");
-}
-
-//static
-LLModel* LLModel::loadModelFromDomMesh(domMesh *mesh)
-{
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
- LLModel* ret = new LLModel(volume_params, 0.f);
- ret->createVolumeFacesFromDomMesh(mesh);
- ret->mLabel = getElementLabel(mesh);
- return ret;
-}
std::string LLModel::getName() const
{
- if (!mRequestedLabel.empty())
- return mRequestedLabel;
- else
- return mLabel;
+ return mRequestedLabel.empty() ? mLabel : mRequestedLabel;
}
//static
@@ -1572,7 +668,8 @@ LLSD LLModel::writeModel(
BOOL upload_skin,
BOOL upload_joints,
BOOL nowrite,
- BOOL as_slm)
+ BOOL as_slm,
+ int submodel_id)
{
LLSD mdl;
@@ -1601,6 +698,14 @@ LLSD LLModel::writeModel(
model[LLModel::LOD_PHYSICS] = NULL;
}
}
+ else if (submodel_id)
+ {
+ const LLModel::Decomposition fake_decomp;
+ mdl["secondary"] = true;
+ mdl["submodel_id"] = submodel_id;
+ mdl["physics_convex"] = fake_decomp.asLLSD();
+ model[LLModel::LOD_PHYSICS] = NULL;
+ }
if (as_slm)
{ //save material list names
@@ -1612,7 +717,7 @@ LLSD LLModel::writeModel(
for (U32 idx = 0; idx < MODEL_NAMES_LENGTH; ++idx)
{
- if (model[idx] && model[idx]->getNumVolumeFaces() > 0)
+ if (model[idx] && (model[idx]->getNumVolumeFaces() > 0) && model[idx]->getVolumeFace(0).mPositions != NULL)
{
LLVector3 min_pos = LLVector3(model[idx]->getVolumeFace(0).mPositions[0].getF32ptr());
LLVector3 max_pos = min_pos;
@@ -1845,6 +950,11 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite, BO
}
}
+ if (mdl.has("submodel_id"))
+ { //write out submodel id
+ header["submodel_id"] = (LLSD::Integer)mdl["submodel_id"];
+ }
+
std::string out[MODEL_NAMES_LENGTH];
for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++)
@@ -2028,7 +1138,9 @@ bool LLModel::loadModel(std::istream& is)
}
}
- static const std::string nm[] =
+ mSubmodelID = header.has("submodel_id") ? header["submodel_id"].asInteger() : false;
+
+ static const std::string lod_name[] =
{
"lowest_lod",
"low_lod",
@@ -2041,8 +1153,8 @@ bool LLModel::loadModel(std::istream& is)
S32 lod = llclamp((S32) mDetail, 0, MODEL_LODS);
- if (header[nm[lod]]["offset"].asInteger() == -1 ||
- header[nm[lod]]["size"].asInteger() == 0 )
+ if (header[lod_name[lod]]["offset"].asInteger() == -1 ||
+ header[lod_name[lod]]["size"].asInteger() == 0 )
{ //cannot load requested LOD
LL_WARNS() << "LoD data is invalid!" << LL_ENDL;
return false;
@@ -2051,23 +1163,23 @@ bool LLModel::loadModel(std::istream& is)
bool has_skin = header["skin"]["offset"].asInteger() >=0 &&
header["skin"]["size"].asInteger() > 0;
- if (lod == LLModel::LOD_HIGH)
+ if ((lod == LLModel::LOD_HIGH) && !mSubmodelID)
{ //try to load skin info and decomp info
std::ios::pos_type cur_pos = is.tellg();
loadSkinInfo(header, is);
is.seekg(cur_pos);
}
- if (lod == LLModel::LOD_HIGH || lod == LLModel::LOD_PHYSICS)
+ if ((lod == LLModel::LOD_HIGH || lod == LLModel::LOD_PHYSICS) && !mSubmodelID)
{
std::ios::pos_type cur_pos = is.tellg();
loadDecomposition(header, is);
is.seekg(cur_pos);
}
- is.seekg(header[nm[lod]]["offset"].asInteger(), std::ios_base::cur);
+ is.seekg(header[lod_name[lod]]["offset"].asInteger(), std::ios_base::cur);
- if (unpackVolumeFaces(is, header[nm[lod]]["size"].asInteger()))
+ if (unpackVolumeFaces(is, header[lod_name[lod]]["size"].asInteger()))
{
if (has_skin)
{
@@ -2133,8 +1245,10 @@ bool LLModel::isMaterialListSubset( LLModel* ref )
break;
}
}
+
if (!foundRef)
{
+ LL_INFOS() << "Could not find material " << mMaterialList[src] << " in reference model " << ref->mLabel << LL_ENDL;
return false;
}
}
@@ -2185,41 +1299,42 @@ bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCn
for (U32 i = 0; i < mMaterialList.size(); i++)
{
index_map[ref->mMaterialList[i]] = i;
- if (!reorder)
- { //if any material name does not match reference, we need to reorder
- reorder = ref->mMaterialList[i] != mMaterialList[i];
- }
+ //if any material name does not match reference, we need to reorder
+ reorder |= ref->mMaterialList[i] != mMaterialList[i];
base_mat.insert(ref->mMaterialList[i]);
cur_mat.insert(mMaterialList[i]);
}
- if (reorder &&
- base_mat == cur_mat) //don't reorder if material name sets don't match
+ if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
{
std::vector<LLVolumeFace> new_face_list;
- new_face_list.resize(mVolumeFaces.size());
+ new_face_list.resize(mMaterialList.size());
std::vector<std::string> new_material_list;
- new_material_list.resize(mVolumeFaces.size());
+ new_material_list.resize(mMaterialList.size());
//rebuild face list so materials have the same order
//as the reference model
for (U32 i = 0; i < mMaterialList.size(); ++i)
{
U32 ref_idx = index_map[mMaterialList[i]];
- new_face_list[ref_idx] = mVolumeFaces[i];
+ if (i < mVolumeFaces.size())
+ {
+ new_face_list[ref_idx] = mVolumeFaces[i];
+ }
new_material_list[ref_idx] = mMaterialList[i];
}
llassert(new_material_list == ref->mMaterialList);
mVolumeFaces = new_face_list;
- }
- //override material list with reference model ordering
- mMaterialList = ref->mMaterialList;
+ //override material list with reference model ordering
+ mMaterialList = ref->mMaterialList;
+ }
+
return true;
}
@@ -2250,7 +1365,7 @@ bool LLModel::loadDecomposition(LLSD& header, std::istream& is)
S32 offset = header["physics_convex"]["offset"].asInteger();
S32 size = header["physics_convex"]["size"].asInteger();
- if (offset >= 0 && size > 0)
+ if (offset >= 0 && size > 0 && !mSubmodelID)
{
is.seekg(offset, std::ios_base::cur);
@@ -2658,3 +1773,227 @@ void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs)
}
}
+bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance)
+{
+ // small area check
+ {
+ LLVector4a edge1; edge1.setSub( a, b );
+ LLVector4a edge2; edge2.setSub( a, c );
+ //////////////////////////////////////////////////////////////////////////
+ /// Linden Modified
+ //////////////////////////////////////////////////////////////////////////
+
+ // If no one edge is more than 10x longer than any other edge, we weaken
+ // the tolerance by a factor of 1e-4f.
+
+ LLVector4a edge3; edge3.setSub( c, b );
+ const F32 len1sq = edge1.dot3(edge1).getF32();
+ const F32 len2sq = edge2.dot3(edge2).getF32();
+ const F32 len3sq = edge3.dot3(edge3).getF32();
+ bool abOK = (len1sq <= 100.f * len2sq) && (len1sq <= 100.f * len3sq);
+ bool acOK = (len2sq <= 100.f * len1sq) && (len1sq <= 100.f * len3sq);
+ bool cbOK = (len3sq <= 100.f * len1sq) && (len1sq <= 100.f * len2sq);
+ if ( abOK && acOK && cbOK )
+ {
+ tolerance *= 1e-4f;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ /// End Modified
+ //////////////////////////////////////////////////////////////////////////
+
+ LLVector4a cross; cross.setCross3( edge1, edge2 );
+
+ LLVector4a edge1b; edge1b.setSub( b, a );
+ LLVector4a edge2b; edge2b.setSub( b, c );
+ LLVector4a crossb; crossb.setCross3( edge1b, edge2b );
+
+ if ( ( cross.dot3(cross).getF32() < tolerance ) || ( crossb.dot3(crossb).getF32() < tolerance ))
+ {
+ return true;
+ }
+ }
+
+ // point triangle distance check
+ {
+ LLVector4a Q; Q.setSub(a, b);
+ LLVector4a R; R.setSub(c, b);
+
+ const F32 QQ = dot3fpu(Q, Q);
+ const F32 RR = dot3fpu(R, R);
+ const F32 QR = dot3fpu(R, Q);
+
+ volatile F32 QQRR = QQ * RR;
+ volatile F32 QRQR = QR * QR;
+ F32 Det = (QQRR - QRQR);
+
+ if( Det == 0.0f )
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool validate_face(const LLVolumeFace& face)
+{
+ for (U32 i = 0; i < face.mNumIndices; ++i)
+ {
+ if (face.mIndices[i] >= face.mNumVertices)
+ {
+ LL_WARNS() << "Face has invalid index." << LL_ENDL;
+ return false;
+ }
+ }
+
+ if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0)
+ {
+ LL_WARNS() << "Face has invalid number of indices." << LL_ENDL;
+ return false;
+ }
+
+ /*const LLVector4a scale(0.5f);
+
+ for (U32 i = 0; i < face.mNumIndices; i+=3)
+ {
+ U16 idx1 = face.mIndices[i];
+ U16 idx2 = face.mIndices[i+1];
+ U16 idx3 = face.mIndices[i+2];
+
+ LLVector4a v1; v1.setMul(face.mPositions[idx1], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[idx2], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[idx3], scale);
+
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ llwarns << "Degenerate face found!" << LL_ENDL;
+ return false;
+ }
+ }*/
+
+ return true;
+}
+
+bool validate_model(const LLModel* mdl)
+{
+ if (mdl->getNumVolumeFaces() == 0)
+ {
+ LL_WARNS() << "Model has no faces!" << LL_ENDL;
+ return false;
+ }
+
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ if (mdl->getVolumeFace(i).mNumVertices == 0)
+ {
+ LL_WARNS() << "Face has no vertices." << LL_ENDL;
+ return false;
+ }
+
+ if (mdl->getVolumeFace(i).mNumIndices == 0)
+ {
+ LL_WARNS() << "Face has no indices." << LL_ENDL;
+ return false;
+ }
+
+ if (!validate_face(mdl->getVolumeFace(i)))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+LLModelInstance::LLModelInstance(LLSD& data)
+ : LLModelInstanceBase()
+{
+ mLocalMeshID = data["mesh_id"].asInteger();
+ mLabel = data["label"].asString();
+ mTransform.setValue(data["transform"]);
+
+ for (U32 i = 0; i < data["material"].size(); ++i)
+ {
+ LLImportMaterial mat(data["material"][i]);
+ mMaterial[mat.mBinding] = mat;
+ }
+}
+
+
+LLSD LLModelInstance::asLLSD()
+{
+ LLSD ret;
+
+ ret["mesh_id"] = mModel->mLocalID;
+ ret["label"] = mLabel;
+ ret["transform"] = mTransform.getValue();
+
+ U32 i = 0;
+ for (std::map<std::string, LLImportMaterial>::iterator iter = mMaterial.begin(); iter != mMaterial.end(); ++iter)
+ {
+ ret["material"][i++] = iter->second.asLLSD();
+ }
+
+ return ret;
+}
+
+
+LLImportMaterial::~LLImportMaterial()
+{
+}
+
+LLImportMaterial::LLImportMaterial(LLSD& data)
+{
+ mDiffuseMapFilename = data["diffuse"]["filename"].asString();
+ mDiffuseMapLabel = data["diffuse"]["label"].asString();
+ mDiffuseColor.setValue(data["diffuse"]["color"]);
+ mFullbright = data["fullbright"].asBoolean();
+ mBinding = data["binding"].asString();
+}
+
+
+LLSD LLImportMaterial::asLLSD()
+{
+ LLSD ret;
+
+ ret["diffuse"]["filename"] = mDiffuseMapFilename;
+ ret["diffuse"]["label"] = mDiffuseMapLabel;
+ ret["diffuse"]["color"] = mDiffuseColor.getValue();
+ ret["fullbright"] = mFullbright;
+ ret["binding"] = mBinding;
+
+ return ret;
+}
+
+bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
+{
+
+ if (mDiffuseMapID != rhs.mDiffuseMapID)
+ {
+ return mDiffuseMapID < rhs.mDiffuseMapID;
+ }
+
+ if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
+ {
+ return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
+ }
+
+ if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
+ {
+ return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
+ }
+
+ if (mDiffuseColor != rhs.mDiffuseColor)
+ {
+ return mDiffuseColor < rhs.mDiffuseColor;
+ }
+
+ if (mBinding != rhs.mBinding)
+ {
+ return mBinding < rhs.mBinding;
+ }
+
+ return mFullbright < rhs.mFullbright;
+}
+
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index aaafc55258..ae602c09df 100755
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -31,6 +31,7 @@
#include "llvolume.h"
#include "v4math.h"
#include "m4math.h"
+#include <queue>
class daeElement;
class domMesh;
@@ -138,15 +139,16 @@ public:
BOOL upload_skin,
BOOL upload_joints,
BOOL nowrite = FALSE,
- BOOL as_slm = FALSE);
+ BOOL as_slm = FALSE,
+ int submodel_id = 0);
static LLSD writeModelToStream(
std::ostream& ostr,
LLSD& mdl,
BOOL nowrite = FALSE, BOOL as_slm = FALSE);
+
+ void ClearFacesAndMaterials() { mVolumeFaces.clear(); mMaterialList.clear(); }
- static LLModel* loadModelFromDomMesh(domMesh* mesh);
- static std::string getElementLabel(daeElement* element);
std::string getName() const;
std::string getMetric() const {return mMetric;}
EModelStatus getStatus() const {return mStatus;}
@@ -169,20 +171,25 @@ public:
void addFace(const LLVolumeFace& face);
+ void sortVolumeFacesByMaterialName();
void normalizeVolumeFaces();
+ void trimVolumeFacesToSize(U32 new_count = LL_SCULPT_MESH_MAX_FACES, LLVolume::face_list_t* remainder = NULL);
void optimizeVolumeFaces();
void offsetMesh( const LLVector3& pivotPoint );
void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out);
LLVector3 getTransformedCenter(const LLMatrix4& mat);
-
+
//reorder face list based on mMaterialList in this and reference so
//order matches that of reference (material ordering touchup)
bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
bool isMaterialListSubset( LLModel* ref );
bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
-
- std::vector<std::string> mMaterialList;
+ typedef std::vector<std::string> material_list;
+
+ material_list mMaterialList;
+
+ material_list& getMaterialList() { return mMaterialList; }
//data used for skin weights
class JointWeight
@@ -275,9 +282,115 @@ public:
Decomposition mPhysics;
EModelStatus mStatus ;
+
+ int mSubmodelID;
+};
+
+typedef std::vector<LLPointer<LLModel> > model_list;
+typedef std::queue<LLPointer<LLModel> > model_queue;
+
+class LLModelMaterialBase
+{
+public:
+ std::string mDiffuseMapFilename;
+ std::string mDiffuseMapLabel;
+ std::string mBinding;
+ LLColor4 mDiffuseColor;
+ bool mFullbright;
+
+ LLModelMaterialBase()
+ : mFullbright(false)
+ {
+ mDiffuseColor.set(1,1,1,1);
+ }
+};
+
+class LLImportMaterial : public LLModelMaterialBase
+{
+public:
+ friend class LLMeshUploadThread;
+ friend class LLModelPreview;
+
+ bool operator<(const LLImportMaterial &params) const;
+
+ LLImportMaterial() : LLModelMaterialBase()
+ {
+ mDiffuseColor.set(1,1,1,1);
+ }
+
+ LLImportMaterial(LLSD& data);
+ virtual ~LLImportMaterial();
+
+ LLSD asLLSD();
+
+ const LLUUID& getDiffuseMap() const { return mDiffuseMapID; }
+ void setDiffuseMap(const LLUUID& texId) { mDiffuseMapID = texId; }
+
protected:
- void addVolumeFacesFromDomMesh(domMesh* mesh);
- virtual BOOL createVolumeFacesFromDomMesh(domMesh *mesh);
+
+ LLUUID mDiffuseMapID;
+ void* mOpaqueData; // allow refs to viewer/platform-specific structs for each material
+ // currently only stores an LLPointer< LLViewerFetchedTexture > > to
+ // maintain refs to textures associated with each material for free
+ // ref counting.
};
+typedef std::map<std::string, LLImportMaterial> material_map;
+
+class LLModelInstanceBase
+{
+public:
+ LLPointer<LLModel> mModel;
+ LLPointer<LLModel> mLOD[5];
+ LLUUID mMeshID;
+
+ LLMatrix4 mTransform;
+ material_map mMaterial;
+
+ LLModelInstanceBase(LLModel* model, LLMatrix4& transform, material_map& materials)
+ : mModel(model), mTransform(transform), mMaterial(materials)
+ {
+ }
+
+ LLModelInstanceBase()
+ : mModel(NULL)
+ {
+ }
+};
+
+typedef std::vector<LLModelInstanceBase> model_instance_list;
+
+class LLModelInstance : public LLModelInstanceBase
+{
+public:
+ std::string mLabel;
+ LLUUID mMeshID;
+ S32 mLocalMeshID;
+
+ LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, material_map& materials)
+ : LLModelInstanceBase(model, transform, materials), mLabel(label)
+ {
+ mLocalMeshID = -1;
+ }
+
+ LLModelInstance(LLSD& data);
+
+ LLSD asLLSD();
+};
+
+#define LL_DEGENERACY_TOLERANCE 1e-7f
+
+inline F32 dot3fpu(const LLVector4a& a, const LLVector4a& b)
+{
+ volatile F32 p0 = a[0] * b[0];
+ volatile F32 p1 = a[1] * b[1];
+ volatile F32 p2 = a[2] * b[2];
+ return p0 + p1 + p2;
+}
+
+bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance = LL_DEGENERACY_TOLERANCE);
+
+bool validate_face(const LLVolumeFace& face);
+bool validate_model(const LLModel* mdl);
+
#endif //LL_LLMODEL_H
diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp
new file mode 100644
index 0000000000..81d92d151b
--- /dev/null
+++ b/indra/llprimitive/llmodelloader.cpp
@@ -0,0 +1,640 @@
+/**
+ * @file llmodelloader.cpp
+ * @brief LLModelLoader class implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmodelloader.h"
+#include "llsdserialize.h"
+#include "lljoint.h"
+#include "llcallbacklist.h"
+
+#include "glh/glh_linear.h"
+#include "llmatrix4a.h"
+#include <boost/bind.hpp>
+
+std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
+
+void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
+{
+ LLVector4a box[] =
+ {
+ LLVector4a(-1, 1,-1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a(-1,-1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a( 1, 1, 1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a( 1,-1, 1),
+ };
+
+ for (S32 j = 0; j < model->getNumVolumeFaces(); ++j)
+ {
+ const LLVolumeFace& face = model->getVolumeFace(j);
+
+ LLVector4a center;
+ center.setAdd(face.mExtents[0], face.mExtents[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(face.mExtents[1],face.mExtents[0]);
+ size.mul(0.5f);
+
+ for (U32 i = 0; i < 8; i++)
+ {
+ LLVector4a t;
+ t.setMul(size, box[i]);
+ t.add(center);
+
+ LLVector4a v;
+
+ mat.affineTransform(t, v);
+
+ if (first_transform)
+ {
+ first_transform = FALSE;
+ min = max = v;
+ }
+ else
+ {
+ update_min_max(min, max, v);
+ }
+ }
+ }
+}
+
+void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, BOOL& first_transform)
+{
+ LLVector4a mina, maxa;
+ LLMatrix4a mata;
+
+ mata.loadu(mat);
+ mina.load3(min.mV);
+ maxa.load3(max.mV);
+
+ stretch_extents(model, mata, mina, maxa, first_transform);
+
+ min.set(mina.getF32ptr());
+ max.set(maxa.getF32ptr());
+}
+
+//-----------------------------------------------------------------------------
+// LLModelLoader
+//-----------------------------------------------------------------------------
+LLModelLoader::LLModelLoader(
+ std::string filename,
+ S32 lod,
+ load_callback_t load_cb,
+ joint_lookup_func_t joint_lookup_func,
+ texture_load_func_t texture_load_func,
+ state_callback_t state_cb,
+ void* opaque_userdata,
+ JointTransformMap& jointMap,
+ JointSet& jointsFromNodes )
+: mJointList( jointMap )
+, mJointsFromNode( jointsFromNodes )
+, LLThread("Model Loader")
+, mFilename(filename)
+, mLod(lod)
+, mFirstTransform(TRUE)
+, mNumOfFetchingTextures(0)
+, mLoadCallback(load_cb)
+, mJointLookupFunc(joint_lookup_func)
+, mTextureLoadFunc(texture_load_func)
+, mStateCallback(state_cb)
+, mOpaqueData(opaque_userdata)
+, mNoNormalize(false)
+, mNoOptimize(false)
+, mCacheOnlyHitIfRigged(false)
+{
+ mJointMap["mPelvis"] = "mPelvis";
+ mJointMap["mTorso"] = "mTorso";
+ mJointMap["mChest"] = "mChest";
+ mJointMap["mNeck"] = "mNeck";
+ mJointMap["mHead"] = "mHead";
+ mJointMap["mSkull"] = "mSkull";
+ mJointMap["mEyeRight"] = "mEyeRight";
+ mJointMap["mEyeLeft"] = "mEyeLeft";
+ mJointMap["mCollarLeft"] = "mCollarLeft";
+ mJointMap["mShoulderLeft"] = "mShoulderLeft";
+ mJointMap["mElbowLeft"] = "mElbowLeft";
+ mJointMap["mWristLeft"] = "mWristLeft";
+ mJointMap["mCollarRight"] = "mCollarRight";
+ mJointMap["mShoulderRight"] = "mShoulderRight";
+ mJointMap["mElbowRight"] = "mElbowRight";
+ mJointMap["mWristRight"] = "mWristRight";
+ mJointMap["mHipRight"] = "mHipRight";
+ mJointMap["mKneeRight"] = "mKneeRight";
+ mJointMap["mAnkleRight"] = "mAnkleRight";
+ mJointMap["mFootRight"] = "mFootRight";
+ mJointMap["mToeRight"] = "mToeRight";
+ mJointMap["mHipLeft"] = "mHipLeft";
+ mJointMap["mKneeLeft"] = "mKneeLeft";
+ mJointMap["mAnkleLeft"] = "mAnkleLeft";
+ mJointMap["mFootLeft"] = "mFootLeft";
+ mJointMap["mToeLeft"] = "mToeLeft";
+
+ mJointMap["avatar_mPelvis"] = "mPelvis";
+ mJointMap["avatar_mTorso"] = "mTorso";
+ mJointMap["avatar_mChest"] = "mChest";
+ mJointMap["avatar_mNeck"] = "mNeck";
+ mJointMap["avatar_mHead"] = "mHead";
+ mJointMap["avatar_mSkull"] = "mSkull";
+ mJointMap["avatar_mEyeRight"] = "mEyeRight";
+ mJointMap["avatar_mEyeLeft"] = "mEyeLeft";
+ mJointMap["avatar_mCollarLeft"] = "mCollarLeft";
+ mJointMap["avatar_mShoulderLeft"] = "mShoulderLeft";
+ mJointMap["avatar_mElbowLeft"] = "mElbowLeft";
+ mJointMap["avatar_mWristLeft"] = "mWristLeft";
+ mJointMap["avatar_mCollarRight"] = "mCollarRight";
+ mJointMap["avatar_mShoulderRight"] = "mShoulderRight";
+ mJointMap["avatar_mElbowRight"] = "mElbowRight";
+ mJointMap["avatar_mWristRight"] = "mWristRight";
+ mJointMap["avatar_mHipRight"] = "mHipRight";
+ mJointMap["avatar_mKneeRight"] = "mKneeRight";
+ mJointMap["avatar_mAnkleRight"] = "mAnkleRight";
+ mJointMap["avatar_mFootRight"] = "mFootRight";
+ mJointMap["avatar_mToeRight"] = "mToeRight";
+ mJointMap["avatar_mHipLeft"] = "mHipLeft";
+ mJointMap["avatar_mKneeLeft"] = "mKneeLeft";
+ mJointMap["avatar_mAnkleLeft"] = "mAnkleLeft";
+ mJointMap["avatar_mFootLeft"] = "mFootLeft";
+ mJointMap["avatar_mToeLeft"] = "mToeLeft";
+
+
+ mJointMap["hip"] = "mPelvis";
+ mJointMap["abdomen"] = "mTorso";
+ mJointMap["chest"] = "mChest";
+ mJointMap["neck"] = "mNeck";
+ mJointMap["head"] = "mHead";
+ mJointMap["figureHair"] = "mSkull";
+ mJointMap["lCollar"] = "mCollarLeft";
+ mJointMap["lShldr"] = "mShoulderLeft";
+ mJointMap["lForeArm"] = "mElbowLeft";
+ mJointMap["lHand"] = "mWristLeft";
+ mJointMap["rCollar"] = "mCollarRight";
+ mJointMap["rShldr"] = "mShoulderRight";
+ mJointMap["rForeArm"] = "mElbowRight";
+ mJointMap["rHand"] = "mWristRight";
+ mJointMap["rThigh"] = "mHipRight";
+ mJointMap["rShin"] = "mKneeRight";
+ mJointMap["rFoot"] = "mFootRight";
+ mJointMap["lThigh"] = "mHipLeft";
+ mJointMap["lShin"] = "mKneeLeft";
+ mJointMap["lFoot"] = "mFootLeft";
+
+ //move into joint mapper class
+ //1. joints for joint offset verification
+ mMasterJointList.push_front("mPelvis");
+ mMasterJointList.push_front("mTorso");
+ mMasterJointList.push_front("mChest");
+ mMasterJointList.push_front("mNeck");
+ mMasterJointList.push_front("mHead");
+ mMasterJointList.push_front("mCollarLeft");
+ mMasterJointList.push_front("mShoulderLeft");
+ mMasterJointList.push_front("mElbowLeft");
+ mMasterJointList.push_front("mWristLeft");
+ mMasterJointList.push_front("mCollarRight");
+ mMasterJointList.push_front("mShoulderRight");
+ mMasterJointList.push_front("mElbowRight");
+ mMasterJointList.push_front("mWristRight");
+ mMasterJointList.push_front("mHipRight");
+ mMasterJointList.push_front("mKneeRight");
+ mMasterJointList.push_front("mFootRight");
+ mMasterJointList.push_front("mHipLeft");
+ mMasterJointList.push_front("mKneeLeft");
+ mMasterJointList.push_front("mFootLeft");
+
+ //2. legacy joint list - used to verify rigs that will not be using joint offsets
+ mMasterLegacyJointList.push_front("mPelvis");
+ mMasterLegacyJointList.push_front("mTorso");
+ mMasterLegacyJointList.push_front("mChest");
+ mMasterLegacyJointList.push_front("mNeck");
+ mMasterLegacyJointList.push_front("mHead");
+ mMasterLegacyJointList.push_front("mHipRight");
+ mMasterLegacyJointList.push_front("mKneeRight");
+ mMasterLegacyJointList.push_front("mFootRight");
+ mMasterLegacyJointList.push_front("mHipLeft");
+ mMasterLegacyJointList.push_front("mKneeLeft");
+ mMasterLegacyJointList.push_front("mFootLeft");
+
+ assert_main_thread();
+ sActiveLoaderList.push_back(this) ;
+}
+
+LLModelLoader::~LLModelLoader()
+{
+ assert_main_thread();
+ sActiveLoaderList.remove(this);
+}
+
+void LLModelLoader::run()
+{
+ doLoadModel();
+ doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
+}
+
+bool LLModelLoader::doLoadModel()
+{
+ //first, look for a .slm file of the same name that was modified later
+ //than the .dae
+
+ if (mTrySLM)
+ {
+ std::string filename = mFilename;
+
+ std::string::size_type i = filename.rfind(".");
+ if (i != std::string::npos)
+ {
+ filename.replace(i, filename.size()-1, ".slm");
+ llstat slm_status;
+ if (LLFile::stat(filename, &slm_status) == 0)
+ { //slm file exists
+ llstat dae_status;
+ if (LLFile::stat(mFilename, &dae_status) != 0 ||
+ dae_status.st_mtime < slm_status.st_mtime)
+ {
+ if (loadFromSLM(filename))
+ { //slm successfully loaded, if this fails, fall through and
+ //try loading from dae
+
+ mLod = -1; //successfully loading from an slm implicitly sets all
+ //LoDs
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return OpenFile(mFilename);
+}
+
+void LLModelLoader::setLoadState(U32 state)
+{
+ mStateCallback(state, mOpaqueData);
+}
+
+bool LLModelLoader::loadFromSLM(const std::string& filename)
+{
+ //only need to populate mScene with data from slm
+ llstat stat;
+
+ if (LLFile::stat(filename, &stat))
+ { //file does not exist
+ return false;
+ }
+
+ S32 file_size = (S32) stat.st_size;
+
+ llifstream ifstream(filename.c_str(), std::ifstream::in | std::ifstream::binary);
+ LLSD data;
+ LLSDSerialize::fromBinary(data, ifstream, file_size);
+ ifstream.close();
+
+ //build model list for each LoD
+ model_list model[LLModel::NUM_LODS];
+
+ if (data["version"].asInteger() != SLM_SUPPORTED_VERSION)
+ { //unsupported version
+ return false;
+ }
+
+ LLSD& mesh = data["mesh"];
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ for (U32 i = 0; i < mesh.size(); ++i)
+ {
+ std::stringstream str(mesh[i].asString());
+ LLPointer<LLModel> loaded_model = new LLModel(volume_params, (F32) lod);
+ if (loaded_model->loadModel(str))
+ {
+ loaded_model->mLocalID = i;
+ model[lod].push_back(loaded_model);
+
+ if (lod == LLModel::LOD_HIGH)
+ {
+ if (!loaded_model->mSkinInfo.mJointNames.empty())
+ {
+ //check to see if rig is valid
+ critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
+ }
+ else if (mCacheOnlyHitIfRigged)
+ {
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ if (model[LLModel::LOD_HIGH].empty())
+ { //failed to load high lod
+ return false;
+ }
+
+ //load instance list
+ model_instance_list instance_list;
+
+ LLSD& instance = data["instance"];
+
+ for (U32 i = 0; i < instance.size(); ++i)
+ {
+ //deserialize instance list
+ instance_list.push_back(LLModelInstance(instance[i]));
+
+ //match up model instance pointers
+ S32 idx = instance_list[i].mLocalMeshID;
+ std::string instance_label = instance_list[i].mLabel;
+
+ for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ if (!model[lod].empty())
+ {
+ if (idx >= model[lod].size())
+ {
+ if (model[lod].size())
+ {
+ instance_list[i].mLOD[lod] = model[lod][0];
+ }
+ else
+ {
+ instance_list[i].mLOD[lod] = NULL;
+ }
+ continue;
+ }
+
+ if (model[lod][idx]
+ && model[lod][idx]->mLabel.empty()
+ && !instance_label.empty())
+ {
+ // restore model names
+ std::string name = instance_label;
+ switch (lod)
+ {
+ case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break;
+ case LLModel::LOD_LOW: name += "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: name += "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: name += "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+ model[lod][idx]->mLabel = name;
+ }
+
+ instance_list[i].mLOD[lod] = model[lod][idx];
+ }
+ }
+
+ if (!instance_list[i].mModel)
+ instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
+ }
+
+ // Set name for UI to use
+ std::string name = data["name"];
+ if (!name.empty())
+ {
+ model[LLModel::LOD_HIGH][0]->mRequestedLabel = name;
+ }
+
+
+ //convert instance_list to mScene
+ mFirstTransform = TRUE;
+ for (U32 i = 0; i < instance_list.size(); ++i)
+ {
+ LLModelInstance& cur_instance = instance_list[i];
+ mScene[cur_instance.mTransform].push_back(cur_instance);
+ stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform);
+ }
+
+ setLoadState( DONE );
+
+ return true;
+}
+
+//static
+bool LLModelLoader::isAlive(LLModelLoader* loader)
+{
+ if(!loader)
+ {
+ return false ;
+ }
+
+ std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
+ for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
+
+ return *iter == loader ;
+}
+
+void LLModelLoader::loadModelCallback()
+{
+ mLoadCallback(mScene,mModelList,mLod, mOpaqueData);
+
+ while (!isStopped())
+ { //wait until this thread is stopped before deleting self
+ apr_sleep(100);
+ }
+
+ //double check if "this" is valid before deleting it, in case it is aborted during running.
+ if(!isAlive(this))
+ {
+ return ;
+ }
+
+ delete this;
+}
+
+//-----------------------------------------------------------------------------
+// critiqueRigForUploadApplicability()
+//-----------------------------------------------------------------------------
+void LLModelLoader::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset )
+{
+ critiqueJointToNodeMappingFromScene();
+
+ //Determines the following use cases for a rig:
+ //1. It is suitable for upload with skin weights & joint positions, or
+ //2. It is suitable for upload as standard av with just skin weights
+
+ bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
+ bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
+
+ //It's OK that both could end up being true, both default to false
+ if ( isJointPositionUploadOK )
+ {
+ setRigValidForJointPositionUpload( true );
+ }
+
+ if ( isRigLegacyOK)
+ {
+ setLegacyRigValid( true );
+ }
+
+}
+//-----------------------------------------------------------------------------
+// critiqueJointToNodeMappingFromScene()
+//-----------------------------------------------------------------------------
+void LLModelLoader::critiqueJointToNodeMappingFromScene( void )
+{
+ //Do the actual nodes back the joint listing from the dae?
+ //if yes then this is a fully rigged asset, otherwise it's just a partial rig
+
+ JointSet::iterator jointsFromNodeIt = mJointsFromNode.begin();
+ JointSet::iterator jointsFromNodeEndIt = mJointsFromNode.end();
+ bool result = true;
+
+ if ( !mJointsFromNode.empty() )
+ {
+ for ( ;jointsFromNodeIt!=jointsFromNodeEndIt;++jointsFromNodeIt )
+ {
+ std::string name = *jointsFromNodeIt;
+ if ( mJointTransformMap.find( name ) != mJointTransformMap.end() )
+ {
+ continue;
+ }
+ else
+ {
+ LL_INFOS() <<"critiqueJointToNodeMappingFromScene is missing a: " << name << LL_ENDL;
+ result = false;
+ }
+ }
+ }
+ else
+ {
+ result = false;
+ }
+
+ //Determines the following use cases for a rig:
+ //1. Full av rig w/1-1 mapping from the scene and joint array
+ //2. Partial rig but w/o parity between the scene and joint array
+ if ( result )
+ {
+ setRigWithSceneParity( true );
+ }
+}
+//-----------------------------------------------------------------------------
+// isRigLegacy()
+//-----------------------------------------------------------------------------
+bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
+{
+ //No joints in asset
+ if ( jointListFromAsset.size() == 0 )
+ {
+ return false;
+ }
+
+ bool result = false;
+
+ JointSet :: const_iterator masterJointIt = mMasterLegacyJointList.begin();
+ JointSet :: const_iterator masterJointEndIt = mMasterLegacyJointList.end();
+
+ std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
+ std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
+
+ for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
+ {
+ result = false;
+ modelJointIt = jointListFromAsset.begin();
+
+ for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
+ {
+ if ( *masterJointIt == *modelJointIt )
+ {
+ result = true;
+ break;
+ }
+ }
+ if ( !result )
+ {
+ LL_INFOS() <<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< LL_ENDL;
+ break;
+ }
+ }
+ return result;
+}
+//-----------------------------------------------------------------------------
+// isRigSuitableForJointPositionUpload()
+//-----------------------------------------------------------------------------
+bool LLModelLoader::isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset )
+{
+ bool result = false;
+
+ JointSet :: const_iterator masterJointIt = mMasterJointList.begin();
+ JointSet :: const_iterator masterJointEndIt = mMasterJointList.end();
+
+ std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
+ std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
+
+ for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
+ {
+ result = false;
+ modelJointIt = jointListFromAsset.begin();
+
+ for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
+ {
+ if ( *masterJointIt == *modelJointIt )
+ {
+ result = true;
+ break;
+ }
+ }
+ if ( !result )
+ {
+ LL_INFOS() <<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< LL_ENDL;
+ break;
+ }
+ }
+ return result;
+}
+
+
+//called in the main thread
+void LLModelLoader::loadTextures()
+{
+ BOOL is_paused = isPaused() ;
+ pause() ; //pause the loader
+
+ for(scene::iterator iter = mScene.begin(); iter != mScene.end(); ++iter)
+ {
+ for(U32 i = 0 ; i < iter->second.size(); i++)
+ {
+ for(std::map<std::string, LLImportMaterial>::iterator j = iter->second[i].mMaterial.begin();
+ j != iter->second[i].mMaterial.end(); ++j)
+ {
+ LLImportMaterial& material = j->second;
+
+ if(!material.mDiffuseMapFilename.empty())
+ {
+ mNumOfFetchingTextures += mTextureLoadFunc(material, mOpaqueData);
+ }
+ }
+ }
+ }
+
+ if(!is_paused)
+ {
+ unpause() ;
+ }
+}
diff --git a/indra/llprimitive/llmodelloader.h b/indra/llprimitive/llmodelloader.h
new file mode 100644
index 0000000000..bb4d06dca3
--- /dev/null
+++ b/indra/llprimitive/llmodelloader.h
@@ -0,0 +1,212 @@
+/**
+ * @file llmodelloader.h
+ * @brief LLModelLoader class definition
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMODELLOADER_H
+#define LL_LLMODELLOADER_H
+
+#include "llmodel.h"
+#include "llthread.h"
+#include <boost/function.hpp>
+#include <list>
+
+class LLJoint;
+
+typedef std::map<std::string, LLMatrix4> JointTransformMap;
+typedef std::map<std::string, LLMatrix4>:: iterator JointTransformMapIt;
+typedef std::map<std::string, std::string> JointMap;
+typedef std::deque<std::string> JointSet;
+
+const S32 SLM_SUPPORTED_VERSION = 3;
+const S32 NUM_LOD = 4;
+
+class LLModelLoader : public LLThread
+{
+public:
+
+ typedef std::map<std::string, LLImportMaterial> material_map;
+ typedef std::vector<LLPointer<LLModel > > model_list;
+ typedef std::vector<LLModelInstance> model_instance_list;
+ typedef std::map<LLMatrix4, model_instance_list > scene;
+
+ // Callback with loaded model data and loaded LoD
+ //
+ typedef boost::function<void (scene&,model_list&,S32,void*) > load_callback_t;
+
+ // Function to provide joint lookup by name
+ // (within preview avi skeleton, for example)
+ //
+ typedef boost::function<LLJoint* (const std::string&,void*) > joint_lookup_func_t;
+
+ // Func to load and associate material with all it's textures,
+ // returned value is the number of textures loaded
+ // intentionally non-const so func can modify material to
+ // store platform-specific data
+ //
+ typedef boost::function<U32 (LLImportMaterial&,void*) > texture_load_func_t;
+
+ // Callback to inform client of state changes
+ // during loading process (errors will be reported
+ // as state changes here as well)
+ //
+ typedef boost::function<void (U32,void*) > state_callback_t;
+
+ typedef enum
+ {
+ STARTING = 0,
+ READING_FILE,
+ CREATING_FACES,
+ GENERATING_VERTEX_BUFFERS,
+ GENERATING_LOD,
+ DONE,
+ ERROR_PARSING, //basically loading failed
+ ERROR_MATERIALS,
+ ERROR_PASSWORD_REQUIRED,
+ ERROR_NEED_MORE_MEMORY,
+ ERROR_INVALID_FILE,
+ ERROR_LOADER_SETUP,
+ ERROR_INVALID_PARAMETERS,
+ ERROR_OUT_OF_RANGE,
+ ERROR_FILE_VERSION_INVALID,
+ ERROR_MODEL // this error should always be last in this list, error code is passed as ERROR_MODEL+error_code
+ } eLoadState;
+
+ U32 mState;
+ std::string mFilename;
+
+ S32 mLod;
+
+ LLMatrix4 mTransform;
+ BOOL mFirstTransform;
+ LLVector3 mExtents[2];
+
+ bool mTrySLM;
+ bool mCacheOnlyHitIfRigged; // ignore cached SLM if it does not contain rig info (and we want rig info)
+
+ model_list mModelList;
+ scene mScene;
+
+ typedef std::queue<LLPointer<LLModel> > model_queue;
+
+ //queue of models that need a physics rep
+ model_queue mPhysicsQ;
+
+ //map of avatar joints as named in COLLADA assets to internal joint names
+ JointMap mJointMap;
+ JointTransformMap& mJointList;
+ JointSet& mJointsFromNode;
+
+ LLModelLoader(
+ std::string filename,
+ S32 lod,
+ LLModelLoader::load_callback_t load_cb,
+ LLModelLoader::joint_lookup_func_t joint_lookup_func,
+ LLModelLoader::texture_load_func_t texture_load_func,
+ LLModelLoader::state_callback_t state_cb,
+ void* opaque_userdata,
+ JointTransformMap& jointMap,
+ JointSet& jointsFromNodes);
+ virtual ~LLModelLoader() ;
+
+ virtual void setNoNormalize() { mNoNormalize = true; }
+ virtual void setNoOptimize() { mNoOptimize = true; }
+
+ virtual void run();
+
+ // Will try SLM or derived class OpenFile as appropriate
+ //
+ virtual bool doLoadModel();
+
+ // Derived classes need to provide their parsing of files here
+ //
+ virtual bool OpenFile(const std::string& filename) = 0;
+
+ bool loadFromSLM(const std::string& filename);
+
+ void loadModelCallback();
+ void loadTextures() ; //called in the main thread.
+ void setLoadState(U32 state);
+
+
+
+ S32 mNumOfFetchingTextures ; //updated in the main thread
+ bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread.
+
+ bool verifyCount( int expected, int result );
+
+ //Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps)
+ void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
+ void critiqueJointToNodeMappingFromScene( void );
+
+ //Determines if a rig is a legacy from the joint list
+ bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
+
+ //Determines if a rig is suitable for upload
+ bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
+
+ void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; }
+ const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; }
+
+ const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
+ void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
+
+ const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
+ void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
+
+ //-----------------------------------------------------------------------------
+ // isNodeAJoint()
+ //-----------------------------------------------------------------------------
+ bool isNodeAJoint(const char* name)
+ {
+ return mJointMap.find(name) != mJointMap.end();
+ }
+
+protected:
+
+ LLModelLoader::load_callback_t mLoadCallback;
+ LLModelLoader::joint_lookup_func_t mJointLookupFunc;
+ LLModelLoader::texture_load_func_t mTextureLoadFunc;
+ LLModelLoader::state_callback_t mStateCallback;
+ void* mOpaqueData;
+
+ bool mRigParityWithScene;
+ bool mRigValidJointUpload;
+ bool mLegacyRigValid;
+
+ bool mNoNormalize;
+ bool mNoOptimize;
+
+ JointSet mMasterJointList;
+ JointSet mMasterLegacyJointList;
+ JointTransformMap mJointTransformMap;
+
+ static std::list<LLModelLoader*> sActiveLoaderList;
+ static bool isAlive(LLModelLoader* loader) ;
+};
+class LLMatrix4a;
+void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform);
+void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, BOOL& first_transform);
+
+#endif // LL_LLMODELLOADER_H
diff --git a/indra/llprimitive/lltextureentry.h b/indra/llprimitive/lltextureentry.h
index 19edcaa27d..a40c3988f2 100755
--- a/indra/llprimitive/lltextureentry.h
+++ b/indra/llprimitive/lltextureentry.h
@@ -89,6 +89,10 @@ public:
bool operator==(const LLTextureEntry &rhs) const;
bool operator!=(const LLTextureEntry &rhs) const;
+
+ // Added to allow use with std::map
+ //
+ bool operator <(const LLTextureEntry &rhs) const;
LLSD asLLSD() const;
void asLLSD(LLSD& sd) const;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 536c7740bb..b093840c15 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -140,7 +140,6 @@ set(viewer_SOURCE_FILES
llbreadcrumbview.cpp
llbrowsernotification.cpp
llbuycurrencyhtml.cpp
- llcallbacklist.cpp
llcallingcard.cpp
llcapabilitylistener.cpp
llcaphttpsender.cpp
@@ -756,7 +755,6 @@ set(viewer_HEADER_FILES
llbox.h
llbreadcrumbview.h
llbuycurrencyhtml.h
- llcallbacklist.h
llcallingcard.h
llcapabilitylistener.h
llcapabilityprovider.h
@@ -1331,16 +1329,14 @@ source_group("CMake Rules" FILES ViewerInstall.cmake)
# the viewer_version.txt file created here is for passing to viewer_manifest and autobuild
# the summary.json file is created for the benefit of the TeamCity builds, where
# it is used to provide descriptive information to the build results page
-add_custom_target(generate_viewer_version ALL
- COMMAND printf '${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}' > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
- COMMAND printf '{"Type":"viewer","Version":"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}"}' > ${CMAKE_BINARY_DIR}/summary.json
- COMMENT Generating viewer_version.txt for manifest processing
- )
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"
+ "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")
+file(WRITE "${CMAKE_BINARY_DIR}/summary.json"
+ "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\"}\n")
set_source_files_properties(
llversioninfo.cpp tests/llversioninfo_test.cpp
PROPERTIES
- DEPENDS generate_viewer_version # dummy dependency to force recompile every time
COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake
)
@@ -1698,8 +1694,6 @@ if (WINDOWS)
LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF /LARGEADDRESSAWARE"
)
- add_dependencies(${VIEWER_BINARY_NAME} generate_viewer_version)
-
if(USE_PRECOMPILED_HEADERS)
set_target_properties(
${VIEWER_BINARY_NAME}
@@ -2024,8 +2018,6 @@ if (LINUX)
llcommon
)
- add_dependencies(${VIEWER_BINARY_NAME} generate_viewer_version)
-
add_custom_command(
OUTPUT ${product}.tar.bz2
COMMAND ${PYTHON_EXECUTABLE}
@@ -2109,8 +2101,6 @@ if (DARWIN)
"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Info.plist"
)
- add_dependencies(${VIEWER_BINARY_NAME} generate_viewer_version)
-
add_custom_command(
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
COMMAND ${PYTHON_EXECUTABLE}
@@ -2143,7 +2133,6 @@ if (DARWIN)
if (PACKAGE)
add_custom_target(llpackage ALL DEPENDS ${VIEWER_BINARY_NAME})
- add_dependencies(llpackage generate_viewer_version)
add_custom_command(
TARGET llpackage POST_BUILD
@@ -2227,8 +2216,7 @@ if (PACKAGE)
DEPENDS generate_breakpad_symbols.py
VERBATIM)
- add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}")
- add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")
+ add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")
add_dependencies(llpackage generate_breakpad_symbols)
endif(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING)
endif (PACKAGE)
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index ff313b8c21..0cbfaed0d9 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.8.4
+3.8.5
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 0371a819dd..98d0ba53f6 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2,6 +2,39 @@
<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="llsd.xsd">
<map>
+ <key>ImporterDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable debug output to more precisely identify sources of import errors. Warning: the output can slow down import on many machines.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ImporterLegacyMatching</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable index based model matching.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ImporterModelLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Limits amount of importer generated models for dae files</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>768</integer>
+ </map>
<key>IMShowTime</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 718871138e..311e548cfb 100755
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -1,6 +1,18 @@
/**
- * @file llappviewer.h
- * @brief The LLAppViewer class declaration
+ * @mainpage
+ *
+ * This is the sources for the Second Life Viewer;
+ * information on the open source project is at
+ * https://wiki.secondlife.com/wiki/Open_Source_Portal
+ *
+ * The Mercurial repository for the trunk version is at
+ * https://bitbucket.org/lindenlab/viewer-release
+ *
+ * @section source-license Source License
+ * @verbinclude LICENSE-source.txt
+ *
+ * @section artwork-license Artwork License
+ * @verbinclude LICENSE-logos.txt
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -22,6 +34,9 @@
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
+ *
+ * @file llappviewer.h
+ * @brief The LLAppViewer class declaration
*/
#ifndef LL_LLAPPVIEWER_H
diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp
index 59ecbdd0ea..59ecbdd0ea 100755..100644
--- a/indra/newview/llcallbacklist.cpp
+++ b/indra/newview/llcallbacklist.cpp
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 19dba3f917..5ea7efc045 100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -30,6 +30,7 @@
#include "llcommandhandler.h"
#include "llnotificationsutil.h"
#include "llcommanddispatcherlistener.h"
+#include "llstartup.h"
#include "stringize.h"
// system includes
@@ -116,7 +117,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
if (! slurl_blocked)
{
- LLNotificationsUtil::add("BlockedSLURL");
+ if (LLStartUp::getStartupState() >= STATE_BROWSER_INIT)
+ {
+ // Note: commands can arrive before we initialize everything we need for Notification.
+ LLNotificationsUtil::add("BlockedSLURL");
+ }
slurl_blocked = true;
}
return true;
@@ -138,7 +143,10 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
if (! slurl_throttled)
{
- LLNotificationsUtil::add("ThrottledSLURL");
+ if (LLStartUp::getStartupState() >= STATE_BROWSER_INIT)
+ {
+ LLNotificationsUtil::add("ThrottledSLURL");
+ }
slurl_throttled = true;
}
return true;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 821d58a9b2..f828b56f7f 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1600,6 +1600,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
for (U32 j = 0; j < count; ++j)
{
LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (!joint)
+ {
+ joint = avatar->getJoint("mPelvis");
+ }
+ if (!joint)
+ {
+ LL_DEBUGS("Avatar") << "Failed to find " << skin->mJointNames[j] << LL_ENDL;
+ }
if (joint)
{
mat[j] = skin->mInvBindMatrix[j];
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 6804b21b28..918dc98a3a 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -26,35 +26,8 @@
#include "llviewerprecompiledheaders.h"
-#if LL_MSVC
-#pragma warning (disable : 4263)
-#pragma warning (disable : 4264)
-#endif
-#include "dae.h"
-//#include "dom.h"
-#include "dom/domAsset.h"
-#include "dom/domBind_material.h"
-#include "dom/domCOLLADA.h"
-#include "dom/domConstants.h"
-#include "dom/domController.h"
-#include "dom/domEffect.h"
-#include "dom/domGeometry.h"
-#include "dom/domInstance_geometry.h"
-#include "dom/domInstance_material.h"
-#include "dom/domInstance_node.h"
-#include "dom/domInstance_effect.h"
-#include "dom/domMaterial.h"
-#include "dom/domMatrix.h"
-#include "dom/domNode.h"
-#include "dom/domProfile_COMMON.h"
-#include "dom/domRotate.h"
-#include "dom/domScale.h"
-#include "dom/domTranslate.h"
-#include "dom/domVisual_scene.h"
-#if LL_MSVC
-#pragma warning (default : 4263)
-#pragma warning (default : 4264)
-#endif
+#include "llmodelloader.h"
+#include "lldaeloader.h"
#include "llfloatermodelpreview.h"
@@ -112,14 +85,15 @@
#include "llanimationstates.h"
#include "llviewernetwork.h"
#include "llviewershadermgr.h"
-#include "glod/glod.h"
-const S32 SLM_SUPPORTED_VERSION = 3;
+#include "glod/glod.h"
+#include <boost/algorithm/string.hpp>
//static
S32 LLFloaterModelPreview::sUploadAmount = 10;
LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL;
-std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
+
+bool LLModelPreview::sIgnoreLoadedCallback = false;
// "Retain%" decomp parameter has values from 0.0 to 1.0 by 0.01
// But according to the UI spec for upload model floater, this parameter
@@ -199,190 +173,46 @@ std::string lod_label_name[NUM_LOD+1] =
"I went off the end of the lod_label_name array. Me so smart."
};
-std::string colladaVersion[VERSIONTYPE_COUNT+1] =
-{
- "1.4.0",
- "1.4.1",
- "Unsupported"
-};
-
-
-#define LL_DEGENERACY_TOLERANCE 1e-7f
-
-inline F32 dot3fpu(const LLVector4a& a, const LLVector4a& b)
-{
- volatile F32 p0 = a[0] * b[0];
- volatile F32 p1 = a[1] * b[1];
- volatile F32 p2 = a[2] * b[2];
- return p0 + p1 + p2;
-}
-
-bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance = LL_DEGENERACY_TOLERANCE)
-{
- // small area check
- {
- LLVector4a edge1; edge1.setSub( a, b );
- LLVector4a edge2; edge2.setSub( a, c );
- //////////////////////////////////////////////////////////////////////////
- /// Linden Modified
- //////////////////////////////////////////////////////////////////////////
-
- // If no one edge is more than 10x longer than any other edge, we weaken
- // the tolerance by a factor of 1e-4f.
-
- LLVector4a edge3; edge3.setSub( c, b );
- const F32 len1sq = edge1.dot3(edge1).getF32();
- const F32 len2sq = edge2.dot3(edge2).getF32();
- const F32 len3sq = edge3.dot3(edge3).getF32();
- bool abOK = (len1sq <= 100.f * len2sq) && (len1sq <= 100.f * len3sq);
- bool acOK = (len2sq <= 100.f * len1sq) && (len1sq <= 100.f * len3sq);
- bool cbOK = (len3sq <= 100.f * len1sq) && (len1sq <= 100.f * len2sq);
- if ( abOK && acOK && cbOK )
- {
- tolerance *= 1e-4f;
- }
-
- //////////////////////////////////////////////////////////////////////////
- /// End Modified
- //////////////////////////////////////////////////////////////////////////
-
- LLVector4a cross; cross.setCross3( edge1, edge2 );
-
- LLVector4a edge1b; edge1b.setSub( b, a );
- LLVector4a edge2b; edge2b.setSub( b, c );
- LLVector4a crossb; crossb.setCross3( edge1b, edge2b );
-
- if ( ( cross.dot3(cross).getF32() < tolerance ) || ( crossb.dot3(crossb).getF32() < tolerance ))
- {
- return true;
- }
- }
-
- // point triangle distance check
- {
- LLVector4a Q; Q.setSub(a, b);
- LLVector4a R; R.setSub(c, b);
-
- const F32 QQ = dot3fpu(Q, Q);
- const F32 RR = dot3fpu(R, R);
- const F32 QR = dot3fpu(R, Q);
-
- volatile F32 QQRR = QQ * RR;
- volatile F32 QRQR = QR * QR;
- F32 Det = (QQRR - QRQR);
-
- if( Det == 0.0f )
- {
- return true;
- }
- }
-
- return false;
-}
-
-bool validate_face(const LLVolumeFace& face)
+BOOL stop_gloderror()
{
+ GLuint error = glodGetError();
- for (U32 v = 0; v < face.mNumVertices; v++)
- {
- if(face.mPositions && !face.mPositions[v].isFinite3())
- {
- LL_WARNS() << "NaN position data in face found!" << LL_ENDL;
- return false;
- }
-
- if(face.mNormals && !face.mNormals[v].isFinite3())
- {
- LL_WARNS() << "NaN normal data in face found!" << LL_ENDL;
- return false;
- }
- }
-
- for (U32 i = 0; i < face.mNumIndices; ++i)
- {
- if (face.mIndices[i] >= face.mNumVertices)
- {
- LL_WARNS() << "Face has invalid index." << LL_ENDL;
- return false;
- }
- }
-
- if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0)
+ if (error != GLOD_NO_ERROR)
{
- LL_WARNS() << "Face has invalid number of indices." << LL_ENDL;
- return false;
+ LL_WARNS() << "GLOD error detected, cannot generate LOD: " << std::hex << error << LL_ENDL;
+ return TRUE;
}
-
- /*const LLVector4a scale(0.5f);
-
-
- for (U32 i = 0; i < face.mNumIndices; i+=3)
- {
- U16 idx1 = face.mIndices[i];
- U16 idx2 = face.mIndices[i+1];
- U16 idx3 = face.mIndices[i+2];
-
- LLVector4a v1; v1.setMul(face.mPositions[idx1], scale);
- LLVector4a v2; v2.setMul(face.mPositions[idx2], scale);
- LLVector4a v3; v3.setMul(face.mPositions[idx3], scale);
-
- if (ll_is_degenerate(v1,v2,v3))
- {
- LL_WARNS() << "Degenerate face found!" << LL_ENDL;
- return false;
- }
- }*/
- return true;
+ return FALSE;
}
-bool validate_model(const LLModel* mdl)
+LLViewerFetchedTexture* bindMaterialDiffuseTexture(const LLImportMaterial& material)
{
- if (mdl->getNumVolumeFaces() == 0)
- {
- LL_WARNS() << "Model has no faces!" << LL_ENDL;
- return false;
- }
+ LLViewerFetchedTexture *texture = LLViewerTextureManager::getFetchedTexture(material.getDiffuseMap(), FTT_DEFAULT, TRUE, LLGLTexture::BOOST_PREVIEW);
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ if (texture)
{
- if (mdl->getVolumeFace(i).mNumVertices == 0)
- {
- LL_WARNS() << "Face has no vertices." << LL_ENDL;
- return false;
- }
-
- if (mdl->getVolumeFace(i).mNumIndices == 0)
+ if (texture->getDiscardLevel() > -1)
{
- LL_WARNS() << "Face has no indices." << LL_ENDL;
- return false;
- }
-
- if (!validate_face(mdl->getVolumeFace(i)))
- {
- return false;
+ gGL.getTexUnit(0)->bind(texture, true);
+ return texture;
}
}
- return true;
+ return NULL;
}
-BOOL stop_gloderror()
+std::string stripSuffix(std::string name)
{
- GLuint error = glodGetError();
-
- if (error != GLOD_NO_ERROR)
+ if ((name.find("_LOD") != -1) || (name.find("_PHYS") != -1))
{
- LL_WARNS() << "GLOD error detected, cannot generate LOD: " << std::hex << error << LL_ENDL;
- return TRUE;
+ return name.substr(0, name.rfind('_'));
}
-
- return FALSE;
+ return name;
}
-
LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
- : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
{
mMP = mp;
mLOD = lod;
@@ -393,6 +223,29 @@ void LLMeshFilePicker::notify(const std::string& filename)
mMP->loadModel(mFile, mLOD);
}
+void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut)
+{
+ LLModelLoader::scene::iterator base_iter = scene.begin();
+ bool found = false;
+ while (!found && (base_iter != scene.end()))
+ {
+ matOut = base_iter->first;
+
+ LLModelLoader::model_instance_list::iterator base_instance_iter = base_iter->second.begin();
+ while (!found && (base_instance_iter != base_iter->second.end()))
+ {
+ LLModelInstance& base_instance = *base_instance_iter++;
+ LLModel* base_model = base_instance.mModel;
+
+ if (base_model && (base_model->mLabel == name_to_match))
+ {
+ baseModelOut = base_model;
+ return;
+ }
+ }
+ base_iter++;
+ }
+}
//-----------------------------------------------------------------------------
// LLFloaterModelPreview()
@@ -613,6 +466,11 @@ void LLFloaterModelPreview::disableViewOption(const std::string& option)
void LLFloaterModelPreview::loadModel(S32 lod)
{
mModelPreview->mLoading = true;
+ if (lod == LLModel::LOD_PHYSICS)
+ {
+ // loading physics from file
+ mModelPreview->mPhysicsSearchLOD = lod;
+ }
(new LLMeshFilePicker(mModelPreview, lod))->getFile();
}
@@ -791,9 +649,9 @@ void LLFloaterModelPreview::draw()
childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
}
else
- if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )
- {
- childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
+ if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_MODEL )
+ {
+ childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_MODEL)));
}
else
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_PARSING )
@@ -945,9 +803,16 @@ BOOL LLFloaterModelPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
/*virtual*/
void LLFloaterModelPreview::onOpen(const LLSD& key)
{
+ LLModelPreview::sIgnoreLoadedCallback = false;
requestAgentUploadPermissions();
}
+/*virtual*/
+void LLFloaterModelPreview::onClose(bool app_quitting)
+{
+ LLModelPreview::sIgnoreLoadedCallback = true;
+}
+
//static
void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)
{
@@ -1308,1815 +1173,6 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
}
//-----------------------------------------------------------------------------
-// LLModelLoader
-//-----------------------------------------------------------------------------
-LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
- std::deque<std::string>& jointsFromNodes )
-: mJointList( jointMap )
-, mJointsFromNode( jointsFromNodes )
-, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mNumOfFetchingTextures(0)
-{
- mJointMap["mPelvis"] = "mPelvis";
- mJointMap["mTorso"] = "mTorso";
- mJointMap["mChest"] = "mChest";
- mJointMap["mNeck"] = "mNeck";
- mJointMap["mHead"] = "mHead";
- mJointMap["mSkull"] = "mSkull";
- mJointMap["mEyeRight"] = "mEyeRight";
- mJointMap["mEyeLeft"] = "mEyeLeft";
- mJointMap["mCollarLeft"] = "mCollarLeft";
- mJointMap["mShoulderLeft"] = "mShoulderLeft";
- mJointMap["mElbowLeft"] = "mElbowLeft";
- mJointMap["mWristLeft"] = "mWristLeft";
- mJointMap["mCollarRight"] = "mCollarRight";
- mJointMap["mShoulderRight"] = "mShoulderRight";
- mJointMap["mElbowRight"] = "mElbowRight";
- mJointMap["mWristRight"] = "mWristRight";
- mJointMap["mHipRight"] = "mHipRight";
- mJointMap["mKneeRight"] = "mKneeRight";
- mJointMap["mAnkleRight"] = "mAnkleRight";
- mJointMap["mFootRight"] = "mFootRight";
- mJointMap["mToeRight"] = "mToeRight";
- mJointMap["mHipLeft"] = "mHipLeft";
- mJointMap["mKneeLeft"] = "mKneeLeft";
- mJointMap["mAnkleLeft"] = "mAnkleLeft";
- mJointMap["mFootLeft"] = "mFootLeft";
- mJointMap["mToeLeft"] = "mToeLeft";
-
- mJointMap["avatar_mPelvis"] = "mPelvis";
- mJointMap["avatar_mTorso"] = "mTorso";
- mJointMap["avatar_mChest"] = "mChest";
- mJointMap["avatar_mNeck"] = "mNeck";
- mJointMap["avatar_mHead"] = "mHead";
- mJointMap["avatar_mSkull"] = "mSkull";
- mJointMap["avatar_mEyeRight"] = "mEyeRight";
- mJointMap["avatar_mEyeLeft"] = "mEyeLeft";
- mJointMap["avatar_mCollarLeft"] = "mCollarLeft";
- mJointMap["avatar_mShoulderLeft"] = "mShoulderLeft";
- mJointMap["avatar_mElbowLeft"] = "mElbowLeft";
- mJointMap["avatar_mWristLeft"] = "mWristLeft";
- mJointMap["avatar_mCollarRight"] = "mCollarRight";
- mJointMap["avatar_mShoulderRight"] = "mShoulderRight";
- mJointMap["avatar_mElbowRight"] = "mElbowRight";
- mJointMap["avatar_mWristRight"] = "mWristRight";
- mJointMap["avatar_mHipRight"] = "mHipRight";
- mJointMap["avatar_mKneeRight"] = "mKneeRight";
- mJointMap["avatar_mAnkleRight"] = "mAnkleRight";
- mJointMap["avatar_mFootRight"] = "mFootRight";
- mJointMap["avatar_mToeRight"] = "mToeRight";
- mJointMap["avatar_mHipLeft"] = "mHipLeft";
- mJointMap["avatar_mKneeLeft"] = "mKneeLeft";
- mJointMap["avatar_mAnkleLeft"] = "mAnkleLeft";
- mJointMap["avatar_mFootLeft"] = "mFootLeft";
- mJointMap["avatar_mToeLeft"] = "mToeLeft";
-
-
- mJointMap["hip"] = "mPelvis";
- mJointMap["abdomen"] = "mTorso";
- mJointMap["chest"] = "mChest";
- mJointMap["neck"] = "mNeck";
- mJointMap["head"] = "mHead";
- mJointMap["figureHair"] = "mSkull";
- mJointMap["lCollar"] = "mCollarLeft";
- mJointMap["lShldr"] = "mShoulderLeft";
- mJointMap["lForeArm"] = "mElbowLeft";
- mJointMap["lHand"] = "mWristLeft";
- mJointMap["rCollar"] = "mCollarRight";
- mJointMap["rShldr"] = "mShoulderRight";
- mJointMap["rForeArm"] = "mElbowRight";
- mJointMap["rHand"] = "mWristRight";
- mJointMap["rThigh"] = "mHipRight";
- mJointMap["rShin"] = "mKneeRight";
- mJointMap["rFoot"] = "mFootRight";
- mJointMap["lThigh"] = "mHipLeft";
- mJointMap["lShin"] = "mKneeLeft";
- mJointMap["lFoot"] = "mFootLeft";
-
- if (mPreview)
- {
- //only try to load from slm if viewer is configured to do so and this is the
- //initial model load (not an LoD or physics shape)
- mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mPreview->mUploadData.empty();
- mPreview->setLoadState(STARTING);
- }
- else
- {
- mTrySLM = false;
- }
-
- assert_main_thread();
- sActiveLoaderList.push_back(this) ;
-}
-
-LLModelLoader::~LLModelLoader()
-{
- assert_main_thread();
- sActiveLoaderList.remove(this);
-}
-
-void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
-{
- LLVector4a box[] =
- {
- LLVector4a(-1, 1,-1),
- LLVector4a(-1, 1, 1),
- LLVector4a(-1,-1,-1),
- LLVector4a(-1,-1, 1),
- LLVector4a( 1, 1,-1),
- LLVector4a( 1, 1, 1),
- LLVector4a( 1,-1,-1),
- LLVector4a( 1,-1, 1),
- };
-
- for (S32 j = 0; j < model->getNumVolumeFaces(); ++j)
- {
- const LLVolumeFace& face = model->getVolumeFace(j);
-
- LLVector4a center;
- center.setAdd(face.mExtents[0], face.mExtents[1]);
- center.mul(0.5f);
- LLVector4a size;
- size.setSub(face.mExtents[1],face.mExtents[0]);
- size.mul(0.5f);
-
- for (U32 i = 0; i < 8; i++)
- {
- LLVector4a t;
- t.setMul(size, box[i]);
- t.add(center);
-
- LLVector4a v;
-
- mat.affineTransform(t, v);
-
- if (first_transform)
- {
- first_transform = FALSE;
- min = max = v;
- }
- else
- {
- update_min_max(min, max, v);
- }
- }
- }
-}
-
-void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, BOOL& first_transform)
-{
- LLVector4a mina, maxa;
- LLMatrix4a mata;
-
- mata.loadu(mat);
- mina.load3(min.mV);
- maxa.load3(max.mV);
-
- stretch_extents(model, mata, mina, maxa, first_transform);
-
- min.set(mina.getF32ptr());
- max.set(maxa.getF32ptr());
-}
-
-void LLModelLoader::run()
-{
- doLoadModel();
- doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
-}
-
-bool LLModelLoader::doLoadModel()
-{
- //first, look for a .slm file of the same name that was modified later
- //than the .dae
-
- if (mTrySLM)
- {
- std::string filename = mFilename;
-
- std::string::size_type i = filename.rfind(".");
- if (i != std::string::npos)
- {
- filename.replace(i, filename.size()-1, ".slm");
- llstat slm_status;
- if (LLFile::stat(filename, &slm_status) == 0)
- { //slm file exists
- llstat dae_status;
- if (LLFile::stat(mFilename, &dae_status) != 0 ||
- dae_status.st_mtime < slm_status.st_mtime)
- {
- if (loadFromSLM(filename))
- { //slm successfully loaded, if this fails, fall through and
- //try loading from dae
-
- mLod = -1; //successfully loading from an slm implicitly sets all
- //LoDs
- return true;
- }
- }
- }
- }
- }
-
- //no suitable slm exists, load from the .dae file
- DAE dae;
- domCOLLADA* dom = dae.open(mFilename);
-
- if (!dom)
- {
- LL_INFOS()<<" Error with dae - traditionally indicates a corrupt file."<<LL_ENDL;
- setLoadState( ERROR_PARSING );
- return false;
- }
- //Dom version
- daeString domVersion = dae.getDomVersion();
- std::string sldom(domVersion);
- LL_INFOS()<<"Collada Importer Version: "<<sldom<<LL_ENDL;
- //Dae version
- domVersionType docVersion = dom->getVersion();
- //0=1.4
- //1=1.4.1
- //2=Currently unsupported, however may work
- if (docVersion > 1 )
- {
- docVersion = VERSIONTYPE_COUNT;
- }
- LL_INFOS()<<"Dae version "<<colladaVersion[docVersion]<<LL_ENDL;
-
-
- daeDatabase* db = dae.getDatabase();
-
- daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
-
- daeDocument* doc = dae.getDoc(mFilename);
- if (!doc)
- {
- LL_WARNS() << "can't find internal doc" << LL_ENDL;
- return false;
- }
-
- daeElement* root = doc->getDomRoot();
- if (!root)
- {
- LL_WARNS() << "document has no root" << LL_ENDL;
- return false;
- }
-
- //Verify some basic properties of the dae
- //1. Basic validity check on controller
- U32 controllerCount = (int) db->getElementCount( NULL, "controller" );
- bool result = false;
- for ( int i=0; i<controllerCount; ++i )
- {
- domController* pController = NULL;
- db->getElement( (daeElement**) &pController, i , NULL, "controller" );
- result = mPreview->verifyController( pController );
- if (!result)
- {
- setLoadState( ERROR_PARSING );
- return true;
- }
- }
-
-
- //get unit scale
- mTransform.setIdentity();
-
- domAsset::domUnit* unit = daeSafeCast<domAsset::domUnit>(root->getDescendant(daeElement::matchType(domAsset::domUnit::ID())));
-
- if (unit)
- {
- F32 meter = unit->getMeter();
- mTransform.mMatrix[0][0] = meter;
- mTransform.mMatrix[1][1] = meter;
- mTransform.mMatrix[2][2] = meter;
- }
-
- //get up axis rotation
- LLMatrix4 rotation;
-
- domUpAxisType up = UPAXISTYPE_Y_UP; // default is Y_UP
- domAsset::domUp_axis* up_axis =
- daeSafeCast<domAsset::domUp_axis>(root->getDescendant(daeElement::matchType(domAsset::domUp_axis::ID())));
-
- if (up_axis)
- {
- up = up_axis->getValue();
- }
-
- if (up == UPAXISTYPE_X_UP)
- {
- rotation.initRotation(0.0f, 90.0f * DEG_TO_RAD, 0.0f);
- }
- else if (up == UPAXISTYPE_Y_UP)
- {
- rotation.initRotation(90.0f * DEG_TO_RAD, 0.0f, 0.0f);
- }
-
- rotation *= mTransform;
- mTransform = rotation;
-
-
- for (daeInt idx = 0; idx < count; ++idx)
- { //build map of domEntities to LLModel
- domMesh* mesh = NULL;
- db->getElement((daeElement**) &mesh, idx, NULL, COLLADA_TYPE_MESH);
-
- if (mesh)
- {
- LLPointer<LLModel> model = LLModel::loadModelFromDomMesh(mesh);
-
- if(model->getStatus() != LLModel::NO_ERRORS)
- {
- setLoadState(ERROR_PARSING + model->getStatus()) ;
- return false; //abort
- }
-
- if (model.notNull() && validate_model(model))
- {
- mModelList.push_back(model);
- mModel[mesh] = model;
- }
- }
- }
-
- count = db->getElementCount(NULL, COLLADA_TYPE_SKIN);
- for (daeInt idx = 0; idx < count; ++idx)
- { //add skinned meshes as instances
- domSkin* skin = NULL;
- db->getElement((daeElement**) &skin, idx, NULL, COLLADA_TYPE_SKIN);
-
- if (skin)
- {
- domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement());
-
- if (geom)
- {
- domMesh* mesh = geom->getMesh();
- if (mesh)
- {
- LLModel* model = mModel[mesh];
- if (model)
- {
- LLVector3 mesh_scale_vector;
- LLVector3 mesh_translation_vector;
- model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
-
- LLMatrix4 normalized_transformation;
- normalized_transformation.setTranslation(mesh_translation_vector);
-
- LLMatrix4 mesh_scale;
- mesh_scale.initScale(mesh_scale_vector);
- mesh_scale *= normalized_transformation;
- normalized_transformation = mesh_scale;
-
- glh::matrix4f inv_mat((F32*) normalized_transformation.mMatrix);
- inv_mat = inv_mat.inverse();
- LLMatrix4 inverse_normalized_transformation(inv_mat.m);
-
- domSkin::domBind_shape_matrix* bind_mat = skin->getBind_shape_matrix();
-
- if (bind_mat)
- { //get bind shape matrix
- domFloat4x4& dom_value = bind_mat->getValue();
-
- LLMeshSkinInfo& skin_info = model->mSkinInfo;
-
- for (int i = 0; i < 4; i++)
- {
- for(int j = 0; j < 4; j++)
- {
- skin_info.mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
- }
- }
-
- LLMatrix4 trans = normalized_transformation;
- trans *= skin_info.mBindShapeMatrix;
- skin_info.mBindShapeMatrix = trans;
- }
-
-
- //Some collada setup for accessing the skeleton
- daeElement* pElement = 0;
- dae.getDatabase()->getElement( &pElement, 0, 0, "skeleton" );
-
- //Try to get at the skeletal instance controller
- domInstance_controller::domSkeleton* pSkeleton = daeSafeCast<domInstance_controller::domSkeleton>( pElement );
- bool missingSkeletonOrScene = false;
-
- //If no skeleton, do a breadth-first search to get at specific joints
- bool rootNode = false;
-
- //Need to test for a skeleton that does not have a root node
- //This occurs when your instance controller does not have an associated scene
- if ( pSkeleton )
- {
- daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
- if ( pSkeletonRootNode )
- {
- rootNode = true;
- }
-
- }
- if ( !pSkeleton || !rootNode )
- {
- daeElement* pScene = root->getDescendant("visual_scene");
- if ( !pScene )
- {
- LL_WARNS()<<"No visual scene - unable to parse bone offsets "<<LL_ENDL;
- missingSkeletonOrScene = true;
- }
- else
- {
- //Get the children at this level
- daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
- S32 childCount = children.getCount();
-
- //Process any children that are joints
- //Not all children are joints, some code be ambient lights, cameras, geometry etc..
- for (S32 i = 0; i < childCount; ++i)
- {
- domNode* pNode = daeSafeCast<domNode>(children[i]);
- if ( isNodeAJoint( pNode ) )
- {
- processJointNode( pNode, mJointList );
- }
- }
- }
- }
- else
- //Has Skeleton
- {
- //Get the root node of the skeleton
- daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
- if ( pSkeletonRootNode )
- {
- //Once we have the root node - start acccessing it's joint components
- const int jointCnt = mJointMap.size();
- std::map<std::string, std::string> :: const_iterator jointIt = mJointMap.begin();
-
- //Loop over all the possible joints within the .dae - using the allowed joint list in the ctor.
- for ( int i=0; i<jointCnt; ++i, ++jointIt )
- {
- //Build a joint for the resolver to work with
- char str[64]={0};
- sprintf(str,"./%s",(*jointIt).first.c_str() );
- //LL_WARNS()<<"Joint "<< str <<LL_ENDL;
-
- //Setup the resolver
- daeSIDResolver resolver( pSkeletonRootNode, str );
-
- //Look for the joint
- domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() );
- if ( pJoint )
- {
- //Pull out the translate id and store it in the jointTranslations map
- daeSIDResolver jointResolverA( pJoint, "./translate" );
- domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
- daeSIDResolver jointResolverB( pJoint, "./location" );
- domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
-
- LLMatrix4 workingTransform;
-
- //Translation via SID
- if ( pTranslateA )
- {
- extractTranslation( pTranslateA, workingTransform );
- }
- else
- if ( pTranslateB )
- {
- extractTranslation( pTranslateB, workingTransform );
- }
- else
- {
- //Translation via child from element
- daeElement* pTranslateElement = getChildFromElement( pJoint, "translate" );
- if ( pTranslateElement && pTranslateElement->typeID() != domTranslate::ID() )
- {
- LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
- missingSkeletonOrScene = true;
- }
- else
- if ( pTranslateElement )
- {
- extractTranslationViaElement( pTranslateElement, workingTransform );
- }
- else
- {
- extractTranslationViaSID( pJoint, workingTransform );
- }
-
- }
-
- //Store the joint transform w/respect to it's name.
- mJointList[(*jointIt).second.c_str()] = workingTransform;
- }
- }
-
- //If anything failed in regards to extracting the skeleton, joints or translation id,
- //mention it
- if ( missingSkeletonOrScene )
- {
- LL_WARNS()<< "Partial jointmap found in asset - did you mean to just have a partial map?" << LL_ENDL;
- }
- }//got skeleton?
- }
-
-
- domSkin::domJoints* joints = skin->getJoints();
-
- domInputLocal_Array& joint_input = joints->getInput_array();
-
- for (size_t i = 0; i < joint_input.getCount(); ++i)
- {
- domInputLocal* input = joint_input.get(i);
- xsNMTOKEN semantic = input->getSemantic();
-
- if (strcmp(semantic, COMMON_PROFILE_INPUT_JOINT) == 0)
- { //found joint source, fill model->mJointMap and model->mSkinInfo.mJointNames
- daeElement* elem = input->getSource().getElement();
-
- domSource* source = daeSafeCast<domSource>(elem);
- if (source)
- {
-
-
- domName_array* names_source = source->getName_array();
-
- if (names_source)
- {
- domListOfNames &names = names_source->getValue();
-
- for (size_t j = 0; j < names.getCount(); ++j)
- {
- std::string name(names.get(j));
- if (mJointMap.find(name) != mJointMap.end())
- {
- name = mJointMap[name];
- }
- model->mSkinInfo.mJointNames.push_back(name);
- model->mSkinInfo.mJointMap[name] = j;
- }
- }
- else
- {
- domIDREF_array* names_source = source->getIDREF_array();
- if (names_source)
- {
- xsIDREFS& names = names_source->getValue();
-
- for (size_t j = 0; j < names.getCount(); ++j)
- {
- std::string name(names.get(j).getID());
- if (mJointMap.find(name) != mJointMap.end())
- {
- name = mJointMap[name];
- }
- model->mSkinInfo.mJointNames.push_back(name);
- model->mSkinInfo.mJointMap[name] = j;
- }
- }
- }
- }
- }
- else if (strcmp(semantic, COMMON_PROFILE_INPUT_INV_BIND_MATRIX) == 0)
- { //found inv_bind_matrix array, fill model->mInvBindMatrix
- domSource* source = daeSafeCast<domSource>(input->getSource().getElement());
- if (source)
- {
- domFloat_array* t = source->getFloat_array();
- if (t)
- {
- domListOfFloats& transform = t->getValue();
- S32 count = transform.getCount()/16;
-
- for (S32 k = 0; k < count; ++k)
- {
- LLMatrix4 mat;
-
- for (int i = 0; i < 4; i++)
- {
- for(int j = 0; j < 4; j++)
- {
- mat.mMatrix[i][j] = transform[k*16 + i + j*4];
- }
- }
-
- model->mSkinInfo.mInvBindMatrix.push_back(mat);
- }
- }
- }
- }
- }
-
- //Now that we've parsed the joint array, let's determine if we have a full rig
- //(which means we have all the joint sthat are required for an avatar versus
- //a skinned asset attached to a node in a file that contains an entire skeleton,
- //but does not use the skeleton).
- buildJointToNodeMappingFromScene( root );
- mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
-
- if ( !missingSkeletonOrScene )
- {
- //Set the joint translations on the avatar - if it's a full mapping
- //The joints are reset in the dtor
- if ( mPreview->getRigWithSceneParity() )
- {
- std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin();
- std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end();
- for (;masterJointIt!=masterJointItEnd;++masterJointIt )
- {
- std::string lookingForJoint = (*masterJointIt).first.c_str();
-
- if ( mJointList.find( lookingForJoint ) != mJointList.end() )
- {
- //LL_INFOS()<<"joint "<<lookingForJoint.c_str()<<LL_ENDL;
- LLMatrix4 jointTransform = mJointList[lookingForJoint];
- LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
- if ( pJoint )
- {
- LLUUID fake_mesh_id;
- fake_mesh_id.generate();
- pJoint->addAttachmentPosOverride( jointTransform.getTranslation(), fake_mesh_id, gAgentAvatarp->avString());
- }
- else
- {
- //Most likely an error in the asset.
- LL_WARNS()<<"Tried to apply joint position from .dae, but it did not exist in the avatar rig." << LL_ENDL;
- }
- }
- }
- }
- } //missingSkeletonOrScene
-
-
- //We need to construct the alternate bind matrix (which contains the new joint positions)
- //in the same order as they were stored in the joint buffer. The joints associated
- //with the skeleton are not stored in the same order as they are in the exported joint buffer.
- //This remaps the skeletal joints to be in the same order as the joints stored in the model.
- std::vector<std::string> :: const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
- const int jointCnt = model->mSkinInfo.mJointNames.size();
- for ( int i=0; i<jointCnt; ++i, ++jointIt )
- {
- std::string lookingForJoint = (*jointIt).c_str();
- //Look for the joint xform that we extracted from the skeleton, using the jointIt as the key
- //and store it in the alternate bind matrix
- if ( mJointList.find( lookingForJoint ) != mJointList.end() )
- {
- LLMatrix4 jointTransform = mJointList[lookingForJoint];
- LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];
- newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() );
- model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse );
- }
- else
- {
- LL_WARNS()<<"Possibly misnamed/missing joint [" <<lookingForJoint.c_str()<<" ] "<<LL_ENDL;
- }
- }
-
- //grab raw position array
-
- domVertices* verts = mesh->getVertices();
- if (verts)
- {
- domInputLocal_Array& inputs = verts->getInput_array();
- for (size_t i = 0; i < inputs.getCount() && model->mPosition.empty(); ++i)
- {
- if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_POSITION) == 0)
- {
- domSource* pos_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
- if (pos_source)
- {
- domFloat_array* pos_array = pos_source->getFloat_array();
- if (pos_array)
- {
- domListOfFloats& pos = pos_array->getValue();
-
- for (size_t j = 0; j < pos.getCount(); j += 3)
- {
- if (pos.getCount() <= j+2)
- {
- LL_ERRS() << "Invalid position array size." << LL_ENDL;
- }
-
- LLVector3 v(pos[j], pos[j+1], pos[j+2]);
-
- //transform from COLLADA space to volume space
- v = v * inverse_normalized_transformation;
-
- model->mPosition.push_back(v);
- }
- }
- }
- }
- }
- }
-
- //grab skin weights array
- domSkin::domVertex_weights* weights = skin->getVertex_weights();
- if (weights)
- {
- domInputLocalOffset_Array& inputs = weights->getInput_array();
- domFloat_array* vertex_weights = NULL;
- for (size_t i = 0; i < inputs.getCount(); ++i)
- {
- if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_WEIGHT) == 0)
- {
- domSource* weight_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
- if (weight_source)
- {
- vertex_weights = weight_source->getFloat_array();
- }
- }
- }
-
- if (vertex_weights)
- {
- domListOfFloats& w = vertex_weights->getValue();
- domListOfUInts& vcount = weights->getVcount()->getValue();
- domListOfInts& v = weights->getV()->getValue();
-
- U32 c_idx = 0;
- for (size_t vc_idx = 0; vc_idx < vcount.getCount(); ++vc_idx)
- { //for each vertex
- daeUInt count = vcount[vc_idx];
-
- //create list of weights that influence this vertex
- LLModel::weight_list weight_list;
-
- for (daeUInt i = 0; i < count; ++i)
- { //for each weight
- daeInt joint_idx = v[c_idx++];
- daeInt weight_idx = v[c_idx++];
-
- if (joint_idx == -1)
- {
- //ignore bindings to bind_shape_matrix
- continue;
- }
-
- F32 weight_value = w[weight_idx];
-
- weight_list.push_back(LLModel::JointWeight(joint_idx, weight_value));
- }
-
- //sort by joint weight
- std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater());
-
- std::vector<LLModel::JointWeight> wght;
-
- F32 total = 0.f;
-
- for (U32 i = 0; i < llmin((U32) 4, (U32) weight_list.size()); ++i)
- { //take up to 4 most significant weights
- if (weight_list[i].mWeight > 0.f)
- {
- wght.push_back( weight_list[i] );
- total += weight_list[i].mWeight;
- }
- }
-
- F32 scale = 1.f/total;
- if (scale != 1.f)
- { //normalize weights
- for (U32 i = 0; i < wght.size(); ++i)
- {
- wght[i].mWeight *= scale;
- }
- }
-
- model->mSkinWeights[model->mPosition[vc_idx]] = wght;
- }
-
- //add instance to scene for this model
-
- LLMatrix4 transformation = mTransform;
- // adjust the transformation to compensate for mesh normalization
-
- LLMatrix4 mesh_translation;
- mesh_translation.setTranslation(mesh_translation_vector);
- mesh_translation *= transformation;
- transformation = mesh_translation;
-
- LLMatrix4 mesh_scale;
- mesh_scale.initScale(mesh_scale_vector);
- mesh_scale *= transformation;
- transformation = mesh_scale;
-
- std::map<std::string, LLImportMaterial> materials;
- for (U32 i = 0; i < model->mMaterialList.size(); ++i)
- {
- materials[model->mMaterialList[i]] = LLImportMaterial();
- }
- mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
- stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
- }
- }
- }
- }
- }
- }
- }
-
- daeElement* scene = root->getDescendant("visual_scene");
-
- if (!scene)
- {
- LL_WARNS() << "document has no visual_scene" << LL_ENDL;
- setLoadState( ERROR_PARSING );
- return true;
- }
-
- setLoadState( DONE );
-
- bool badElement = false;
-
- processElement( scene, badElement );
-
- if ( badElement )
- {
- setLoadState( ERROR_PARSING );
- }
-
- return true;
-}
-
-void LLModelLoader::setLoadState(U32 state)
-{
- if (mPreview)
- {
- mPreview->setLoadState(state);
- }
-}
-
-bool LLModelLoader::loadFromSLM(const std::string& filename)
-{
- //only need to populate mScene with data from slm
- llstat stat;
-
- if (LLFile::stat(filename, &stat))
- { //file does not exist
- return false;
- }
-
- S32 file_size = (S32) stat.st_size;
-
- llifstream ifstream(filename.c_str(), std::ifstream::in | std::ifstream::binary);
- LLSD data;
- LLSDSerialize::fromBinary(data, ifstream, file_size);
- ifstream.close();
-
- //build model list for each LoD
- model_list model[LLModel::NUM_LODS];
-
- if (data["version"].asInteger() != SLM_SUPPORTED_VERSION)
- { //unsupported version
- return false;
- }
-
- LLSD& mesh = data["mesh"];
-
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
-
- for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
- {
- for (U32 i = 0; i < mesh.size(); ++i)
- {
- std::stringstream str(mesh[i].asString());
- LLPointer<LLModel> loaded_model = new LLModel(volume_params, (F32) lod);
- if (loaded_model->loadModel(str))
- {
- loaded_model->mLocalID = i;
- model[lod].push_back(loaded_model);
-
- if (lod == LLModel::LOD_HIGH && !loaded_model->mSkinInfo.mJointNames.empty())
- {
- //check to see if rig is valid
- mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
- }
- }
- }
- }
-
- if (model[LLModel::LOD_HIGH].empty())
- { //failed to load high lod
- return false;
- }
-
- // Set name.
- std::string name = data["name"];
- if (!name.empty())
- {
- model[LLModel::LOD_HIGH][0]->mLabel = name;
- }
-
-
- //load instance list
- model_instance_list instance_list;
-
- LLSD& instance = data["instance"];
-
- for (U32 i = 0; i < instance.size(); ++i)
- {
- //deserialize instance list
- instance_list.push_back(LLModelInstance(instance[i]));
-
- //match up model instance pointers
- S32 idx = instance_list[i].mLocalMeshID;
-
- for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
- {
- if (!model[lod].empty())
- {
- instance_list[i].mLOD[lod] = model[lod][idx];
- }
- }
-
- instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
- }
-
-
- //convert instance_list to mScene
- mFirstTransform = TRUE;
- for (U32 i = 0; i < instance_list.size(); ++i)
- {
- LLModelInstance& cur_instance = instance_list[i];
- mScene[cur_instance.mTransform].push_back(cur_instance);
- stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform);
- }
-
- setLoadState( DONE );
-
- return true;
-}
-
-//static
-bool LLModelLoader::isAlive(LLModelLoader* loader)
-{
- if(!loader)
- {
- return false ;
- }
-
- std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
- for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
-
- return *iter == loader ;
-}
-
-void LLModelLoader::loadModelCallback()
-{
- assert_main_thread();
-
- if (mPreview)
- {
- mPreview->loadModelCallback(mLod);
- }
-
- while (!isStopped())
- { //wait until this thread is stopped before deleting self
- apr_sleep(100);
- }
-
- //doubel check if "this" is valid before deleting it, in case it is aborted during running.
- if(!isAlive(this))
- {
- return ;
- }
-
- //cleanup model loader
- if (mPreview)
- {
- mPreview->mModelLoader = NULL;
- }
-
- delete this;
-}
-//-----------------------------------------------------------------------------
-// buildJointToNodeMappingFromScene()
-//-----------------------------------------------------------------------------
-void LLModelLoader::buildJointToNodeMappingFromScene( daeElement* pRoot )
-{
- daeElement* pScene = pRoot->getDescendant("visual_scene");
- if ( pScene )
- {
- daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
- S32 childCount = children.getCount();
- for (S32 i = 0; i < childCount; ++i)
- {
- domNode* pNode = daeSafeCast<domNode>(children[i]);
- processJointToNodeMapping( pNode );
- }
- }
-}
-//-----------------------------------------------------------------------------
-// processJointToNodeMapping()
-//-----------------------------------------------------------------------------
-void LLModelLoader::processJointToNodeMapping( domNode* pNode )
-{
- if ( isNodeAJoint( pNode ) )
- {
- //1.Store the parent
- std::string nodeName = pNode->getName();
- if ( !nodeName.empty() )
- {
- mJointsFromNode.push_front( pNode->getName() );
- }
- //2. Handle the kiddo's
- processChildJoints( pNode );
- }
- else
- {
- //Determine if the're any children wrt to this failed node.
- //This occurs when an armature is exported and ends up being what essentially amounts to
- //as the root for the visual_scene
- if ( pNode )
- {
- processChildJoints( pNode );
- }
- else
- {
- LL_INFOS()<<"Node is NULL"<<LL_ENDL;
- }
-
- }
-}
-//-----------------------------------------------------------------------------
-// processChildJoint()
-//-----------------------------------------------------------------------------
-void LLModelLoader::processChildJoints( domNode* pParentNode )
-{
- daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren();
- S32 childOfChildCount = childOfChild.getCount();
- for (S32 i = 0; i < childOfChildCount; ++i)
- {
- domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
- if ( pChildNode )
- {
- processJointToNodeMapping( pChildNode );
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// critiqueRigForUploadApplicability()
-//-----------------------------------------------------------------------------
-void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset )
-{
- critiqueJointToNodeMappingFromScene();
-
- //Determines the following use cases for a rig:
- //1. It is suitable for upload with skin weights & joint positions, or
- //2. It is suitable for upload as standard av with just skin weights
-
- bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
- bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
-
- //It's OK that both could end up being true, both default to false
- if ( isJointPositionUploadOK )
- {
- setRigValidForJointPositionUpload( true );
- }
-
- if ( isRigLegacyOK)
- {
- setLegacyRigValid( true );
- }
-
-}
-//-----------------------------------------------------------------------------
-// critiqueJointToNodeMappingFromScene()
-//-----------------------------------------------------------------------------
-void LLModelPreview::critiqueJointToNodeMappingFromScene( void )
-{
- //Do the actual nodes back the joint listing from the dae?
- //if yes then this is a fully rigged asset, otherwise it's just a partial rig
-
- std::deque<std::string>::iterator jointsFromNodeIt = mJointsFromNode.begin();
- std::deque<std::string>::iterator jointsFromNodeEndIt = mJointsFromNode.end();
- bool result = true;
-
- if ( !mJointsFromNode.empty() )
- {
- for ( ;jointsFromNodeIt!=jointsFromNodeEndIt;++jointsFromNodeIt )
- {
- std::string name = *jointsFromNodeIt;
- if ( mJointTransformMap.find( name ) != mJointTransformMap.end() )
- {
- continue;
- }
- else
- {
- LL_INFOS()<<"critiqueJointToNodeMappingFromScene is missing a: "<<name<<LL_ENDL;
- result = false;
- }
- }
- }
- else
- {
- result = false;
- }
-
- //Determines the following use cases for a rig:
- //1. Full av rig w/1-1 mapping from the scene and joint array
- //2. Partial rig but w/o parity between the scene and joint array
- if ( result )
- {
- setRigWithSceneParity( true );
- }
-}
-//-----------------------------------------------------------------------------
-// isRigLegacy()
-//-----------------------------------------------------------------------------
-bool LLModelPreview::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
-{
- //No joints in asset
- if ( jointListFromAsset.size() == 0 )
- {
- return false;
- }
-
- bool result = false;
-
- std::deque<std::string> :: const_iterator masterJointIt = mMasterLegacyJointList.begin();
- std::deque<std::string> :: const_iterator masterJointEndIt = mMasterLegacyJointList.end();
-
- std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
- std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
-
- for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
- {
- result = false;
- modelJointIt = jointListFromAsset.begin();
-
- for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
- {
- if ( *masterJointIt == *modelJointIt )
- {
- result = true;
- break;
- }
- }
- if ( !result )
- {
- LL_INFOS()<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< LL_ENDL;
- break;
- }
- }
- return result;
-}
-//-----------------------------------------------------------------------------
-// isRigSuitableForJointPositionUpload()
-//-----------------------------------------------------------------------------
-bool LLModelPreview::isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset )
-{
- bool result = false;
-
- std::deque<std::string> :: const_iterator masterJointIt = mMasterJointList.begin();
- std::deque<std::string> :: const_iterator masterJointEndIt = mMasterJointList.end();
-
- std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
- std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
-
- for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
- {
- result = false;
- modelJointIt = jointListFromAsset.begin();
-
- for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
- {
- if ( *masterJointIt == *modelJointIt )
- {
- result = true;
- break;
- }
- }
- if ( !result )
- {
- LL_INFOS()<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< LL_ENDL;
- break;
- }
- }
- return result;
-}
-
-
-//called in the main thread
-void LLModelLoader::loadTextures()
-{
- BOOL is_paused = isPaused() ;
- pause() ; //pause the loader
-
- for(scene::iterator iter = mScene.begin(); iter != mScene.end(); ++iter)
- {
- for(U32 i = 0 ; i < iter->second.size(); i++)
- {
- for(std::map<std::string, LLImportMaterial>::iterator j = iter->second[i].mMaterial.begin();
- j != iter->second[i].mMaterial.end(); ++j)
- {
- LLImportMaterial& material = j->second;
-
- if(!material.mDiffuseMapFilename.empty())
- {
- material.mDiffuseMap =
- LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW);
- material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);
- material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX);
- mNumOfFetchingTextures++ ;
- }
- }
- }
- }
-
- if(!is_paused)
- {
- unpause() ;
- }
-}
-
-//-----------------------------------------------------------------------------
-// isNodeAJoint()
-//-----------------------------------------------------------------------------
-bool LLModelLoader::isNodeAJoint( domNode* pNode )
-{
- if ( !pNode )
- {
- LL_INFOS()<<"Created node is NULL"<<LL_ENDL;
- return false;
- }
-
- if ( pNode->getName() == NULL )
- {
- LL_INFOS()<<"Parsed node has no name "<<LL_ENDL;
- //Attempt to write the node id, if possible (aids in debugging the visual scene)
- if ( pNode->getId() )
- {
- LL_INFOS()<<"Parsed node ID: "<<pNode->getId()<<LL_ENDL;
- }
- return false;
- }
-
- if ( mJointMap.find( pNode->getName() ) != mJointMap.end() )
- {
- return true;
- }
-
- return false;
-}
-//-----------------------------------------------------------------------------
-// verifyCount
-//-----------------------------------------------------------------------------
-bool LLModelPreview::verifyCount( int expected, int result )
-{
- if ( expected != result )
- {
- LL_INFOS()<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<LL_ENDL;
- return false;
- }
- return true;
-}
-//-----------------------------------------------------------------------------
-// verifyController
-//-----------------------------------------------------------------------------
-bool LLModelPreview::verifyController( domController* pController )
-{
-
- bool result = true;
-
- domSkin* pSkin = pController->getSkin();
-
- if ( pSkin )
- {
- xsAnyURI & uri = pSkin->getSource();
- domElement* pElement = uri.getElement();
-
- if ( !pElement )
- {
- LL_INFOS()<<"Can't resolve skin source"<<LL_ENDL;
- return false;
- }
-
- daeString type_str = pElement->getTypeName();
- if ( stricmp(type_str, "geometry") == 0 )
- {
- //Skin is reference directly by geometry and get the vertex count from skin
- domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights();
- U32 vertexWeightsCount = pVertexWeights->getCount();
- domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement();
- domMesh* pMesh = pGeometry->getMesh();
-
- if ( pMesh )
- {
- //Get vertex count from geometry
- domVertices* pVertices = pMesh->getVertices();
- if ( !pVertices )
- {
- LL_INFOS()<<"No vertices!"<<LL_ENDL;
- return false;
- }
-
- if ( pVertices )
- {
- xsAnyURI src = pVertices->getInput_array()[0]->getSource();
- domSource* pSource = (domSource*) (domElement*) src.getElement();
- U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount();
- result = verifyCount( verticesCount, vertexWeightsCount );
- if ( !result )
- {
- return result;
- }
- }
- }
-
- U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount();
- result = verifyCount( vcountCount, vertexWeightsCount );
- if ( !result )
- {
- return result;
- }
-
- domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array();
- U32 sum = 0;
- for (size_t i=0; i<vcountCount; i++)
- {
- sum += pVertexWeights->getVcount()->getValue()[i];
- }
- result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() );
- }
- }
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-// extractTranslation()
-//-----------------------------------------------------------------------------
-void LLModelLoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& transform )
-{
- domFloat3 jointTrans = pTranslate->getValue();
- LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] );
- transform.setTranslation( singleJointTranslation );
-}
-//-----------------------------------------------------------------------------
-// extractTranslationViaElement()
-//-----------------------------------------------------------------------------
-void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform )
-{
- if ( pTranslateElement )
- {
- domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement );
- domFloat3 translateChild = pTranslateChild->getValue();
- LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] );
- transform.setTranslation( singleJointTranslation );
- }
-}
-//-----------------------------------------------------------------------------
-// extractTranslationViaSID()
-//-----------------------------------------------------------------------------
-void LLModelLoader::extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform )
-{
- if ( pElement )
- {
- daeSIDResolver resolver( pElement, "./transform" );
- domMatrix* pMatrix = daeSafeCast<domMatrix>( resolver.getElement() );
- //We are only extracting out the translational component atm
- LLMatrix4 workingTransform;
- if ( pMatrix )
- {
- domFloat4x4 domArray = pMatrix->getValue();
- for ( int i = 0; i < 4; i++ )
- {
- for( int j = 0; j < 4; j++ )
- {
- workingTransform.mMatrix[i][j] = domArray[i + j*4];
- }
- }
- LLVector3 trans = workingTransform.getTranslation();
- transform.setTranslation( trans );
- }
- }
- else
- {
- LL_WARNS()<<"Element is nonexistent - empty/unsupported node."<<LL_ENDL;
- }
-}
-//-----------------------------------------------------------------------------
-// processJointNode()
-//-----------------------------------------------------------------------------
-void LLModelLoader::processJointNode( domNode* pNode, JointTransformMap& jointTransforms )
-{
- if (pNode->getName() == NULL)
- {
- LL_WARNS() << "nameless node, can't process" << LL_ENDL;
- return;
- }
-
- //LL_WARNS()<<"ProcessJointNode# Node:" <<pNode->getName()<<LL_ENDL;
-
- //1. handle the incoming node - extract out translation via SID or element
-
- LLMatrix4 workingTransform;
-
- //Pull out the translate id and store it in the jointTranslations map
- daeSIDResolver jointResolverA( pNode, "./translate" );
- domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
- daeSIDResolver jointResolverB( pNode, "./location" );
- domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
-
- //Translation via SID was successful
- if ( pTranslateA )
- {
- extractTranslation( pTranslateA, workingTransform );
- }
- else
- if ( pTranslateB )
- {
- extractTranslation( pTranslateB, workingTransform );
- }
- else
- {
- //Translation via child from element
- daeElement* pTranslateElement = getChildFromElement( pNode, "translate" );
- if ( !pTranslateElement || pTranslateElement->typeID() != domTranslate::ID() )
- {
- //LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
- daeSIDResolver jointResolver( pNode, "./matrix" );
- domMatrix* pMatrix = daeSafeCast<domMatrix>( jointResolver.getElement() );
- if ( pMatrix )
- {
- //LL_INFOS()<<"A matrix SID was however found!"<<LL_ENDL;
- domFloat4x4 domArray = pMatrix->getValue();
- for ( int i = 0; i < 4; i++ )
- {
- for( int j = 0; j < 4; j++ )
- {
- workingTransform.mMatrix[i][j] = domArray[i + j*4];
- }
- }
- }
- else
- {
- LL_WARNS()<< "The found element is not translate or matrix node - most likely a corrupt export!" <<LL_ENDL;
- }
- }
- else
- {
- extractTranslationViaElement( pTranslateElement, workingTransform );
- }
- }
-
- //Store the working transform relative to the nodes name.
- jointTransforms[ pNode->getName() ] = workingTransform;
-
- //2. handle the nodes children
-
- //Gather and handle the incoming nodes children
- daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren();
- S32 childOfChildCount = childOfChild.getCount();
-
- for (S32 i = 0; i < childOfChildCount; ++i)
- {
- domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
- if ( pChildNode )
- {
- processJointNode( pChildNode, jointTransforms );
- }
- }
-}
-//-----------------------------------------------------------------------------
-// getChildFromElement()
-//-----------------------------------------------------------------------------
-daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::string const & name )
-{
- daeElement* pChildOfElement = pElement->getChild( name.c_str() );
- if ( pChildOfElement )
- {
- return pChildOfElement;
- }
- LL_WARNS()<< "Could not find a child [" << name << "] for the element: \"" << pElement->getAttribute("id") << "\"" << LL_ENDL;
- return NULL;
-}
-
-void LLModelLoader::processElement( daeElement* element, bool& badElement )
-{
- LLMatrix4 saved_transform = mTransform;
-
- domTranslate* translate = daeSafeCast<domTranslate>(element);
- if (translate)
- {
- domFloat3 dom_value = translate->getValue();
-
- LLMatrix4 translation;
- translation.setTranslation(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
-
- translation *= mTransform;
- mTransform = translation;
- }
-
- domRotate* rotate = daeSafeCast<domRotate>(element);
- if (rotate)
- {
- domFloat4 dom_value = rotate->getValue();
-
- LLMatrix4 rotation;
- rotation.initRotTrans(dom_value[3] * DEG_TO_RAD, LLVector3(dom_value[0], dom_value[1], dom_value[2]), LLVector3(0, 0, 0));
-
- rotation *= mTransform;
- mTransform = rotation;
- }
-
- domScale* scale = daeSafeCast<domScale>(element);
- if (scale)
- {
- domFloat3 dom_value = scale->getValue();
-
-
- LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]);
- scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes
- LLMatrix4 scaling;
- scaling.initScale(scale_vector);
-
- scaling *= mTransform;
- mTransform = scaling;
- }
-
- domMatrix* matrix = daeSafeCast<domMatrix>(element);
- if (matrix)
- {
- domFloat4x4 dom_value = matrix->getValue();
-
- LLMatrix4 matrix_transform;
-
- for (int i = 0; i < 4; i++)
- {
- for(int j = 0; j < 4; j++)
- {
- matrix_transform.mMatrix[i][j] = dom_value[i + j*4];
- }
- }
-
- matrix_transform *= mTransform;
- mTransform = matrix_transform;
- }
-
- domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element);
- if (instance_geo)
- {
- domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement());
- if (geo)
- {
- domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID())));
- if (mesh)
- {
- LLModel* model = mModel[mesh];
- if (model)
- {
- LLMatrix4 transformation = mTransform;
-
- if (mTransform.determinant() < 0)
- { //negative scales are not supported
- LL_INFOS() << "Negative scale detected, unsupported transform. domInstance_geometry: " << LLModel::getElementLabel(instance_geo) << LL_ENDL;
- badElement = true;
- }
-
- std::map<std::string, LLImportMaterial> materials = getMaterials(model, instance_geo);
-
- // adjust the transformation to compensate for mesh normalization
- LLVector3 mesh_scale_vector;
- LLVector3 mesh_translation_vector;
- model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
-
- LLMatrix4 mesh_translation;
- mesh_translation.setTranslation(mesh_translation_vector);
- mesh_translation *= transformation;
- transformation = mesh_translation;
-
- LLMatrix4 mesh_scale;
- mesh_scale.initScale(mesh_scale_vector);
- mesh_scale *= transformation;
- transformation = mesh_scale;
-
- std::string label = getElementLabel(instance_geo);
- mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
-
- stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
- }
- }
- }
- else
- {
- LL_INFOS()<<"Unable to resolve geometry URL."<<LL_ENDL;
- badElement = true;
- }
-
- }
-
- domInstance_node* instance_node = daeSafeCast<domInstance_node>(element);
- if (instance_node)
- {
- daeElement* instance = instance_node->getUrl().getElement();
- if (instance)
- {
- processElement(instance,badElement);
- }
- }
-
- //process children
- daeTArray< daeSmartRef<daeElement> > children = element->getChildren();
- int childCount = children.getCount();
- for (S32 i = 0; i < childCount; i++)
- {
- processElement(children[i],badElement);
- }
-
- domNode* node = daeSafeCast<domNode>(element);
- if (node)
- { //this element was a node, restore transform before processiing siblings
- mTransform = saved_transform;
- }
-}
-
-std::map<std::string, LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)
-{
- std::map<std::string, LLImportMaterial> materials;
- for (int i = 0; i < model->mMaterialList.size(); i++)
- {
- LLImportMaterial import_material;
-
- domInstance_material* instance_mat = NULL;
-
- domBind_material::domTechnique_common* technique =
- daeSafeCast<domBind_material::domTechnique_common>(instance_geo->getDescendant(daeElement::matchType(domBind_material::domTechnique_common::ID())));
-
- if (technique)
- {
- daeTArray< daeSmartRef<domInstance_material> > inst_materials = technique->getChildrenByType<domInstance_material>();
- for (int j = 0; j < inst_materials.getCount(); j++)
- {
- std::string symbol(inst_materials[j]->getSymbol());
-
- if (symbol == model->mMaterialList[i]) // found the binding
- {
- instance_mat = inst_materials[j];
- }
- }
- }
-
- if (instance_mat)
- {
- domMaterial* material = daeSafeCast<domMaterial>(instance_mat->getTarget().getElement());
- if (material)
- {
- domInstance_effect* instance_effect =
- daeSafeCast<domInstance_effect>(material->getDescendant(daeElement::matchType(domInstance_effect::ID())));
- if (instance_effect)
- {
- domEffect* effect = daeSafeCast<domEffect>(instance_effect->getUrl().getElement());
- if (effect)
- {
- domProfile_COMMON* profile =
- daeSafeCast<domProfile_COMMON>(effect->getDescendant(daeElement::matchType(domProfile_COMMON::ID())));
- if (profile)
- {
- import_material = profileToMaterial(profile);
- }
- }
- }
- }
- }
-
- import_material.mBinding = model->mMaterialList[i];
- materials[model->mMaterialList[i]] = import_material;
- }
-
- return materials;
-}
-
-LLImportMaterial LLModelLoader::profileToMaterial(domProfile_COMMON* material)
-{
- LLImportMaterial mat;
- mat.mFullbright = FALSE;
-
- daeElement* diffuse = material->getDescendant("diffuse");
- if (diffuse)
- {
- domCommon_color_or_texture_type_complexType::domTexture* texture =
- daeSafeCast<domCommon_color_or_texture_type_complexType::domTexture>(diffuse->getDescendant("texture"));
- if (texture)
- {
- domCommon_newparam_type_Array newparams = material->getNewparam_array();
- for (S32 i = 0; i < newparams.getCount(); i++)
- {
- domFx_surface_common* surface = newparams[i]->getSurface();
- if (surface)
- {
- domFx_surface_init_common* init = surface->getFx_surface_init_common();
- if (init)
- {
- domFx_surface_init_from_common_Array init_from = init->getInit_from_array();
-
- if (init_from.getCount() > i)
- {
- domImage* image = daeSafeCast<domImage>(init_from[i]->getValue().getElement());
- if (image)
- {
- // we only support init_from now - embedded data will come later
- domImage::domInit_from* init = image->getInit_from();
- if (init)
- {
- mat.mDiffuseMapFilename = cdom::uriToNativePath(init->getValue().str());
- mat.mDiffuseMapLabel = getElementLabel(material);
- }
- }
- }
- }
- }
- }
- }
-
- domCommon_color_or_texture_type_complexType::domColor* color =
- daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(diffuse->getDescendant("color"));
- if (color)
- {
- domFx_color_common domfx_color = color->getValue();
- LLColor4 value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
- mat.mDiffuseColor = value;
- }
- }
-
- daeElement* emission = material->getDescendant("emission");
- if (emission)
- {
- LLColor4 emission_color = getDaeColor(emission);
- if (((emission_color[0] + emission_color[1] + emission_color[2]) / 3.0) > 0.25)
- {
- mat.mFullbright = TRUE;
- }
- }
-
- return mat;
-}
-
-// try to get a decent label for this element
-std::string LLModelLoader::getElementLabel(daeElement *element)
-{
- // if we have a name attribute, use it
- std::string name = element->getAttribute("name");
- if (name.length())
- {
- return name;
- }
-
- // if we have an ID attribute, use it
- if (element->getID())
- {
- return std::string(element->getID());
- }
-
- // if we have a parent, use it
- daeElement* parent = element->getParent();
- if (parent)
- {
- // if parent has a name, use it
- std::string name = parent->getAttribute("name");
- if (name.length())
- {
- return name;
- }
-
- // if parent has an ID, use it
- if (parent->getID())
- {
- return std::string(parent->getID());
- }
- }
-
- // try to use our type
- daeString element_name = element->getElementName();
- if (element_name)
- {
- return std::string(element_name);
- }
-
- // if all else fails, use "object"
- return std::string("object");
-}
-
-LLColor4 LLModelLoader::getDaeColor(daeElement* element)
-{
- LLColor4 value;
- domCommon_color_or_texture_type_complexType::domColor* color =
- daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(element->getDescendant("color"));
- if (color)
- {
- domFx_color_common domfx_color = color->getValue();
- value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
- }
-
- return value;
-}
-
-//-----------------------------------------------------------------------------
// LLModelPreview
//-----------------------------------------------------------------------------
@@ -3125,7 +1181,9 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
, mPelvisZOffset( 0.0f )
, mLegacyRigValid( false )
, mRigValidJointUpload( false )
+, mPhysicsSearchLOD( LLModel::LOD_PHYSICS )
, mResetJoints( false )
+, mModelNoErrors( true )
, mRigParityWithScene( false )
, mLastJointUpdate( false )
{
@@ -3170,51 +1228,20 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
glodInit();
- //move into joint mapper class
- //1. joints for joint offset verification
- mMasterJointList.push_front("mPelvis");
- mMasterJointList.push_front("mTorso");
- mMasterJointList.push_front("mChest");
- mMasterJointList.push_front("mNeck");
- mMasterJointList.push_front("mHead");
- mMasterJointList.push_front("mCollarLeft");
- mMasterJointList.push_front("mShoulderLeft");
- mMasterJointList.push_front("mElbowLeft");
- mMasterJointList.push_front("mWristLeft");
- mMasterJointList.push_front("mCollarRight");
- mMasterJointList.push_front("mShoulderRight");
- mMasterJointList.push_front("mElbowRight");
- mMasterJointList.push_front("mWristRight");
- mMasterJointList.push_front("mHipRight");
- mMasterJointList.push_front("mKneeRight");
- mMasterJointList.push_front("mFootRight");
- mMasterJointList.push_front("mHipLeft");
- mMasterJointList.push_front("mKneeLeft");
- mMasterJointList.push_front("mFootLeft");
- //2. legacy joint list - used to verify rigs that will not be using joint offsets
- mMasterLegacyJointList.push_front("mPelvis");
- mMasterLegacyJointList.push_front("mTorso");
- mMasterLegacyJointList.push_front("mChest");
- mMasterLegacyJointList.push_front("mNeck");
- mMasterLegacyJointList.push_front("mHead");
- mMasterLegacyJointList.push_front("mHipRight");
- mMasterLegacyJointList.push_front("mKneeRight");
- mMasterLegacyJointList.push_front("mFootRight");
- mMasterLegacyJointList.push_front("mHipLeft");
- mMasterLegacyJointList.push_front("mKneeLeft");
- mMasterLegacyJointList.push_front("mFootLeft");
-
createPreviewAvatar();
}
LLModelPreview::~LLModelPreview()
{
- if (mModelLoader)
- {
- mModelLoader->mPreview = NULL;
- mModelLoader = NULL;
- }
- //*HACK : *TODO : turn this back on when we understand why this crashes
+ // glod apparently has internal mem alignment issues that are angering
+ // the heap-check code in windows, these should be hunted down in that
+ // TP code, if possible
+ //
+ // kernel32.dll!HeapFree() + 0x14 bytes
+ // msvcr100.dll!free(void * pBlock) Line 51 C
+ // glod.dll!glodGetGroupParameteriv() + 0x119 bytes
+ // glod.dll!glodShutdown() + 0x77 bytes
+ //
//glodShutdown();
}
@@ -3284,7 +1311,9 @@ U32 LLModelPreview::calcResourceCost()
decomp,
mFMP->childGetValue("upload_skin").asBoolean(),
mFMP->childGetValue("upload_joints").asBoolean(),
- TRUE);
+ TRUE,
+ FALSE,
+ instance.mModel->mSubmodelID);
num_hulls += decomp.mHull.size();
for (U32 i = 0; i < decomp.mHull.size(); ++i)
@@ -3351,29 +1380,12 @@ void LLModelPreview::rebuildUploadData()
F32 max_scale = 0.f;
- //reorder materials to match mBaseModel
- for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
- {
- if (mBaseModel.size() == mModel[i].size())
- {
- for (U32 j = 0; j < mBaseModel.size(); ++j)
- {
-
- int refFaceCnt = 0;
- int modelFaceCnt = 0;
-
- if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
- {
- setLoadState( LLModelLoader::ERROR_MATERIALS );
- mFMP->childDisable( "calculate_btn" );
- }
- }
- }
- }
+ BOOL importerDebug = gSavedSettings.getBOOL("ImporterDebug");
+ BOOL legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");
for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter)
{ //for each transform in scene
- LLMatrix4 mat = iter->first;
+ LLMatrix4 mat = iter->first;
// compute position
LLVector3 position = LLVector3(0, 0, 0) * mat;
@@ -3390,38 +1402,171 @@ void LLModelPreview::rebuildUploadData()
mat *= scale_mat;
- for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
- { //for each instance with said transform applied
- LLModelInstance instance = *model_iter;
+ for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end();)
+ { //for each instance with said transform applied
+ LLModelInstance instance = *model_iter++;
LLModel* base_model = instance.mModel;
- if (base_model)
+ if (base_model && !requested_name.empty())
{
base_model->mRequestedLabel = requested_name;
base_model->mMetric = metric;
}
- S32 idx = 0;
- for (idx = 0; idx < mBaseModel.size(); ++idx)
- { //find reference instance for this model
- if (mBaseModel[idx] == base_model)
+ for (int i = LLModel::NUM_LODS - 1; i >= LLModel::LOD_IMPOSTOR; i--)
+ {
+ LLModel* lod_model = NULL;
+ if (!legacyMatching)
{
- break;
+ // Fill LOD slots by finding matching meshes by label with name extensions
+ // in the appropriate scene for each LOD. This fixes all kinds of issues
+ // where the indexed method below fails in spectacular fashion.
+ // If you don't take the time to name your LOD and PHYS meshes
+ // with the name of their corresponding mesh in the HIGH LOD,
+ // then the indexed method will be attempted below.
+
+ LLMatrix4 transform;
+
+ std::string name_to_match = instance.mLabel;
+ llassert(!name_to_match.empty());
+
+ int extensionLOD;
+ if (i != LLModel::LOD_PHYSICS || mModel[LLModel::LOD_PHYSICS].empty())
+ {
+ extensionLOD = i;
+ }
+ else
+ {
+ //Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for
+ extensionLOD = mPhysicsSearchLOD;
+ }
+
+ std::string toAdd;
+ switch (extensionLOD)
+ {
+ case LLModel::LOD_IMPOSTOR: toAdd = "_LOD0"; break;
+ case LLModel::LOD_LOW: toAdd = "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: toAdd = "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: toAdd = "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ if (name_to_match.find(toAdd) == -1)
+ {
+ name_to_match += toAdd;
+ }
+
+ FindModel(mScene[i], name_to_match, lod_model, transform);
+
+ if (!lod_model && i != LLModel::LOD_PHYSICS)
+ {
+ if (importerDebug)
+ {
+ LL_INFOS() << "Search of" << name_to_match << " in LOD" << i << " list failed. Searching for alternative among LOD lists." << LL_ENDL;
+ }
+
+ int searchLOD = (i > LLModel::LOD_HIGH) ? LLModel::LOD_HIGH : i;
+ while ((searchLOD <= LLModel::LOD_HIGH) && !lod_model)
+ {
+ std::string name_to_match = instance.mLabel;
+ llassert(!name_to_match.empty());
+
+ std::string toAdd;
+ switch (searchLOD)
+ {
+ case LLModel::LOD_IMPOSTOR: toAdd = "_LOD0"; break;
+ case LLModel::LOD_LOW: toAdd = "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: toAdd = "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: toAdd = "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ if (name_to_match.find(toAdd) == -1)
+ {
+ name_to_match += toAdd;
+ }
+
+ // See if we can find an appropriately named model in LOD 'searchLOD'
+ //
+ FindModel(mScene[searchLOD], name_to_match, lod_model, transform);
+ searchLOD++;
+ }
+ }
}
- }
+ else
+ {
+ // Use old method of index-based association
+ U32 idx = 0;
+ for (idx = 0; idx < mBaseModel.size(); ++idx)
+ {
+ // find reference instance for this model
+ if (mBaseModel[idx] == base_model)
+ {
+ if (importerDebug)
+ {
+ LL_INFOS() << "Attempting to use model index " << idx << " for LOD " << i << " of " << instance.mLabel << LL_ENDL;
+ }
+ break;
+ }
+ }
- if(idx < mBaseModel.size())
- {
- for (U32 i = 0; i < LLModel::NUM_LODS; i++)
- { //fill LOD slots based on reference model index
+ // If the model list for the current LOD includes that index...
+ //
if (mModel[i].size() > idx)
{
- instance.mLOD[i] = mModel[i][idx];
+ // Assign that index from the model list for our LOD as the LOD model for this instance
+ //
+ lod_model = mModel[i][idx];
+ if (importerDebug)
+ {
+ LL_INFOS() << "Indexed match of model index " << idx << " at LOD " << i << " to model named " << lod_model->mLabel << LL_ENDL;
+ }
}
- else
+ else if (importerDebug)
{
- instance.mLOD[i] = NULL;
+ LL_INFOS() << "List of models does not include index " << idx << LL_ENDL;
+ }
+ }
+
+ if (lod_model)
+ {
+ if (importerDebug)
+ {
+ if (i == LLModel::LOD_PHYSICS)
+ {
+ LL_INFOS() << "Assigning collision for " << instance.mLabel << " to match " << lod_model->mLabel << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS() << "Assigning LOD" << i << " for " << instance.mLabel << " to found match " << lod_model->mLabel << LL_ENDL;
+ }
+ }
+ instance.mLOD[i] = lod_model;
+ }
+ else if (importerDebug)
+ {
+ LL_INFOS() << "List of models does not include " << instance.mLabel << LL_ENDL;
+ }
+ }
+
+ LLModel* high_lod_model = instance.mLOD[LLModel::LOD_HIGH];
+ if (!high_lod_model)
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+ else
+ {
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ int refFaceCnt = 0;
+ int modelFaceCnt = 0;
+ llassert(instance.mLOD[i]);
+ if (instance.mLOD[i] && !instance.mLOD[i]->matchMaterialOrder(high_lod_model, refFaceCnt, modelFaceCnt ) )
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
}
}
}
@@ -3430,6 +1575,34 @@ void LLModelPreview::rebuildUploadData()
}
}
+ for (U32 lod = 0; lod < LLModel::NUM_LODS-1; lod++)
+ {
+ // Search for models that are not included into upload data
+ // If we found any, that means something we loaded is not a sub-model.
+ for (U32 model_ind = 0; model_ind < mModel[lod].size(); ++model_ind)
+ {
+ bool found_model = false;
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+ if (instance.mLOD[lod] == mModel[lod][model_ind])
+ {
+ found_model = true;
+ break;
+ }
+ }
+ if (!found_model && mModel[lod][model_ind] && !mModel[lod][model_ind]->mSubmodelID)
+ {
+ if (importerDebug)
+ {
+ LL_INFOS() << "Model " << mModel[lod][model_ind]->mLabel << " was not used - mismatching lod models." << LL_ENDL;
+ }
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+ }
+ }
+
F32 max_import_scale = (DEFAULT_MAX_PRIM_SCALE-0.1f)/max_scale;
F32 max_axis = llmax(mPreviewScale.mV[0], mPreviewScale.mV[1]);
@@ -3496,7 +1669,6 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw
meshes.insert(instance.mModel);
std::stringstream str;
-
LLModel::Decomposition& decomp =
instance.mLOD[LLModel::LOD_PHYSICS].notNull() ?
instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
@@ -3509,8 +1681,8 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw
instance.mLOD[LLModel::LOD_LOW],
instance.mLOD[LLModel::LOD_IMPOSTOR],
decomp,
- save_skinweights, save_joint_positions, FALSE, TRUE);
-
+ save_skinweights, save_joint_positions,
+ FALSE, TRUE, instance.mModel->mSubmodelID);
data["mesh"][instance.mModel->mLocalID] = str.str();
}
@@ -3578,13 +1750,28 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
clearGLODGroup();
}
- mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode );
+ mModelLoader = new LLDAELoader(
+ filename,
+ lod,
+ &LLModelPreview::loadedCallback,
+ &LLModelPreview::lookupJointByName,
+ &LLModelPreview::loadTextures,
+ &LLModelPreview::stateChangedCallback,
+ this,
+ mJointTransformMap,
+ mJointsFromNode,
+ gSavedSettings.getU32("ImporterModelLimit"));
if (force_disable_slm)
{
mModelLoader->mTrySLM = false;
}
-
+ else
+ {
+ //only try to load from slm if viewer is configured to do so and this is the
+ //initial model load (not an LoD or physics shape)
+ mModelLoader->mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mUploadData.empty();
+ }
mModelLoader->start();
mFMP->childSetTextArg("status", "[STATUS]", mFMP->getString("status_reading_file"));
@@ -3615,6 +1802,7 @@ void LLModelPreview::setPhysicsFromLOD(S32 lod)
if (lod >= 0 && lod <= 3)
{
+ mPhysicsSearchLOD = lod;
mModel[LLModel::LOD_PHYSICS] = mModel[lod];
mScene[LLModel::LOD_PHYSICS] = mScene[lod];
mLODFile[LLModel::LOD_PHYSICS].clear();
@@ -3634,11 +1822,14 @@ void LLModelPreview::clearIncompatible(S32 lod)
return;
}
+ // at this point we don't care about sub-models,
+ // different amount of sub-models means face count mismatch, not incompatibility
+ U32 lod_size = countRootModels(mModel[lod]);
for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
{ //clear out any entries that aren't compatible with this model
if (i != lod)
{
- if (mModel[i].size() != mModel[lod].size())
+ if (countRootModels(mModel[i]) != lod_size)
{
mModel[i].clear();
mScene[i].clear();
@@ -3673,7 +1864,7 @@ void LLModelPreview::clearGLODGroup()
}
}
-void LLModelPreview::loadModelCallback(S32 lod)
+void LLModelPreview::loadModelCallback(S32 loaded_lod)
{
assert_main_thread();
@@ -3686,12 +1877,18 @@ void LLModelPreview::loadModelCallback(S32 lod)
if(getLoadState() >= LLModelLoader::ERROR_PARSING)
{
mLoading = false ;
+ mModelLoader = NULL;
return ;
}
+ // Copy determinations about rig so UI will reflect them
+ //
+ setRigValidForJointPositionUpload(mModelLoader->isRigValidForJointPositionUpload());
+ setLegacyRigValid(mModelLoader->isLegacyRigValid());
+
mModelLoader->loadTextures() ;
- if (lod == -1)
+ if (loaded_lod == -1)
{ //populate all LoDs from model loader scene
mBaseModel.clear();
mBaseScene.clear();
@@ -3723,6 +1920,11 @@ void LLModelPreview::loadModelCallback(S32 lod)
//override displayed model with current LoD
list_iter->mModel = list_iter->mLOD[lod];
+ if (!list_iter->mModel)
+ {
+ continue;
+ }
+
//add current model to current LoD's model list (LLModel::mLocalID makes a good vector index)
S32 idx = list_iter->mModel->mLocalID;
@@ -3731,7 +1933,7 @@ void LLModelPreview::loadModelCallback(S32 lod)
mModel[lod].resize(idx+1);
}
- mModel[lod][idx] = list_iter->mModel;
+ mModel[lod][idx] = list_iter->mModel;
if (!list_iter->mModel->mSkinWeights.empty())
{
skin_weights = true;
@@ -3774,31 +1976,108 @@ void LLModelPreview::loadModelCallback(S32 lod)
}
else
{ //only replace given LoD
- mModel[lod] = mModelLoader->mModelList;
- mScene[lod] = mModelLoader->mScene;
- mVertexBuffer[lod].clear();
+ mModel[loaded_lod] = mModelLoader->mModelList;
+ mScene[loaded_lod] = mModelLoader->mScene;
+ mVertexBuffer[loaded_lod].clear();
- setPreviewLOD(lod);
+ setPreviewLOD(loaded_lod);
- if (lod == LLModel::LOD_HIGH)
+ if (loaded_lod == LLModel::LOD_HIGH)
{ //save a copy of the highest LOD for automatic LOD manipulation
if (mBaseModel.empty())
{ //first time we've loaded a model, auto-gen LoD
mGenLOD = true;
}
- mBaseModel = mModel[lod];
+ mBaseModel = mModel[loaded_lod];
clearGLODGroup();
- mBaseScene = mScene[lod];
+ mBaseScene = mScene[loaded_lod];
mVertexBuffer[5].clear();
}
+ else
+ {
+ BOOL importerDebug = gSavedSettings.getBOOL("ImporterDebug");
+ BOOL legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");
+ if (!legacyMatching)
+ {
+ if (!mBaseModel.empty())
+ {
+ BOOL name_based = FALSE;
+ BOOL has_submodels = FALSE;
+ for (U32 idx = 0; idx < mBaseModel.size(); ++idx)
+ {
+ if (mBaseModel[idx]->mSubmodelID)
+ { // don't do index-based renaming when the base model has submodels
+ has_submodels = TRUE;
+ if (importerDebug)
+ {
+ LL_INFOS() << "High LOD has submodels" << LL_ENDL;
+ }
+ break;
+ }
+ }
+
+ for (U32 idx = 0; idx < mModel[loaded_lod].size(); ++idx)
+ {
+ std::string loaded_name = stripSuffix(mModel[loaded_lod][idx]->mLabel);
+
+ LLModel* found_model = NULL;
+ LLMatrix4 transform;
+ FindModel(mBaseScene, loaded_name, found_model, transform);
+ if (found_model)
+ { // don't rename correctly named models (even if they are placed in a wrong order)
+ name_based = TRUE;
+ }
+
+ if (mModel[loaded_lod][idx]->mSubmodelID)
+ { // don't rename the models when loaded LOD model has submodels
+ has_submodels = TRUE;
+ }
+ }
+
+ if (importerDebug)
+ {
+ LL_INFOS() << "Loaded LOD " << loaded_lod << ": correct names" << (name_based ? "" : "NOT ") << "found; submodels " << (has_submodels ? "" : "NOT ") << "found" << LL_ENDL;
+ }
+
+ if (!name_based && !has_submodels)
+ { // replace the name of the model loaded for any non-HIGH LOD to match the others (MAINT-5601)
+ // this actually works like "ImporterLegacyMatching" for this particular LOD
+ for (U32 idx = 0; idx < mModel[loaded_lod].size() && idx < mBaseModel.size(); ++idx)
+ {
+ std::string name = mBaseModel[idx]->mLabel;
+ std::string loaded_name = stripSuffix(mModel[loaded_lod][idx]->mLabel);
+
+ if (loaded_name != name)
+ {
+ switch (loaded_lod)
+ {
+ case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break;
+ case LLModel::LOD_LOW: name += "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: name += "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: name += "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ if (importerDebug)
+ {
+ LL_WARNS() << "Loded model name " << mModel[loaded_lod][idx]->mLabel << " for LOD " << loaded_lod << " doesn't match the base model. Renaming to " << name << LL_ENDL;
+ }
- clearIncompatible(lod);
+ mModel[loaded_lod][idx]->mLabel = name;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ clearIncompatible(loaded_lod);
mDirty = true;
- if (lod == LLModel::LOD_HIGH)
+ if (loaded_lod == LLModel::LOD_HIGH)
{
resetPreviewTarget();
}
@@ -3817,6 +2096,8 @@ void LLModelPreview::loadModelCallback(S32 lod)
refresh();
mModelLoadedSignal();
+
+ mModelLoader = NULL;
}
void LLModelPreview::resetPreviewTarget()
@@ -4165,6 +2446,20 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
mModel[lod][mdl_idx] = new LLModel(volume_params, 0.f);
+ std::string name = base->mLabel;
+
+ switch (lod)
+ {
+ case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break;
+ case LLModel::LOD_LOW: name += "_LOD1"; break;
+ case LLModel::LOD_MEDIUM: name += "_LOD2"; break;
+ case LLModel::LOD_PHYSICS: name += "_PHYS"; break;
+ case LLModel::LOD_HIGH: break;
+ }
+
+ mModel[lod][mdl_idx]->mLabel = name;
+ mModel[lod][mdl_idx]->mSubmodelID = base->mSubmodelID;
+
GLint* sizes = new GLint[patch_count*2];
glodGetObjectParameteriv(mObject[base], GLOD_PATCH_SIZES, sizes);
stop_gloderror();
@@ -4277,17 +2572,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
{
shader->bind();
}
-
- /*if (which_lod == -1 && mScene[LLModel::LOD_PHYSICS].empty())
- { //build physics scene
- mScene[LLModel::LOD_PHYSICS] = mScene[LLModel::LOD_LOW];
- mModel[LLModel::LOD_PHYSICS] = mModel[LLModel::LOD_LOW];
-
- for (U32 i = 1; i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
- {
- mPhysicsQ.push(mModel[LLModel::LOD_PHYSICS][i]);
- }
- }*/
}
void LLModelPreview::updateStatusMessages()
@@ -4304,43 +2588,89 @@ void LLModelPreview::updateStatusMessages()
S32 total_verts[LLModel::NUM_LODS];
S32 total_submeshes[LLModel::NUM_LODS];
- for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ total_tris[i] = 0;
+ total_verts[i] = 0;
+ total_submeshes[i] = 0;
+ }
+
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
{
- //initialize total for this lod to 0
- total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0;
+ LLModelInstance& instance = *iter;
- for (LLModelLoader::scene::iterator iter = mScene[lod].begin(), endIter = mScene[lod].end(); iter != endIter; ++iter)
+ LLModel* model_high_lod = instance.mLOD[LLModel::LOD_HIGH];
+ if (!model_high_lod)
{
- for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)
- {
- LLModel* model = instance->mModel;
- if (model)
- {
- //for each model in the lod
- S32 cur_tris = 0;
- S32 cur_verts = 0;
- S32 cur_submeshes = model->getNumVolumeFaces();
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ continue;
+ }
- for (S32 j = 0; j < cur_submeshes; ++j)
- { //for each submesh (face), add triangles and vertices to current total
- const LLVolumeFace& face = model->getVolumeFace(j);
- cur_tris += face.mNumIndices/3;
- cur_verts += face.mNumVertices;
- }
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ LLModel* lod_model = instance.mLOD[i];
+ if (!lod_model)
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+
+ int refFaceCnt = 0;
+ int modelFaceCnt = 0;
+
+ if (!lod_model->matchMaterialOrder(model_high_lod, refFaceCnt, modelFaceCnt ) )
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
- //add this model to the lod total
- total_tris[lod] += cur_tris;
- total_verts[lod] += cur_verts;
- total_submeshes[lod] += cur_submeshes;
+ if (lod_model)
+ {
+ //for each model in the lod
+ S32 cur_tris = 0;
+ S32 cur_verts = 0;
+ S32 cur_submeshes = lod_model->getNumVolumeFaces();
- //store this model's counts to asset data
- tris[lod].push_back(cur_tris);
- verts[lod].push_back(cur_verts);
- submeshes[lod].push_back(cur_submeshes);
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = lod_model->getVolumeFace(j);
+ cur_tris += face.mNumIndices/3;
+ cur_verts += face.mNumVertices;
}
+
+ std::string instance_name = instance.mLabel;
+
+ BOOL importerDebug = gSavedSettings.getBOOL("ImporterDebug");
+ if (importerDebug)
+ {
+ // Useful for debugging generalized complaints below about total submeshes which don't have enough
+ // context to address exactly what needs to be fixed to move towards compliance with the rules.
+ //
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Verts: " << cur_verts << LL_ENDL;
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Tris: " << cur_tris << LL_ENDL;
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Faces: " << cur_submeshes << LL_ENDL;
+
+ LLModel::material_list::iterator mat_iter = lod_model->mMaterialList.begin();
+ while (mat_iter != lod_model->mMaterialList.end())
+ {
+ LL_INFOS() << "Instance " << lod_model->mLabel << " LOD " << i << " Material " << *(mat_iter) << LL_ENDL;
+ mat_iter++;
+ }
+ }
+
+ //add this model to the lod total
+ total_tris[i] += cur_tris;
+ total_verts[i] += cur_verts;
+ total_submeshes[i] += cur_submeshes;
+
+ //store this model's counts to asset data
+ tris[i].push_back(cur_tris);
+ verts[i].push_back(cur_verts);
+ submeshes[i].push_back(cur_submeshes);
}
}
- }
+ }
if (mMaxTriangleLimit == 0)
{
@@ -4354,37 +2684,48 @@ void LLModelPreview::updateStatusMessages()
const LLVector4a scale(0.5f);
for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i)
{ //for each model in the lod
- if (mModel[lod][i]->mPhysics.mHull.empty())
+ if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
{ //no decomp exists
S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j)
{ //for each submesh (face), add triangles and vertices to current total
- const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
- for (S32 k = 0; k < face.mNumIndices && !has_degenerate; )
+ LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
+ for (S32 k = 0; (k < face.mNumIndices) && !has_degenerate; )
{
- LLVector4a v1; v1.setMul(face.mPositions[face.mIndices[k++]], scale);
- LLVector4a v2; v2.setMul(face.mPositions[face.mIndices[k++]], scale);
- LLVector4a v3; v3.setMul(face.mPositions[face.mIndices[k++]], scale);
+ U16 index_a = face.mIndices[k+0];
+ U16 index_b = face.mIndices[k+1];
+ U16 index_c = face.mIndices[k+2];
+
+ LLVector4a v1; v1.setMul(face.mPositions[index_a], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[index_b], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[index_c], scale);
if (ll_is_degenerate(v1,v2,v3))
{
has_degenerate = true;
}
+ else
+ {
+ k += 3;
+ }
}
}
}
}
}
-
+
mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
std::string mesh_status_na = mFMP->getString("mesh_status_na");
S32 upload_status[LLModel::LOD_HIGH+1];
- bool upload_ok = true;
+ mModelNoErrors = true;
- for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod)
+ const U32 lod_high = LLModel::LOD_HIGH;
+ U32 high_submodel_count = mModel[lod_high].size() - countRootModels(mModel[lod_high]);
+
+ for (S32 lod = 0; lod <= lod_high; ++lod)
{
upload_status[lod] = 0;
@@ -4397,7 +2738,7 @@ void LLModelPreview::updateStatusMessages()
}
else
{
- if (lod == LLModel::LOD_HIGH)
+ if (lod == lod_high)
{
upload_status[lod] = 2;
message = "mesh_status_missing_lod";
@@ -4418,8 +2759,6 @@ void LLModelPreview::updateStatusMessages()
mFMP->childSetValue(lod_vertices_name[lod], mesh_status_na);
}
- const U32 lod_high = LLModel::LOD_HIGH;
-
if (lod != lod_high)
{
if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high])
@@ -4427,6 +2766,13 @@ void LLModelPreview::updateStatusMessages()
message = "mesh_status_submesh_mismatch";
upload_status[lod] = 2;
}
+ else if (mModel[lod].size() - countRootModels(mModel[lod]) != high_submodel_count)
+ {//number of submodels is different, not all faces are matched correctly.
+ message = "mesh_status_submesh_mismatch";
+ upload_status[lod] = 2;
+ // Note: Submodels in instance were loaded from higher LOD and as result face count
+ // returns same value and total_submeshes[lod] is identical to high_lod one.
+ }
else if (!tris[lod].empty() && tris[lod].size() != tris[lod_high].size())
{ //number of meshes is different
message = "mesh_status_mesh_mismatch";
@@ -4447,7 +2793,7 @@ void LLModelPreview::updateStatusMessages()
{
//too many vertices in this lod
message = "mesh_status_too_many_vertices";
- upload_status[lod] = 2;
+ upload_status[lod] = 1;
}
}
}
@@ -4459,7 +2805,7 @@ void LLModelPreview::updateStatusMessages()
if (upload_status[lod] >= 2)
{
- upload_ok = false;
+ mModelNoErrors = false;
}
if (lod == mPreviewLOD)
@@ -4473,23 +2819,41 @@ void LLModelPreview::updateStatusMessages()
}
- //make sure no hulls have more than 256 points in them
- for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ //warn if hulls have more than 256 points in them
+ BOOL physExceededVertexLimit = FALSE;
+ for (U32 i = 0; mModelNoErrors && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
{
LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i];
- for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j)
+ if (mdl)
{
- if (mdl->mPhysics.mHull[j].size() > 256)
+ for (U32 j = 0; j < mdl->mPhysics.mHull.size(); ++j)
{
- upload_ok = false;
+ if (mdl->mPhysics.mHull[j].size() > 256)
+ {
+ physExceededVertexLimit = TRUE;
+ LL_INFOS() << "Physical model " << mdl->mLabel << " exceeds vertex per hull limitations." << LL_ENDL;
+ break;
+ }
}
}
}
+ mFMP->childSetVisible("physics_status_message_text", physExceededVertexLimit);
+ LLIconCtrl* physStatusIcon = mFMP->getChild<LLIconCtrl>("physics_status_message_icon");
+ physStatusIcon->setVisible(physExceededVertexLimit);
+ if (physExceededVertexLimit)
+ {
+ mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_vertex_limit_exceeded"));
+ LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
+ physStatusIcon->setImage(img);
+ }
- bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
+ if (getLoadState() >= LLModelLoader::ERROR_PARSING)
+ {
+ mModelNoErrors = false;
+ LL_INFOS() << "Loader returned errors, model can't be uploaded" << LL_ENDL;
+ }
- bool skinAndRigOk = true;
bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean();
bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
@@ -4497,19 +2861,23 @@ void LLModelPreview::updateStatusMessages()
{
if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
{
- skinAndRigOk = false;
- }
+ mModelNoErrors = false;
+ LL_INFOS() << "Invalid rig, there might be issues with uploading Joint positions" << LL_ENDL;
+ }
}
-
- if(upload_ok && mModelLoader)
+
+ if(mModelNoErrors && mModelLoader)
{
if(!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
{
- upload_ok = false ;
+ // Some textures are still loading, prevent upload until they are done
+ mModelNoErrors = false;
}
}
- if (!upload_ok || errorStateFromLoader || !skinAndRigOk || has_degenerate)
+ // Todo: investigate use of has_degenerate and include into mModelNoErrors upload blocking mechanics
+ // current use of has_degenerate won't block upload permanently - later checks will restore the button
+ if (!mModelNoErrors || has_degenerate)
{
mFMP->childDisable("ok_btn");
}
@@ -4851,7 +3219,8 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLModel* base_mdl = *base_iter;
base_iter++;
- for (S32 i = 0, e = mdl->getNumVolumeFaces(); i < e; ++i)
+ S32 num_faces = mdl->getNumVolumeFaces();
+ for (S32 i = 0; i < num_faces; ++i)
{
const LLVolumeFace &vf = mdl->getVolumeFace(i);
U32 num_vertices = vf.mNumVertices;
@@ -4946,23 +3315,23 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
void LLModelPreview::update()
{
- if (mDirty)
+ if (mGenLOD)
{
- mDirty = false;
- mResourceCost = calcResourceCost();
+ mGenLOD = false;
+ genLODs();
refresh();
updateStatusMessages();
}
- if (mGenLOD)
+ if (mDirty)
{
- mGenLOD = false;
- genLODs();
+ mDirty = false;
+ mResourceCost = calcResourceCost();
refresh();
updateStatusMessages();
}
-
}
+
//-----------------------------------------------------------------------------
// getTranslationForJointOffset()
//-----------------------------------------------------------------------------
@@ -4996,8 +3365,77 @@ void LLModelPreview::createPreviewAvatar( void )
}
else
{
- LL_INFOS()<<"Failed to create preview avatar for upload model window"<<LL_ENDL;
+ LL_INFOS() << "Failed to create preview avatar for upload model window" << LL_ENDL;
+ }
+}
+
+//static
+U32 LLModelPreview::countRootModels(LLModelLoader::model_list models)
+{
+ U32 root_models = 0;
+ model_list::iterator model_iter = models.begin();
+ while (model_iter != models.end())
+ {
+ LLModel* mdl = *model_iter;
+ if (mdl && mdl->mSubmodelID == 0)
+ {
+ root_models++;
+ }
+ model_iter++;
+ }
+ return root_models;
+}
+
+void LLModelPreview::loadedCallback(
+ LLModelLoader::scene& scene,
+ LLModelLoader::model_list& model_list,
+ S32 lod,
+ void* opaque)
+{
+ LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
+ if (pPreview && !LLModelPreview::sIgnoreLoadedCallback)
+ {
+ pPreview->loadModelCallback(lod);
+ }
+}
+
+void LLModelPreview::stateChangedCallback(U32 state,void* opaque)
+{
+ LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
+ if (pPreview)
+ {
+ pPreview->setLoadState(state);
+ }
+}
+
+LLJoint* LLModelPreview::lookupJointByName(const std::string& str, void* opaque)
+{
+ LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
+ if (pPreview)
+ {
+ return pPreview->getPreviewAvatar()->getJoint(str);
+ }
+ return NULL;
+}
+
+U32 LLModelPreview::loadTextures(LLImportMaterial& material,void* opaque)
+{
+ (void)opaque;
+
+ if (material.mDiffuseMapFilename.size())
+ {
+ material.mOpaqueData = new LLPointer< LLViewerFetchedTexture >;
+ LLPointer< LLViewerFetchedTexture >& tex = (*reinterpret_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData));
+
+ tex = LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW);
+ tex->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, opaque, NULL, FALSE);
+ tex->forceToSaveRawImage(0, F32_MAX);
+ material.setDiffuseMap(tex->getID()); // record tex ID
+ return 1;
}
+
+ material.mOpaqueData = NULL;
+ return 0;
}
void LLModelPreview::addEmptyFace( LLModel* pTarget )
@@ -5245,7 +3683,7 @@ BOOL LLModelPreview::render()
}
else
{
- LL_INFOS(" ") << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL;
+ LL_INFOS() << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL;
regen = TRUE;
}
}
@@ -5255,24 +3693,6 @@ BOOL LLModelPreview::render()
genBuffers(mPreviewLOD, skin_weight);
}
- //make sure material lists all match
- for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
- {
- if (mBaseModel.size() == mModel[i].size())
- {
- for (U32 j = 0; j < mBaseModel.size(); ++j)
- {
- int refFaceCnt = 0;
- int modelFaceCnt = 0;
-
- if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
- {
- mFMP->childDisable( "calculate_btn" );
- }
- }
- }
- }
-
if (!skin_weight)
{
for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
@@ -5281,62 +3701,63 @@ BOOL LLModelPreview::render()
LLModel* model = instance.mLOD[mPreviewLOD];
- if (!model)
- {
- continue;
- }
+ if (!model)
+ {
+ continue;
+ }
- gGL.pushMatrix();
- LLMatrix4 mat = instance.mTransform;
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
- gGL.multMatrix((GLfloat*) mat.mMatrix);
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
- for (U32 i = 0, e = mVertexBuffer[mPreviewLOD][model].size(); i < e; ++i)
- {
- LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
-
- buffer->setBuffer(type_mask & buffer->getTypeMask());
- if (textures)
+ U32 num_models = mVertexBuffer[mPreviewLOD][model].size();
+ for (U32 i = 0; i < num_models; ++i)
{
- int materialCnt = instance.mModel->mMaterialList.size();
- if ( i < materialCnt )
+ LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+
+ if (textures)
{
- const std::string& binding = instance.mModel->mMaterialList[i];
- const LLImportMaterial& material = instance.mMaterial[binding];
+ int materialCnt = instance.mModel->mMaterialList.size();
+ if ( i < materialCnt )
+ {
+ const std::string& binding = instance.mModel->mMaterialList[i];
+ const LLImportMaterial& material = instance.mMaterial[binding];
- gGL.diffuseColor4fv(material.mDiffuseColor.mV);
+ gGL.diffuseColor4fv(material.mDiffuseColor.mV);
- if (material.mDiffuseMap.notNull())
- {
- if (material.mDiffuseMap->getDiscardLevel() > -1)
+ // Find the tex for this material, bind it, and add it to our set
+ //
+ LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material);
+ if (tex)
{
- gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
- mTextureSet.insert(material.mDiffuseMap.get());
+ mTextureSet.insert(tex);
}
}
}
- }
- else
- {
- gGL.diffuseColor4f(1,1,1,1);
- }
-
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+ else
+ {
+ gGL.diffuseColor4f(1,1,1,1);
+ }
- if (edges)
- {
- glLineWidth(3.f);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glLineWidth(1.f);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+
+ if (edges)
+ {
+ glLineWidth(3.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
}
+ gGL.popMatrix();
}
- gGL.popMatrix();
- }
if (physics)
{
@@ -5364,97 +3785,99 @@ BOOL LLModelPreview::render()
LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
- if (!model)
- {
- continue;
- }
+ if (!model)
+ {
+ continue;
+ }
- gGL.pushMatrix();
- LLMatrix4 mat = instance.mTransform;
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
gGL.multMatrix((GLfloat*) mat.mMatrix);
- bool render_mesh = true;
+ bool render_mesh = true;
- LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
- if (decomp)
- {
- LLMutexLock(decomp->mMutex);
+ LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+ if (decomp)
+ {
+ LLMutexLock(decomp->mMutex);
- LLModel::Decomposition& physics = model->mPhysics;
+ LLModel::Decomposition& physics = model->mPhysics;
- if (!physics.mHull.empty())
- {
- render_mesh = false;
+ if (!physics.mHull.empty())
+ {
+ render_mesh = false;
- if (physics.mMesh.empty())
- { //build vertex buffer for physics mesh
- gMeshRepo.buildPhysicsMesh(physics);
- }
+ if (physics.mMesh.empty())
+ { //build vertex buffer for physics mesh
+ gMeshRepo.buildPhysicsMesh(physics);
+ }
- if (!physics.mMesh.empty())
- { //render hull instead of mesh
- for (U32 i = 0; i < physics.mMesh.size(); ++i)
- {
- if (explode > 0.f)
+ if (!physics.mMesh.empty())
+ { //render hull instead of mesh
+ for (U32 i = 0; i < physics.mMesh.size(); ++i)
{
- gGL.pushMatrix();
+ if (explode > 0.f)
+ {
+ gGL.pushMatrix();
- LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
- offset *= explode;
+ LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
+ offset *= explode;
- gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
- }
+ gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+ }
- static std::vector<LLColor4U> hull_colors;
+ static std::vector<LLColor4U> hull_colors;
- if (i+1 >= hull_colors.size())
- {
- hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
- }
+ if (i+1 >= hull_colors.size())
+ {
+ hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
+ }
- gGL.diffuseColor4ubv(hull_colors[i].mV);
- LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+ gGL.diffuseColor4ubv(hull_colors[i].mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
- if (explode > 0.f)
- {
- gGL.popMatrix();
+ if (explode > 0.f)
+ {
+ gGL.popMatrix();
+ }
}
}
}
}
- }
-
- if (render_mesh)
- {
- if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
- {
- genBuffers(LLModel::LOD_PHYSICS, false);
- }
- for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+
+ if (render_mesh)
{
- LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
+ if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+ {
+ genBuffers(LLModel::LOD_PHYSICS, false);
+ }
+
+ U32 num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();
+ for (U32 i = 0; i < num_models; ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
- buffer->setBuffer(type_mask & buffer->getTypeMask());
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- gGL.diffuseColor3f(1.f, 1.f, 0.f);
+ gGL.diffuseColor3f(1.f, 1.f, 0.f);
- glLineWidth(2.f);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ glLineWidth(2.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
}
- }
- gGL.popMatrix();
- }
+ gGL.popMatrix();
+ }
glLineWidth(3.f);
glPointSize(8.f);
@@ -5635,20 +4058,20 @@ BOOL LLModelPreview::render()
position[j] = v;
}
- llassert(model->mMaterialList.size() > i);
+ llassert(model->mMaterialList.size() > i);
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
buffer->setBuffer(type_mask & buffer->getTypeMask());
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- if (material.mDiffuseMap.notNull())
+
+ // Find the tex for this material, bind it, and add it to our set
+ //
+ LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material);
+ if (tex)
{
- if (material.mDiffuseMap->getDiscardLevel() > -1)
- {
- gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
- mTextureSet.insert(material.mDiffuseMap.get());
- }
+ mTextureSet.insert(tex);
}
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
@@ -5763,14 +4186,14 @@ void LLFloaterModelPreview::onReset(void* user_data)
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
fmp->childDisable("reset_btn");
LLModelPreview* mp = fmp->mModelPreview;
- std::string filename = mp->mLODFile[3];
+ std::string filename = mp->mLODFile[LLModel::LOD_HIGH];
fmp->resetDisplayOptions();
//reset model preview
fmp->initModelPreview();
mp = fmp->mModelPreview;
- mp->loadModel(filename,3,true);
+ mp->loadModel(filename,LLModel::LOD_HIGH,true);
}
//static
@@ -5864,7 +4287,7 @@ void LLFloaterModelPreview::toggleCalculateButton(bool visible)
}
mUploadBtn->setVisible(!visible);
- mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ mUploadBtn->setEnabled(isModelUploadAllowed());
if (visible)
{
@@ -5930,7 +4353,7 @@ void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
childSetVisible("upload_fee", true);
childSetVisible("price_breakdown", true);
- mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ mUploadBtn->setEnabled(isModelUploadAllowed());
}
void LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(S32 status, const std::string& reason)
@@ -5954,6 +4377,16 @@ void LLFloaterModelPreview::onModelUploadFailure()
mUploadBtn->setEnabled(true);
}
+bool LLFloaterModelPreview::isModelUploadAllowed()
+{
+ bool allow_upload = mHasUploadPerm && !mUploadModelUrl.empty();
+ if (mModelPreview)
+ {
+ allow_upload &= mModelPreview->mModelNoErrors;
+ }
+ return allow_upload;
+}
+
S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
{
if (mContinue)
@@ -6003,8 +4436,8 @@ void LLFloaterModelPreview::onPermissionsReceived(const LLSD& result)
// BAP HACK: handle "" for case that MeshUploadFlag cap is broken.
mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status));
- //mUploadBtn->setEnabled(mHasUploadPerm);
- mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ // isModelUploadAllowed() includes mHasUploadPerm
+ mUploadBtn->setEnabled(isModelUploadAllowed());
getChild<LLTextBox>("warning_title")->setVisible(!mHasUploadPerm);
getChild<LLTextBox>("warning_message")->setVisible(!mHasUploadPerm);
}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 618748bd4e..7a518c798b 100755
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -37,6 +37,8 @@
#include "llviewermenufile.h"
#include "llfloatermodeluploadbase.h"
+#include "lldaeloader.h"
+
class LLComboBox;
class LLJoint;
class LLViewerJointMesh;
@@ -45,103 +47,18 @@ class LLTextBox;
class LLVertexBuffer;
class LLModelPreview;
class LLFloaterModelPreview;
+class DAE;
class daeElement;
class domProfile_COMMON;
class domInstance_geometry;
class domNode;
class domTranslate;
class domController;
+class domSkin;
+class domMesh;
class LLMenuButton;
class LLToggleableMenu;
-typedef std::map<std::string, LLMatrix4> JointTransformMap;
-typedef std::map<std::string, LLMatrix4>:: iterator JointTransformMapIt;
-
-const S32 NUM_LOD = 4;
-
-class LLModelLoader : public LLThread
-{
-public:
- typedef enum
- {
- STARTING = 0,
- READING_FILE,
- CREATING_FACES,
- GENERATING_VERTEX_BUFFERS,
- GENERATING_LOD,
- DONE,
- ERROR_PARSING, //basically loading failed
- ERROR_MATERIALS,
- } eLoadState;
-
- U32 mState;
- std::string mFilename;
- S32 mLod;
- LLModelPreview* mPreview;
- LLMatrix4 mTransform;
- BOOL mFirstTransform;
- LLVector3 mExtents[2];
- bool mTrySLM;
-
- std::map<daeElement*, LLPointer<LLModel> > mModel;
-
- typedef std::vector<LLPointer<LLModel> > model_list;
- model_list mModelList;
-
- typedef std::vector<LLModelInstance> model_instance_list;
-
- typedef std::map<LLMatrix4, model_instance_list > scene;
-
- scene mScene;
-
- typedef std::queue<LLPointer<LLModel> > model_queue;
-
- //queue of models that need a physics rep
- model_queue mPhysicsQ;
-
- LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
- std::deque<std::string>& jointsFromNodes );
- ~LLModelLoader() ;
-
- virtual void run();
- bool doLoadModel();
- bool loadFromSLM(const std::string& filename);
- void loadModelCallback();
-
- void loadTextures() ; //called in the main thread.
- void processElement(daeElement* element, bool& badElement);
- std::map<std::string, LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
- LLImportMaterial profileToMaterial(domProfile_COMMON* material);
- std::string getElementLabel(daeElement *element);
- LLColor4 getDaeColor(daeElement* element);
-
- daeElement* getChildFromElement( daeElement* pElement, std::string const & name );
-
- bool isNodeAJoint( domNode* pNode );
- void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );
- void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
- void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
- void extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform );
-
- void setLoadState(U32 state);
-
- void buildJointToNodeMappingFromScene( daeElement* pRoot );
- void processJointToNodeMapping( domNode* pNode );
- void processChildJoints( domNode* pParentNode );
-
- //map of avatar joints as named in COLLADA assets to internal joint names
- std::map<std::string, std::string> mJointMap;
- JointTransformMap& mJointList;
- std::deque<std::string>& mJointsFromNode;
-
- S32 mNumOfFetchingTextures ; //updated in the main thread
- bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread.
-
-private:
- static std::list<LLModelLoader*> sActiveLoaderList;
- static bool isAlive(LLModelLoader* loader) ;
-};
-
class LLFloaterModelPreview : public LLFloaterModelUploadBase
{
public:
@@ -172,6 +89,7 @@ public:
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
static void onMouseCaptureLostModelPreview(LLMouseHandler*);
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
@@ -210,6 +128,8 @@ public:
/*virtual*/ void onModelUploadFailure();
+ bool isModelUploadAllowed();
+
protected:
friend class LLModelPreview;
friend class LLMeshFilePicker;
@@ -359,21 +279,14 @@ public:
void setHasPivot( bool val ) { mHasPivot = val; }
void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }
- //Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps)
- void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
- void critiqueJointToNodeMappingFromScene( void );
//Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions
//Accessors for joint position upload friendly rigs
const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
- bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
- //Determines if a rig is a legacy from the joint list
- bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
+
//Accessors for the legacy rigs
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
- void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
- //Verify that a controller matches vertex counts
- bool verifyController( domController* pController );
+ void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
@@ -388,6 +301,16 @@ public:
LLVector3 getTranslationForJointOffset( std::string joint );
+ static bool sIgnoreLoadedCallback;
+
+protected:
+
+ static void loadedCallback(LLModelLoader::scene& scene,LLModelLoader::model_list& model_list, S32 lod, void* opaque);
+ static void stateChangedCallback(U32 state, void* opaque);
+
+ static LLJoint* lookupJointByName(const std::string&, void* opaque);
+ static U32 loadTextures(LLImportMaterial& material, void* opaque);
+
private:
//Utility function for controller vertex compare
bool verifyCount( int expected, int result );
@@ -395,6 +318,8 @@ private:
void createPreviewAvatar( void );
//Accessor for the dummy avatar
LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
+ // Count amount of original models, excluding sub-models
+ static U32 countRootModels(LLModelLoader::model_list models);
protected:
friend class LLModelLoader;
@@ -416,13 +341,15 @@ private:
LLVector3 mPreviewTarget;
LLVector3 mPreviewScale;
S32 mPreviewLOD;
+ S32 mPhysicsSearchLOD;
U32 mResourceCost;
std::string mLODFile[LLModel::NUM_LODS];
bool mLoading;
U32 mLoadState;
bool mResetJoints;
bool mRigParityWithScene;
-
+ bool mModelNoErrors;
+
std::map<std::string, bool> mViewOption;
//GLOD object parameters (must rebuild object if these change)
@@ -459,7 +386,7 @@ private:
U32 mMaxTriangleLimit;
LLMeshUploadThread::instance_list mUploadData;
- std::set<LLViewerFetchedTexture* > mTextureSet;
+ std::set<LLViewerFetchedTexture * > mTextureSet;
//map of vertex buffers to models (one vertex buffer in vector per face in model
std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1];
@@ -478,10 +405,9 @@ private:
bool mLastJointUpdate;
- std::deque<std::string> mMasterJointList;
- std::deque<std::string> mMasterLegacyJointList;
- std::deque<std::string> mJointsFromNode;
- JointTransformMap mJointTransformMap;
+ JointSet mJointsFromNode;
+ JointTransformMap mJointTransformMap;
+
LLPointer<LLVOAvatar> mPreviewAvatar;
};
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 9a0bd9d1bc..55b94aa141 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -493,6 +493,12 @@ void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res,
}
}
+LLViewerFetchedTexture* LLMeshUploadThread::FindViewerTexture(const LLImportMaterial& material)
+{
+ LLPointer< LLViewerFetchedTexture > * ppTex = static_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData);
+ return ppTex ? (*ppTex).get() : NULL;
+}
+
volatile S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
volatile S32 LLMeshRepoThread::sActiveLODRequests = 0;
U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
@@ -587,16 +593,16 @@ public:
LLMeshLODHandler(const LLVolumeParams & mesh_params, S32 lod, U32 offset, U32 requested_bytes)
: LLMeshHandlerBase(offset, requested_bytes),
mLOD(lod)
- {
+ {
mMeshParams = mesh_params;
LLMeshRepoThread::incActiveLODRequests();
}
virtual ~LLMeshLODHandler();
-
+
protected:
LLMeshLODHandler(const LLMeshLODHandler &); // Not defined
void operator=(const LLMeshLODHandler &); // Not defined
-
+
public:
virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size);
virtual void processFailure(LLCore::HttpStatus status);
@@ -796,7 +802,7 @@ LLMeshRepoThread::LLMeshRepoThread()
mHttpLargePolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_LARGE_MESH);
}
-
+
LLMeshRepoThread::~LLMeshRepoThread()
{
LL_INFOS(LOG_MESH) << "Small GETs issued: " << LLMeshRepository::sHTTPRequestCount
@@ -865,16 +871,16 @@ void LLMeshRepoThread::run()
{
break;
}
-
+
if (! mHttpRequestSet.empty())
{
// Dispatch all HttpHandler notifications
mHttpRequest->update(0L);
}
sRequestWaterLevel = mHttpRequestSet.size(); // Stats data update
-
- // NOTE: order of queue processing intentionally favors LOD requests over header requests
+ // NOTE: order of queue processing intentionally favors LOD requests over header requests
+
while (!mLODReqQ.empty() && mHttpRequestSet.size() < sRequestHighWater)
{
if (! mMutex)
@@ -938,7 +944,7 @@ void LLMeshRepoThread::run()
mSkinRequests.erase(iter);
mMutex->unlock();
- if (!fetchMeshSkinInfo(mesh_id))
+ if (! fetchMeshSkinInfo(mesh_id))
{
incomplete.insert(mesh_id);
}
@@ -967,7 +973,7 @@ void LLMeshRepoThread::run()
mDecompositionRequests.erase(iter);
mMutex->unlock();
- if (!fetchMeshDecomposition(mesh_id))
+ if (! fetchMeshDecomposition(mesh_id))
{
incomplete.insert(mesh_id);
}
@@ -993,7 +999,7 @@ void LLMeshRepoThread::run()
mPhysicsShapeRequests.erase(iter);
mMutex->unlock();
- if (!fetchMeshPhysicsShape(mesh_id))
+ if (! fetchMeshPhysicsShape(mesh_id))
{
incomplete.insert(mesh_id);
}
@@ -1219,7 +1225,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
}
++LLMeshRepository::sMeshRequestCount;
- bool ret = true ;
+ bool ret = true;
U32 header_size = mMeshHeaderSize[mesh_id];
if (header_size > 0)
@@ -1267,7 +1273,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
constructUrl(mesh_id, &http_url, &cap_version);
if (!http_url.empty())
- {
+ {
LLMeshSkinInfoHandler * handler = new LLMeshSkinInfoHandler(mesh_id, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1313,7 +1319,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
++LLMeshRepository::sMeshRequestCount;
U32 header_size = mMeshHeaderSize[mesh_id];
- bool ret = true ;
+ bool ret = true;
if (header_size > 0)
{
@@ -1359,9 +1365,9 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
int cap_version(2);
std::string http_url;
constructUrl(mesh_id, &http_url, &cap_version);
-
+
if (!http_url.empty())
- {
+ {
LLMeshDecompositionHandler * handler = new LLMeshDecompositionHandler(mesh_id, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1407,7 +1413,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
++LLMeshRepository::sMeshRequestCount;
U32 header_size = mMeshHeaderSize[mesh_id];
- bool ret = true ;
+ bool ret = true;
if (header_size > 0)
{
@@ -1452,9 +1458,9 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
int cap_version(2);
std::string http_url;
constructUrl(mesh_id, &http_url, &cap_version);
-
+
if (!http_url.empty())
- {
+ {
LLMeshPhysicsShapeHandler * handler = new LLMeshPhysicsShapeHandler(mesh_id, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1543,11 +1549,11 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
}
//either cache entry doesn't exist or is corrupt, request header from simulator
- bool retval = true ;
+ bool retval = true;
int cap_version(2);
std::string http_url;
constructUrl(mesh_params.getSculptID(), &http_url, &cap_version);
-
+
if (!http_url.empty())
{
//grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
@@ -1635,9 +1641,9 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
int cap_version(2);
std::string http_url;
constructUrl(mesh_id, &http_url, &cap_version);
-
+
if (!http_url.empty())
- {
+ {
LLMeshLODHandler * handler = new LLMeshLODHandler(mesh_params, lod, offset, size);
LLCore::HttpHandle handle = getByteRange(http_url, cap_version, offset, size, handler);
if (LLCORE_HTTP_HANDLE_INVALID == handle)
@@ -1909,7 +1915,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mOrigin += gAgent.getAtAxis() * scale.magVec();
- mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut") ;
+ mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut");
mHttpRequest = new LLCore::HttpRequest;
mHttpOptions = new LLCore::HttpOptions;
@@ -1977,14 +1983,14 @@ void LLMeshUploadThread::preStart()
void LLMeshUploadThread::discard()
{
- LLMutexLock lock(mMutex) ;
+ LLMutexLock lock(mMutex);
mDiscarded = true;
}
bool LLMeshUploadThread::isDiscarded() const
{
- LLMutexLock lock(mMutex) ;
- return mDiscarded ;
+ LLMutexLock lock(mMutex);
+ return mDiscarded;
}
void LLMeshUploadThread::run()
@@ -2049,6 +2055,14 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
{
LLMeshUploadData data;
data.mBaseModel = iter->first;
+
+ if (data.mBaseModel->mSubmodelID)
+ {
+ // These are handled below to insure correct parenting order on creation
+ // due to map walking being based on model address (aka random)
+ continue;
+ }
+
LLModelInstance& first_instance = *(iter->second.begin());
for (S32 i = 0; i < 5; i++)
{
@@ -2086,7 +2100,10 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
data.mModel[LLModel::LOD_IMPOSTOR],
decomp,
mUploadSkin,
- mUploadJoints);
+ mUploadJoints,
+ FALSE,
+ FALSE,
+ data.mBaseModel->mSubmodelID);
data.mAssetData = ostr.str();
std::string str = ostr.str();
@@ -2120,17 +2137,26 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
instance_entry["scale"] = ll_sd_from_vector3(scale);
instance_entry["material"] = LL_MCODE_WOOD;
- instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
instance_entry["mesh"] = mesh_index[data.mBaseModel];
instance_entry["face_list"] = LLSD::emptyArray();
- S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), data.mBaseModel->getNumVolumeFaces()) ;
+ // We want to be able to allow more than 8 materials...
+ //
+ S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ;
+
for (S32 face_num = 0; face_num < end; face_num++)
{
LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
LLSD face_entry = LLSD::emptyMap();
- LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
+
+ LLViewerFetchedTexture *texture = NULL;
+
+ if (material.mDiffuseMapFilename.size())
+ {
+ texture = FindViewerTexture(material);
+ }
if ((texture != NULL) &&
(textures.find(texture) == textures.end()))
@@ -2145,9 +2171,171 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
{
LLPointer<LLImageJ2C> upload_file =
LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+
+ if (!upload_file.isNull() && upload_file->getDataSize())
+ {
+ texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
+ }
+ }
+ }
+
+ if (texture != NULL &&
+ mUploadTextures &&
+ texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = texture_str.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
+ texture_num++;
+ }
+
+ // Subset of TextureEntry fields.
+ if (texture != NULL && mUploadTextures)
+ {
+ face_entry["image"] = texture_index[texture];
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ }
+ face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
+ }
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
+ }
+ }
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ if (!data.mBaseModel->mSubmodelID)
+ {
+ // These were handled above already...
+ //
+ continue;
+ }
+
+ LLModelInstance& first_instance = *(iter->second.begin());
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = first_instance.mLOD[i];
+ }
+
+ if (mesh_index.find(data.mBaseModel) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ if (model_name.empty())
+ {
+ model_name = data.mBaseModel->getName();
+ }
+
+ if (model_metric.empty())
+ {
+ model_metric = data.mBaseModel->getMetric();
+ }
+
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints,
+ FALSE,
+ FALSE,
+ data.mBaseModel->mSubmodelID);
+
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
+
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
+ mesh_index[data.mBaseModel] = mesh_num;
+ mesh_num++;
+ }
+
+ // For all instances that use this model
+ for (instance_list::iterator instance_iter = iter->second.begin();
+ instance_iter != iter->second.end();
+ ++instance_iter)
+ {
+
+ LLModelInstance& instance = *instance_iter;
+
+ LLSD instance_entry;
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
+
+ instance_entry["material"] = LL_MCODE_WOOD;
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE);
+ instance_entry["mesh"] = mesh_index[data.mBaseModel];
+
+ instance_entry["face_list"] = LLSD::emptyArray();
+
+ // We want to be able to allow more than 8 materials...
+ //
+ S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ;
+
+ for (S32 face_num = 0; face_num < end; face_num++)
+ {
+ LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
+ LLSD face_entry = LLSD::emptyMap();
+
+ LLViewerFetchedTexture *texture = NULL;
+
+ if (material.mDiffuseMapFilename.size())
+ {
+ texture = FindViewerTexture(material);
+ }
+
+ if ((texture != NULL) &&
+ (textures.find(texture) == textures.end()))
+ {
+ textures.insert(texture);
+ }
+
+ std::stringstream texture_str;
+ if (texture != NULL && include_textures && mUploadTextures)
+ {
+ if(texture->hasSavedRawImage())
+ {
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+
+ if (!upload_file.isNull() && upload_file->getDataSize())
+ {
texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
}
}
+ }
if (texture != NULL &&
mUploadTextures &&
@@ -2235,7 +2423,7 @@ void LLMeshUploadThread::generateHulls()
}
}
- if(has_valid_requests)
+ if (has_valid_requests)
{
// *NOTE: Interesting livelock condition on shutdown. If there
// is an upload request in generateHulls() when shutdown starts,
@@ -2340,7 +2528,7 @@ void LLMeshUploadThread::requestWholeModelFee()
else
{
U32 sleep_time(10);
-
+
mHttpRequest->update(0);
while (! LLApp::isQuitting() && ! finished() && ! isDiscarded())
{
@@ -2435,7 +2623,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
// model fee case
LLWholeModelFeeObserver* observer(mFeeObserverHandle.get());
mWholeModelUploadURL.clear();
-
+
if (! status)
{
LL_WARNS(LOG_MESH) << "Fee request failed. Reason: " << reason
@@ -2465,7 +2653,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp
LLCoreHttpUtil::responseToLLSD(response, true, body);
}
dump_llsd_to_file(body, make_dump_name("whole_model_fee_response_", dump_num));
-
+
if (body["state"].asString() == "upload")
{
mWholeModelUploadURL = body["uploader"].asString();
@@ -2536,7 +2724,7 @@ void LLMeshRepoThread::notifyLoadedMeshes()
LODRequest req = mUnavailableQ.front();
mUnavailableQ.pop();
mMutex->unlock();
-
+
update_metrics = true;
gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
}
@@ -2672,7 +2860,7 @@ void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response)
{
mProcessed = true;
-
+
unsigned int retries(0U);
response->getRetries(NULL, &retries);
LLMeshRepository::sHTTPRetryCount += retries;
@@ -2728,7 +2916,7 @@ void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespo
// 200 case, typically
offset = 0;
}
-
+
// *DEBUG: To test validation below
// offset += 1;
@@ -2844,7 +3032,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
const std::string & lod_name = header_lod[i];
lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
}
-
+
// just in case skin info or decomposition is at the end of the file (which it shouldn't be)
lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger());
@@ -2852,7 +3040,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
S32 bytes = lod_bytes + header_bytes;
-
+
// It's possible for the remote asset to have more data than is needed for the local cache
// only allocate as much space in the VFS as is needed for the local cache
data_size = llmin(data_size, bytes);
@@ -2864,11 +3052,11 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
++LLMeshRepository::sCacheWrites;
file.write(data, data_size);
-
+
// zero out the rest of the file
U8 block[MESH_HEADER_SIZE];
memset(block, 0, sizeof(block));
-
+
while (bytes-file.tell() > sizeof(block))
{
file.write(block, sizeof(block));
@@ -2894,8 +3082,8 @@ LLMeshLODHandler::~LLMeshLODHandler()
gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD);
}
LLMeshRepoThread::decActiveLODRequests();
- }
}
+}
void LLMeshLODHandler::processFailure(LLCore::HttpStatus status)
{
@@ -2913,7 +3101,7 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body
{
if ((! MESH_LOD_PROCESS_FAILED) && gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
{
- //good fetch from sim, write to VFS for caching
+ // good fetch from sim, write to VFS for caching
LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
S32 offset = mOffset;
@@ -2958,7 +3146,7 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*
{
if ((! MESH_SKIN_INFO_PROCESS_FAILED) && gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
{
- //good fetch from sim, write to VFS for caching
+ // good fetch from sim, write to VFS for caching
LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
S32 offset = mOffset;
@@ -3282,7 +3470,7 @@ void LLMeshRepository::notifyLoadedMeshes()
REQUEST2_LOW_WATER_MIN,
REQUEST2_LOW_WATER_MAX);
}
-
+
//clean up completed upload threads
for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
{
@@ -3359,7 +3547,7 @@ void LLMeshRepository::notifyLoadedMeshes()
//call completed callbacks on finished decompositions
mDecompThread->notifyCompleted();
-
+
// For major operations, attempt to get the required locks
// without blocking and punt if they're not available. The
// longest run of holdoffs is kept in sMaxLockHoldoffs just
@@ -3378,12 +3566,12 @@ void LLMeshRepository::notifyLoadedMeshes()
return;
}
hold_offs = 0;
-
+
if (gAgent.getRegion())
{
// Update capability urls
static std::string region_name("never name a region this");
-
+
if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
{
region_name = gAgent.getRegion()->getName();
@@ -3399,7 +3587,7 @@ void LLMeshRepository::notifyLoadedMeshes()
<< LL_ENDL;
}
}
-
+
//popup queued error messages from background threads
while (!mUploadErrorQ.empty())
{
@@ -3754,7 +3942,7 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
{
LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints, upload_url,
@@ -3825,37 +4013,6 @@ void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
result_rot = quat_rotation;
}
-bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
-{
- if (mDiffuseMap != rhs.mDiffuseMap)
- {
- return mDiffuseMap < rhs.mDiffuseMap;
- }
-
- if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
- {
- return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
- }
-
- if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
- {
- return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
- }
-
- if (mDiffuseColor != rhs.mDiffuseColor)
- {
- return mDiffuseColor < rhs.mDiffuseColor;
- }
-
- if (mBinding != rhs.mBinding)
- {
- return mBinding < rhs.mBinding;
- }
-
- return mFullbright < rhs.mFullbright;
-}
-
-
void LLMeshRepository::updateInventory(inventory_data data)
{
LLMutexLock lock(mMeshMutex);
@@ -4253,7 +4410,7 @@ void LLPhysicsDecomp::doDecompositionSingleHull()
setMeshData(mesh, true);
LLCDResult ret = decomp->buildSingleHull() ;
- if(ret)
+ if (ret)
{
LL_WARNS(LOG_MESH) << "Could not execute decomposition stage when attempting to create single hull." << LL_ENDL;
make_box(mCurRequest);
@@ -4441,60 +4598,6 @@ void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
mStatusMessage = msg;
}
-LLModelInstance::LLModelInstance(LLSD& data)
-{
- mLocalMeshID = data["mesh_id"].asInteger();
- mLabel = data["label"].asString();
- mTransform.setValue(data["transform"]);
-
- for (U32 i = 0; i < data["material"].size(); ++i)
- {
- LLImportMaterial mat(data["material"][i]);
- mMaterial[mat.mBinding] = mat;
- }
-}
-
-
-LLSD LLModelInstance::asLLSD()
-{
- LLSD ret;
-
- ret["mesh_id"] = mModel->mLocalID;
- ret["label"] = mLabel;
- ret["transform"] = mTransform.getValue();
-
- U32 i = 0;
- for (std::map<std::string, LLImportMaterial>::iterator iter = mMaterial.begin(); iter != mMaterial.end(); ++iter)
- {
- ret["material"][i++] = iter->second.asLLSD();
- }
-
- return ret;
-}
-
-LLImportMaterial::LLImportMaterial(LLSD& data)
-{
- mDiffuseMapFilename = data["diffuse"]["filename"].asString();
- mDiffuseMapLabel = data["diffuse"]["label"].asString();
- mDiffuseColor.setValue(data["diffuse"]["color"]);
- mFullbright = data["fullbright"].asBoolean();
- mBinding = data["binding"].asString();
-}
-
-
-LLSD LLImportMaterial::asLLSD()
-{
- LLSD ret;
-
- ret["diffuse"]["filename"] = mDiffuseMapFilename;
- ret["diffuse"]["label"] = mDiffuseMapLabel;
- ret["diffuse"]["color"] = mDiffuseColor.getValue();
- ret["fullbright"] = mFullbright;
- ret["binding"] = mBinding;
-
- return ret;
-}
-
void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
{
decomp.mMesh.resize(decomp.mHull.size());
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 39280bea3a..688cd01a87 100755
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -90,54 +90,6 @@ public:
}
};
-class LLImportMaterial
-{
-public:
- LLPointer<LLViewerFetchedTexture> mDiffuseMap;
- std::string mDiffuseMapFilename;
- std::string mDiffuseMapLabel;
- std::string mBinding;
- LLColor4 mDiffuseColor;
- bool mFullbright;
-
- bool operator<(const LLImportMaterial &params) const;
-
- LLImportMaterial()
- : mFullbright(false)
- {
- mDiffuseColor.set(1,1,1,1);
- }
-
- LLImportMaterial(LLSD& data);
-
- LLSD asLLSD();
-};
-
-class LLModelInstance
-{
-public:
- LLPointer<LLModel> mModel;
- LLPointer<LLModel> mLOD[5];
-
- std::string mLabel;
-
- LLUUID mMeshID;
- S32 mLocalMeshID;
-
- LLMatrix4 mTransform;
- std::map<std::string, LLImportMaterial> mMaterial;
-
- LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::map<std::string, LLImportMaterial>& materials)
- : mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)
- {
- mLocalMeshID = -1;
- }
-
- LLModelInstance(LLSD& data);
-
- LLSD asLLSD();
-};
-
class LLPhysicsDecomp : public LLThread
{
public:
@@ -483,6 +435,8 @@ public:
// Inherited from LLCore::HttpHandler
virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
+ LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material);
+
private:
LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;
LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index fab4203ec3..e62b0607d1 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -656,6 +656,7 @@ private:
* is required to distribute data and perform global actions.
* In pseudo-UML, it looks like:
*
+ * @verbatim
* Main Thread1
* . .
* . .
@@ -698,7 +699,6 @@ private:
* . .
* . .
*
- *
* Key:
*
* SRE - Set Region Enqueued. Enqueue a 'Set Region' command in
@@ -723,6 +723,7 @@ private:
* global pointers used to find the 'current stats'.
* RSC - Read Stats Collector. Extract collector data cloning it
* (i.e. deep copy) when necessary.
+ * @endverbatim
*
*/
class LLTextureFetch::TFRequest // : public LLQueuedThread::QueuedRequest
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 0432f6f27c..267061b83d 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4172,6 +4172,10 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons
for (U32 j = 0; j < maxJoints; ++j)
{
LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (!joint)
+ {
+ joint = avatar->getJoint("mPelvis");
+ }
if (joint)
{
mat[j] = skin->mInvBindMatrix[j];
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
index 734018cfc2..5367262bb6 100755
--- a/indra/newview/llwindowlistener.cpp
+++ b/indra/newview/llwindowlistener.cpp
@@ -55,7 +55,7 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter&
"Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
std::string keyExplain =
"(integer keycode values, or keysym string from any addKeyName() call in\n"
- "http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )\n";
+ "http://bitbucket.org/lindenlab/viewer-release/src/tip/indra/llwindow/llkeyboard.cpp )\n";
std::string mask =
"Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n"
"\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
@@ -70,7 +70,7 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter&
"(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n";
std::string paramsExplain =
"[\"path\"] is as for LLUI::resolvePath(), described in\n"
- "http://hg.secondlife.com/viewer-development/src/tip/indra/llui/llui.h\n"
+ "http://bitbucket.org/lindenlab/viewer-release/src/tip/indra/llui/llui.h\n"
"If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n"
"If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n"
"in the center of the LLView selected by [\"path\"].\n"
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index a4acd1df78..7183b2f1f9 100755
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -31,6 +31,7 @@
<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
<string name="mesh_status_missing_lod">Missing required level of detail.</string>
<string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
+ <string name="phys_status_vertex_limit_exceeded">Some physical hulls exceed vertex limitations.</string>
<string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
<string name="decomposing">Analyzing...</string>
<string name="simplifying">Simplifying...</string>
@@ -66,7 +67,7 @@
follows="top|left"
layout="topleft"
height="19"
- max_length_bytes="64"
+ max_length_bytes="63"
name="description_form"
prevalidate_callback="ascii"
top_pad="5"
@@ -1027,19 +1028,19 @@
bg_alpha_color="0 0 0 0"
bg_opaque_color="0 0 0 0.3"
follows="left|top"
- height="16"
+ height="19"
layout="topleft"
left="18"
name="physics info"
- top_pad="15"
- width="589">
+ top_pad="12"
+ width="319">
<text
follows="top|left"
height="15"
layout="topleft"
left="0"
text_color="White"
- top_pad="0"
+ top_pad="3"
name="results_text"
width="50">
Results:
@@ -1077,6 +1078,33 @@
Hulls: [HULLS]
</text>
</panel>
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left_pad="5"
+ top_delta="0"
+ name="physics message"
+ width="270">
+ <icon
+ follows="left|top"
+ height="16"
+ left="0"
+ layout="topleft"
+ name="physics_status_message_icon"
+ top_pad="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left_pad="2"
+ name="physics_status_message_text"
+ width="252"
+ top_delta="3"/>
+ </panel>
</panel>
<!-- MODIFIERS PANEL -->
<panel