View Full Version : Open USB Drive as File using NSWorkplace in Objective-C
Jan 25, 2012, 04:31 AM
I am writing an application in MAC-OS using Objective-C , to read Boot-Sector of USB Drive and just to modify some bytes in it.
I created object of NSWorkspace, but problem is that how can pass USB-Drive Path in openFile methods.
Jan 25, 2012, 05:41 AM
Did you mean NSWorkspace ?
What have you tried that hasn't worked ? Are you sure this is the class you want for what you want to do ? What exactly are you trying to achieve where you think you need to modify some bytes in the boot sector of a USB flash drive ?
To modify a device at such a level under Unix, you usually require access to the character device special file which will present you the device in "raw" mode. Under OS X, I believe these files will be /dev/rdisk# where # is replaced by the disk number.
NSWorkspace doesn't sound like what you need at all, except maybe to get a list of mounted media using the - (NSArray *)mountedRemovableMedia method. But frankly, this won't give you the DSF for the USB media. openFile doesn't do what you think it does, it basically acts as if you've double clicked a file.
You probably need to look a bit deeper here, the I/O Kit API is probably more in-tune with what you want to do, along with the I/O Registry :
Once you have the info for the USB device, just go for standard ANSI C or POSIX stuff to manipulate the bits in the file (fopen()/open(), fseek(), fprintf()/fputc(), fclose()/close()).
Jan 25, 2012, 05:54 AM
In Windows I am using "CreateFile" API to get handle USB DRIVE e.g( H:\\ etc.) and using "DeviceIoControl" to mount and Unmount USB Drive to update its Boot Sector.
This same functionality I want to use in MAC-OS. I can open using ANSI-C functions but Mount/Unmount... how can be.
Jan 25, 2012, 06:05 AM
Did you read my second link ? That's a pretty hefty document I pointed to (the I/O kit reference). It should contain everything you need to know. But again I question why you feel the need to even modify the boot sector of a USB drive ?
Jan 25, 2012, 01:33 PM
Use DiskArbitration framework to get local drives. Then feed the kDADiskDescriptionMediaBSDNameKey of the disk to opendev().
You can also then use DADiskUnmount(), DADiskMount(), and DADiskEject().
Jan 11, 2013, 12:17 AM
I did a project like this a few years ago. I ended up reading the /dev/rdisk file. The link below will explain how the data is structured. Open the /dev/rdisk file for reading and march down the bytes.