diff --git a/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000000..08de0be8d3
--- /dev/null
+++ b/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded
+
+
+
diff --git a/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/xcschemes/PrjFS.xcscheme b/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/xcschemes/PrjFS.xcscheme
index f2ea9f350e..558130ad60 100644
--- a/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/xcschemes/PrjFS.xcscheme
+++ b/ProjFS.Mac/PrjFS.xcworkspace/xcshareddata/xcschemes/PrjFS.xcscheme
@@ -34,6 +34,20 @@
ReferencedContainer = "container:PrjFSLib/PrjFSLib.xcodeproj">
+
+
+
+
machAbsoluteTimestamp = time;
s_currentUserClient->sendLogMessage(messagePtr, messageSize);
}
- else
- {
- kprintf("%s\n", messagePtr->logString);
- }
}
RWLock_ReleaseShared(s_kextLogRWLock);
diff --git a/ProjFS.Mac/PrjFSKext/PrjFSKext/KextLog.hpp b/ProjFS.Mac/PrjFSKext/PrjFSKext/KextLog.hpp
index 82bead23e8..cf40321b84 100644
--- a/ProjFS.Mac/PrjFSKext/PrjFSKext/KextLog.hpp
+++ b/ProjFS.Mac/PrjFSKext/PrjFSKext/KextLog.hpp
@@ -42,5 +42,47 @@ template
#define KextLog_FileInfo(vnode, format, ...) ({ _os_log_verify_format_str(format, ##__VA_ARGS__); KextLogFile_Printf(KEXTLOG_INFO, vnode, format " (vnode path: '%s')", ##__VA_ARGS__); })
#define KextLog_FileNote(vnode, format, ...) ({ _os_log_verify_format_str(format, ##__VA_ARGS__); KextLogFile_Printf(KEXTLOG_NOTE, vnode, format " (vnode path: '%s')", ##__VA_ARGS__); })
+#define KextLog_VnodeOp(vnode, vnodeType, procname, action, message) \
+ do { \
+ if (VDIR == vnodeType) \
+ { \
+ KextLog_FileNote( \
+ vnode, \
+ message ". Proc name: %s. Directory vnode action: %s%s%s%s%s%s%s%s%s%s%s%s%s \n ", \
+ procname, \
+ (action & KAUTH_VNODE_LIST_DIRECTORY) ? " \n KAUTH_VNODE_LIST_DIRECTORY" : "", \
+ (action & KAUTH_VNODE_ADD_FILE) ? " \n KAUTH_VNODE_ADD_FILE" : "", \
+ (action & KAUTH_VNODE_SEARCH) ? " \n KAUTH_VNODE_SEARCH" : "", \
+ (action & KAUTH_VNODE_DELETE) ? " \n KAUTH_VNODE_DELETE" : "", \
+ (action & KAUTH_VNODE_ADD_SUBDIRECTORY) ? " \n KAUTH_VNODE_ADD_SUBDIRECTORY" : "", \
+ (action & KAUTH_VNODE_DELETE_CHILD) ? " \n KAUTH_VNODE_DELETE_CHILD" : "", \
+ (action & KAUTH_VNODE_READ_ATTRIBUTES) ? " \n KAUTH_VNODE_READ_ATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_WRITE_ATTRIBUTES) ? " \n KAUTH_VNODE_WRITE_ATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_READ_EXTATTRIBUTES) ? " \n KAUTH_VNODE_READ_EXTATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_WRITE_EXTATTRIBUTES) ? " \n KAUTH_VNODE_WRITE_EXTATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_READ_SECURITY) ? " \n KAUTH_VNODE_READ_SECURITY" : "", \
+ (action & KAUTH_VNODE_WRITE_SECURITY) ? " \n KAUTH_VNODE_WRITE_SECURITY" : "", \
+ (action & KAUTH_VNODE_TAKE_OWNERSHIP) ? " \n KAUTH_VNODE_TAKE_OWNERSHIP" : ""); \
+ } \
+ else \
+ { \
+ KextLog_FileNote( \
+ vnode, \
+ message ". Proc name: %s. File vnode action: %s%s%s%s%s%s%s%s%s%s%s%s \n ", \
+ procname, \
+ (action & KAUTH_VNODE_READ_DATA) ? " \n KAUTH_VNODE_READ_DATA" : "", \
+ (action & KAUTH_VNODE_WRITE_DATA) ? " \n KAUTH_VNODE_WRITE_DATA" : "", \
+ (action & KAUTH_VNODE_EXECUTE) ? " \n KAUTH_VNODE_EXECUTE" : "", \
+ (action & KAUTH_VNODE_DELETE) ? " \n KAUTH_VNODE_DELETE" : "", \
+ (action & KAUTH_VNODE_APPEND_DATA) ? " \n KAUTH_VNODE_APPEND_DATA" : "", \
+ (action & KAUTH_VNODE_READ_ATTRIBUTES) ? " \n KAUTH_VNODE_READ_ATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_WRITE_ATTRIBUTES) ? " \n KAUTH_VNODE_WRITE_ATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_READ_EXTATTRIBUTES) ? " \n KAUTH_VNODE_READ_EXTATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_WRITE_EXTATTRIBUTES) ? " \n KAUTH_VNODE_WRITE_EXTATTRIBUTES" : "", \
+ (action & KAUTH_VNODE_READ_SECURITY) ? " \n KAUTH_VNODE_READ_SECURITY" : "", \
+ (action & KAUTH_VNODE_WRITE_SECURITY) ? " \n KAUTH_VNODE_WRITE_SECURITY" : "", \
+ (action & KAUTH_VNODE_TAKE_OWNERSHIP) ? " \n KAUTH_VNODE_TAKE_OWNERSHIP" : ""); \
+ } \
+ } while (0)
#endif /* KextLog_h */
diff --git a/ProjFS.Mac/PrjFSLib/prjfs-log/prjfs-log.cpp b/ProjFS.Mac/PrjFSLib/prjfs-log/prjfs-log.cpp
index 8e0f138bc7..220c58858e 100644
--- a/ProjFS.Mac/PrjFSLib/prjfs-log/prjfs-log.cpp
+++ b/ProjFS.Mac/PrjFSLib/prjfs-log/prjfs-log.cpp
@@ -6,7 +6,6 @@
#include
#include
-
static const char* KextLogLevelAsString(KextLog_Level level);
int main(int argc, const char * argv[])
@@ -24,7 +23,9 @@ int main(int argc, const char * argv[])
std::cerr << "Failed to set up shared data queue.\n";
return 1;
}
-
+
+ __block int lineCount = 0;
+
dispatch_source_set_event_handler(dataQueue.dispatchSource, ^{
struct {
mach_msg_header_t msgHdr;
@@ -39,6 +40,7 @@ int main(int argc, const char * argv[])
{
break;
}
+
int messageSize = entry->size;
if (messageSize >= sizeof(KextLog_MessageHeader) + 2)
{
@@ -46,8 +48,11 @@ int main(int argc, const char * argv[])
memcpy(&message, entry->data, sizeof(KextLog_MessageHeader));
const char* messageType = KextLogLevelAsString(message.level);
int logStringLength = messageSize - sizeof(KextLog_MessageHeader) - 1;
- printf("%s: %.*s\n", messageType, logStringLength, entry->data + sizeof(KextLog_MessageHeader));
+
+ printf("(%d: %llu) %s: %.*s\n", lineCount, message.machAbsoluteTimestamp, messageType, logStringLength, entry->data + sizeof(KextLog_MessageHeader));
+ lineCount++;
}
+
IODataQueueDequeue(dataQueue.queueMemory, nullptr, nullptr);
}
});