Raw write on disc

how can i write(read) on disc without using windows sucking FAT? i've written my own filesystem and i want to use it on diskettes, or to read linux EXT3Journal FS
[167 byte] By [phoenix.7] at [2007-11-18 2:12:00]
# 1 Re: Raw write on disc
look up the DirectIoControl API call
phinds at 2007-11-10 0:02:37 >
# 2 Re: Raw write on disc
thanx, can u please send me its declaration?:D
phoenix.7 at 2007-11-10 0:03:37 >
# 3 Re: Raw write on disc
Try this out...

Dim File As String

File = "C:\" & "TEXT.txt"
Open File For Output As #1
TextFields = "HI"

Print #1, TextFields
Close #1

John-
vbjohn at 2007-11-10 0:04:35 >
# 4 Re: Raw write on disc
no i know using this, but i want do edit my disc MBR and write to diskette formated in EXT2 filesystem
phoenix.7 at 2007-11-10 0:05:40 >
# 5 Re: Raw write on disc
Sorry I mis-understood.

John-
vbjohn at 2007-11-10 0:06:39 >
# 6 Re: Raw write on disc
the declaration is QUITE complex, so you'll need to get it from the API docs. There are a ton of parameters and some docs don't even show them all. For example, I have Dan Appleman's excellent book "Visual Basic Programmer's Guide to the API" and it doesn't have half of the parameters that are actually available for that call. In fact, one of the missing ones is the one in the book is the one that lets you do raw disk access.
phinds at 2007-11-10 0:07:42 >
# 7 Re: Raw write on disc
I used to know how to do this in C and dos but I don't know in win 32 :(
Boumxyz2 at 2007-11-10 0:08:45 >
# 8 Re: Raw write on disc
I'm interested, any links?
bubu at 2007-11-10 0:09:49 >
# 9 Re: Raw write on disc
Here is a little project I was playing with to change the serial number on a disk (everyone told me it could not be done through VB)

It gives you direct read/write access to disk sectors. If you run it, have a disk in your floppy drive. I hard coded it to start with the floppy so I didn't screw anything up by accident.

I'm sure it a little sloppy since I was trying different things, but you will want to look at the mDirectRW module.

If you have found a way to read/write to a linux I am interested...
Ron Stone at 2007-11-10 0:10:46 >
# 10 Re: Raw write on disc
from:
http://leb.net/wine/WinDoc/msdn/sdk/platforms/doc/sdk/win32/func/src/f16_13.htm

DeviceIoControl
The DeviceIoControl function sends a control code directly to a specified device driver, causing the corresponding device to perform the specified operation.

BOOL DeviceIoControl( HANDLE hDevice,
// handle to device of interest

DWORD dwIoControlCode,
// control code of operation to perform

LPVOID lpInBuffer,
// pointer to buffer to supply input data

DWORD nInBufferSize,
// size of input buffer

LPVOID lpOutBuffer,
// pointer to buffer to receive output data

DWORD nOutBufferSize,
// size of output buffer

LPDWORD lpBytesReturned,
// pointer to variable to receive output byte count

LPOVERLAPPED lpOverlapped
// pointer to overlapped structure for asynchronous operation

);


Parameters
hDevice
Handle to the device that is to perform the operation. Call the CreateFile function to obtain a device handle.

dwIoControlCode
Specifies the control code for the operation. This value identifies the specific operation to be performed and the type of device on which the operation is to be performed. The following values are defined: Value
Meaning

FSCTL_DISMOUNT_VOLUME
Dismounts a volume.

FSCTL_GET_COMPRESSION
Obtains the compression state of a file or directory

FSCTL_LOCK_VOLUME
Locks a volume.

FSCTL_READ_COMPRESSION
Reserved for future use.

FSCTL_SET_COMPRESSION
Sets the compression state of a file or directory.

FSCTL_UNLOCK_VOLUME
Unlocks a volume.

FSCTL_WRITE_COMPRESSION
Reserved for future use.

IOCTL_DISK_CHECK_VERIFY
Obsolete. Use IOCTL_STORAGE_CHECK_VERIFY

IOCTL_DISK_EJECT_MEDIA
Obsolete. Use IOCTL_STORAGE_EJECT_MEDIA

IOCTL_DISK_FORMAT_TRACKS
Formats a contiguous set of disk tracks.

IOCTL_DISK_GET_DRIVE_GEOMETRY
Obtains information on the physical disks geometry.

IOCTL_DISK_GET_DRIVE_LAYOUT
Provides information about each partition on a disk.

IOCTL_DISK_GET_MEDIA_TYPES
Obsolete. Use IOCTL_STORAGE_GET_MEDIA_TYPES

