Click here to Skip to main content
14,868,806 members
Home / Discussions / C#
   

C#

 
AnswerRe: Continue program after encountering error Pin
NotTodayYo10-Mar-21 10:52
MemberNotTodayYo10-Mar-21 10:52 
AnswerRe: Continue program after encountering error Pin
Eddy Vluggen10-Mar-21 11:24
professionalEddy Vluggen10-Mar-21 11:24 
AnswerRe: Continue program after encountering error Pin
OriginalGriff10-Mar-21 21:17
mveOriginalGriff10-Mar-21 21:17 
QuestionHow to pass an array or structs to DeviceIoControl when using pinvoke Pin
BobZscharnagk7-Mar-21 22:13
MemberBobZscharnagk7-Mar-21 22:13 
AnswerRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
Randor 8-Mar-21 11:50
professional Randor 8-Mar-21 11:50 
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
Gerry Schmitz9-Mar-21 8:16
mveGerry Schmitz9-Mar-21 8:16 
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
Randor 9-Mar-21 10:24
professional Randor 9-Mar-21 10:24 
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
BobZscharnagk10-Mar-21 14:09
MemberBobZscharnagk10-Mar-21 14:09 
Radnor,

You were on the right track. The program was running as administrator so the "Access denied" was confusing me as well. The SafeFileHandle was created like this ...

using (dd = new FileStream(path + ".dd", FileMode.Open, FileAccess.Write, FileShare.Write))
{
bool finished = NativeMethods.GetSparseRange(ldd.SafeFileHandle, query, ref response, 1024);

}

So when the DeviceIoControl was called the file was empty which for some reason caused the return code 5.

Changing the FileStream creation for an existing file stopped the error.

However now I get an 0x00000057 error, parameter error which brings me back to the original question as how to pass an array of structures to DeviceIoControl.

This is what I've tried, the output buffer is the issue I think....

public static bool GetSparseRange(SafeFileHandle hdrive, in FILE_ALLOCATED_RANGE_BUFFER query, ref FILE_ALLOCATED_RANGE_BUFFER[] response, int count)
{
    int nInBufferSize = (int)Marshal.SizeOf(typeof(FILE_ALLOCATED_RANGE_BUFFER));
    IntPtr lpInBuffer = Marshal.AllocHGlobal(nInBufferSize);
    Marshal.StructureToPtr(query, lpInBuffer, true);
    uint bytesread=0;

    int nOutBufferSize = nInBufferSize * count;
    IntPtr lpOutBuffer = Marshal.AllocHGlobal(nOutBufferSize);

    //IntPtr[] ptrArr = new IntPtr[count];
    //for (int i = 0; i < count; ++i)
    //{
    //    ptrArr[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FILE_ALLOCATED_RANGE_BUFFER)));
    //    Marshal.StructureToPtr(response[i], ptrArr[i], true);
    //}
    bool rc = DeviceIoControl(
        hdrive,                                                     // device to be queried
        (uint)EIOControlCode.FsctlQueryAllocatedRanges,             // operation to perform
        lpInBuffer, (uint)nInBufferSize,                         // input buffer
        lpOutBuffer, (uint)nOutBufferSize,
        //ptrArr, (uint)(nInBufferSize * count),                   // output buffer
        ref bytesread,                                          // # bytes returned
        IntPtr.Zero);                                               // synchronous I/O
    // Get the last error and display it.
    int error = Marshal.GetLastWin32Error();
    Marshal.PtrToStructure(lpOutBuffer, response);
    //for (int j = 0; j < count / nInBufferSize; ++j)
    //{
    //    if (j < bytesread / nInBufferSize)
    //        Marshal.PtrToStructure(ptrArr[j], response[j]);
    //    Marshal.FreeHGlobal(ptrArr[j]);
    //}
    Marshal.FreeHGlobal(lpInBuffer);
    Marshal.FreeHGlobal(lpOutBuffer);
    return rc;
}


Thanks
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
Randor 10-Mar-21 16:54
professional Randor 10-Mar-21 16:54 
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
BobZscharnagk10-Mar-21 19:30
MemberBobZscharnagk10-Mar-21 19:30 
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
BobZscharnagk10-Mar-21 22:40
MemberBobZscharnagk10-Mar-21 22:40 
GeneralRe: How to pass an array or structs to DeviceIoControl when using pinvoke Pin
Randor 10-Mar-21 23:08
professional Randor 10-Mar-21 23:08 
QuestionUser Control Pin
Member 147923937-Mar-21 9:17
MemberMember 147923937-Mar-21 9:17 
AnswerRe: User Control Pin
OriginalGriff7-Mar-21 11:20
mveOriginalGriff7-Mar-21 11:20 
GeneralRe: User Control Pin
Member 147923938-Mar-21 1:50
MemberMember 147923938-Mar-21 1:50 
GeneralRe: User Control Pin
OriginalGriff8-Mar-21 2:45
mveOriginalGriff8-Mar-21 2:45 
AnswerRe: User Control Pin
BillWoodruff7-Mar-21 17:03
mveBillWoodruff7-Mar-21 17:03 
GeneralRe: User Control Pin
Member 147923938-Mar-21 1:49
MemberMember 147923938-Mar-21 1:49 
AnswerRe: User Control Pin
Ralf Meier7-Mar-21 22:46
professionalRalf Meier7-Mar-21 22:46 
GeneralRe: User Control Pin
BillWoodruff8-Mar-21 1:07
mveBillWoodruff8-Mar-21 1:07 
GeneralRe: User Control Pin
Member 147923938-Mar-21 1:51
MemberMember 147923938-Mar-21 1:51 
GeneralRe: User Control Pin
Ralf Meier8-Mar-21 5:10
professionalRalf Meier8-Mar-21 5:10 
QuestionHow to take JSON POST data and covert it to something i can work with Pin
jacobarrey4-Mar-21 11:40
Memberjacobarrey4-Mar-21 11:40 
AnswerRe: How to take JSON POST data and covert it to something i can work with Pin
OriginalGriff4-Mar-21 11:45
mveOriginalGriff4-Mar-21 11:45 
GeneralRe: How to take JSON POST data and covert it to something i can work with Pin
jacobarrey5-Mar-21 9:37
Memberjacobarrey5-Mar-21 9:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.