Index: /trunk/include/iprt/asm.h
===================================================================
--- /trunk/include/iprt/asm.h	(revision 58765)
+++ /trunk/include/iprt/asm.h	(revision 58766)
@@ -4797,5 +4797,5 @@
  * @returns 0 if all bits are cleared.
  * @param   u32     Integer to search for set bits.
- * @remark  Similar to ffs() in BSD.
+ * @remarks Similar to ffs() in BSD.
  */
 #if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
@@ -4856,4 +4856,24 @@
 
 /**
+ * Finds the first bit which is set in the given 16-bit integer.
+ *
+ * Bits are numbered from 1 (least significant) to 16.
+ *
+ * @returns index [1..16] of the first set bit.
+ * @returns 0 if all bits are cleared.
+ * @param   u16     Integer to search for set bits.
+ * @remarks For 16-bit bs3kit code.
+ */
+#if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
+DECLASM(unsigned) ASMBitFirstSetU16(uint32_t u16);
+#else
+DECLINLINE(unsigned) ASMBitFirstSetU16(uint32_t u16)
+{
+    return ASMBitFirstSetU32((uint32_t)u16);
+}
+#endif
+
+
+/**
  * Finds the last bit which is set in the given 32-bit integer.
  * Bits are numbered from 1 (least significant) to 32.
@@ -4918,4 +4938,25 @@
     return ASMBitLastSetU32((uint32_t)i32);
 }
+
+
+/**
+ * Finds the last bit which is set in the given 16-bit integer.
+ *
+ * Bits are numbered from 1 (least significant) to 16.
+ *
+ * @returns index [1..16] of the last set bit.
+ * @returns 0 if all bits are cleared.
+ * @param   u16     Integer to search for set bits.
+ * @remarks For 16-bit bs3kit code.
+ */
+#if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
+DECLASM(unsigned) ASMBitLastSetU16(uint32_t u16);
+#else
+DECLINLINE(unsigned) ASMBitLastSetU16(uint32_t u16)
+{
+    return ASMBitLastSetU32((uint32_t)u16);
+}
+#endif
+
 
 /**
Index: /trunk/include/iprt/file.h
===================================================================
--- /trunk/include/iprt/file.h	(revision 58765)
+++ /trunk/include/iprt/file.h	(revision 58766)
@@ -98,4 +98,8 @@
 /** @name Open flags
  * @{ */
+/** Attribute access only.
+ * @remarks Only accepted on windows, requires RTFILE_O_ACCESS_ATTR_MASK
+ *          to yield a non-zero result.  Otherwise, this is invalid. */
+#define RTFILE_O_ATTR_ONLY              UINT32_C(0x00000000)
 /** Open the file with read access. */
 #define RTFILE_O_READ                   UINT32_C(0x00000001)
@@ -105,5 +109,5 @@
 #define RTFILE_O_READWRITE              UINT32_C(0x00000003)
 /** The file access mask.
- * @remarks The value 0 is invalid. */
+ * @remarks The value 0 is invalid, except for windows special case. */
 #define RTFILE_O_ACCESS_MASK            UINT32_C(0x00000003)
 
Index: /trunk/src/VBox/Runtime/r3/win/fileio-win.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/fileio-win.cpp	(revision 58765)
+++ /trunk/src/VBox/Runtime/r3/win/fileio-win.cpp	(revision 58766)
@@ -213,4 +213,11 @@
                             : FILE_GENERIC_READ | FILE_GENERIC_WRITE;
             break;
+        case RTFILE_O_ATTR_ONLY:
+            if (fOpen & RTFILE_O_ACCESS_ATTR_MASK)
+            {
+                dwDesiredAccess = 0;
+                break;
+            }
+            /* fall thru */
         default:
             AssertMsgFailed(("Impossible fOpen=%#llx\n", fOpen));