IOCTL_DISK_GET_PARTITION_INFO
Obtains disk partition information.

IOCTL_DISK_LOAD_MEDIA
Obsolete. Use IOCTL_STORAGE_LOAD_MEDIA

IOCTL_DISK_MEDIA_REMOVAL
Obsolete. Use IOCTL_STORAGE_MEDIA_REMOVAL

IOCTL_DISK_PERFORMANCE
Provides disk performance information.

IOCTL_DISK_REASSIGN_BLOCKS
Maps disk blocks to spare-block pool.

IOCTL_DISK_SET_DRIVE_LAYOUT
Partitions a disk.

IOCTL_DISK_SET_PARTITION_INFO
Sets the disk partition type.

IOCTL_DISK_VERIFY
Performs logical format of a disk extent.

IOCTL_SERIAL_LSRMST_INSERT
Enables or disables placement of a line and modem status data into the data stream.

IOCTL_STORAGE_CHECK_VERIFY
Checks for change in a removable-media device.

IOCTL_STORAGE_EJECT_MEDIA
Ejects media from a SCSI device.

IOCTL_STORAGE_GET_MEDIA_TYPES
Obtains information about media support.

IOCTL_STORAGE_LOAD_MEDIA
Loads media into a device.

IOCTL_STORAGE_MEDIA_REMOVAL
Enables or disables the media eject mechanism.


For more detailed information on each control code, see its topic. In particular, each topic provides details on the usage of the lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, and lpBytesReturned parameters.

lpInBuffer
Pointer to a buffer that contains the data required to perform the operation.
This parameter can be NULL if the dwIoControlCode parameter specifies an operation that does not require input data.

nInBufferSize
Specifies the size, in bytes, of the buffer pointed to by lpInBuffer.

lpOutBuffer
Pointer to a buffer that receives the operations output data.
This parameter can be NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.

nOutBufferSize
Specifies the size, in bytes, of the buffer pointed to by lpOutBuffer.

lpBytesReturned
Pointer to a variable that receives the size, in bytes, of the data stored into the buffer pointed to by lpOutBuffer.
If lpOverlapped is NULL, lpBytesReturned cannot be NULL. Even when an operation produces no output data, and lpOutBuffer can be NULL, the DeviceIoControl function makes use of the variable pointed to by lpBytesReturned. After such an operation, the value of the variable is without meaning.

If lpOverlapped is not NULL, lpBytesReturned can be NULL. If this is an overlapped operation, you can get the number of bytes returned by calling GetOverlappedResult. If hDevice is associated with an I/O completion port, you can get the number of bytes returned by calling GetQueuedCompletionStatus.

lpOverlapped
Pointer to an OVERLAPPED structure.
If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, this parameter must point to a valid OVERLAPPED structure. In this case, DeviceIoControl is performed as an overlapped (asynchronous) operation. If the device was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function fails in unpredictable ways.

If hDevice was opened without specifying the FILE_FLAG_OVERLAPPED flag, this parameter is ignored and the DeviceIoControl function does not return until the operation has been completed, or an error occurs.

Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
If hDevice was opened with FILE_FLAG_OVERLAPPED and the lpOverlapped parameter points to an OVERLAPPED structure, DeviceIoControl is performed as an overlapped (asynchronous) operation. In this case, the OVERLAPPED structure must contain a handle to a manual-reset event object created by a call to the CreateEvent function. For more information on manual-reset event objects, see Synchronization.

If the overlapped operation cannot be completed immediately, the function returns FALSE, and GetLastError returns ERROR_IO_PENDING, indicating that the operation is executing in the background. When this happens, the operating system sets the event object in the OVERLAPPED structure to the nonsignaled state before DeviceIoControl returns. The system then sets the event object to the signaled state when the operation has been completed. The calling thread can use any of the wait functions to wait for the event object to be signaled, and then use the GetOverlappedResult function to determine the results of the operation. The GetOverlappedResult function reports the success or failure of the operation and the number of bytes returned in the lpOutBuffer buffer.

See Also
CreateEvent, CreateFile, GetOverlappedResult, GetQueuedCompletionStatus, OVERLAPPED
Cimperiali at 2007-11-10 0:11:46 >
# 11 Re: Raw write on disc
thanks very much!
phoenix.7 at 2007-11-10 0:12:50 >
# 12 Re: Raw write on disc
Great code btw, i tried this out and it seems to work fine on Windows 2000. But on Windows XP Pro SP2 it seems to lock the drive and when u try to unmount it, or unplug it Windows will crash and shut down without a warning message. (From USB device)

I tried looking on msdn and the kb that microsoft has but i didn't come across anything. Has anyone else had any behavior like this ?

thanks
plasma_z at 2007-11-10 0:13:48 >