简体   繁体   中英

Parsing files in generic kernel extensions

Xcode's generic Kernel Extension requires file parsing.

For example, I want to read the contents of the A.txt file and save it as a variable. Just like you used FILE, fopen, EOF in c

As you can see, generic Kernel Extension can not include stdio.h, resulting in an error of use of undeclared identifier.

I am wondering if there is a way to parse a file in generic Kernel Extension like c. (The following code can be used in Kernel Extension)

FILE *f;
char c;
int index = 0;
f = fopen(filepath, "rt");
while((c = fgetc(f)) != EOF){
    fileContent[index] = c;
    index++;
}
fileContent[index] = '\0';

It is certainly possible . You'll need to do the following:

  1. Open the file with vnode_open() . This will turn your path into a vnode_t reference. You'll need a VFS authorisation context; you can obtain the current thread's context (ie open the file as the user in whose process's context the kernel is currently running) with vfs_context_create() if you don't already have one.
  2. Perform I/O with vn_rdwr() . (Reads & writes use the same function, just pass UIO_READ or UIO_WRITE as the second argument.)
  3. Close the file and drop references to the vnode with vnode_close() . Possibly dispose of a created VFS context using vfs_context_rele() .

You'll want to look at the headerdocs for all of those functions, they're defined in <sys/vnode.h> in the Kernel.framework, and explaining every parameter exceeds the scope of a SO question/answer.

Note: As a commenter has already pointed out however, you'll want to make sure that opening files is really what needs to be done to solve whatever your problem is, particularly if you're newish to kernel programming. If at all unsure, I suggest you post a question along the lines of "I'm trying to do X, is reading the file in a kext really the best way forward?" where X is sufficiently high level, not "I need the contents of a file in the kernel" but why , and why a file specifically?

In various kernel execution contexts, file I/O may not be safe (ie may sometimes hang the system). If your kext loads early during boot, there might not be a file system yet. File I/O causes a lot to happen in the system, and can take a very long time in kernel terms - especially if you consider network file systems (including netboot environments!). If you're not careful, you might cause a bad user experience if the user is trying to eject a volume with a file your kext has open: the user has no way of resolving this, the OS can only suggest specific apps to close, it can't reach deep into your kext. Plus, there's the usual warnings about kernel programming in general: just because it can be done in the kernel, doesn't mean it should be. It's more the opposite: only if it can't be done any other way should it be done in a kext.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM