From: Wrecked on
Below is the unmanaged code written with evc++


-------------------------------------------------------------------------------------------------------------------------------
#include <windows.h>
#include <windowsx.h>
#include <aygshell.h>
#include <msgqueue.h>
#include <pnp.h>
#include <diskio.h>
#include <Pkfuncs.h>
#include <sdcardddk.h>



extern "C" _declspec(dllexport) void WINAPI OnRawRead(DWORD
memory_location,unsigned char* lpOutBuf)
{
// TODO: Add your control notification handler code here

HANDLE hDevice
=CreateFile(L"DSK1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
SG_REQ lpInBuf;
DWORD dwDummy = 3;
//unsigned char *lpOutBuf;
lpOutBuf = (unsigned char *)malloc(512);
memset(lpOutBuf, 0x00, 512); // only to see the changes
lpInBuf.sr_start = memory_location;//0xFF;//0x0018555; //
physical sector to read
lpInBuf.sr_num_sec = 1; // read 1 sector
lpInBuf.sr_num_sg = 1;
lpInBuf.sr_status = 0; //ERROR_SUCCESS;
lpInBuf.sr_callback =NULL;// callbackDiskRead;
lpInBuf.sr_sglist[0].sb_buf = ((LPBYTE)
MapPtrToProcess(lpOutBuf,GetCurrentProcess()));
lpInBuf.sr_sglist[0].sb_len = 512 * lpInBuf.sr_num_sec;

BOOL bRet=DeviceIoControl(hDevice, // Handle to the device
IOCTL_DISK_READ, // IOCTL for the operation
&lpInBuf, // LP to a buffer (input data)
sizeof(lpInBuf), // Size in Bytes of input data
buffer
lpOutBuf, // LP to a buffer for output data
sizeof(lpOutBuf), // Size in Bytes of output buffer
&dwDummy, // LP to variable (size of data in out
buffer)
NULL);
CloseHandle(hDevice);


}


extern "C" _declspec(dllexport) void WINAPI OnRawWrite(DWORD
memory_location,unsigned char* pBuffer)
{
HANDLE hDevice1
=CreateFile(L"DSK1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
SG_REQ lpInBuf1;
DWORD dwDummy1 = 3;
char *lpOutBuf1;
lpOutBuf1 = (char *)malloc(512);
memset(lpOutBuf1, 0x00, 512); // only to see the changes


strcpy(( char*)lpOutBuf1,( char *)pBuffer);

lpInBuf1.sr_start = memory_location; //0x0018555; // physical
sector
lpInBuf1.sr_num_sec = 1; // number of sectors sector
lpInBuf1.sr_num_sg = 1;
lpInBuf1.sr_status = 0; //ERROR_SUCCESS;
lpInBuf1.sr_callback =NULL;// callbackDiskRead;
lpInBuf1.sr_sglist[0].sb_buf = ((LPBYTE)
MapPtrToProcess(lpOutBuf1,GetCurrentProcess()));
lpInBuf1.sr_sglist[0].sb_len = 512 * lpInBuf1.sr_num_sec;

BOOL bRet=DeviceIoControl(hDevice1, // Handle to the device
IOCTL_DISK_WRITE, // IOCTL for the operation
&lpInBuf1, // LP to a buffer (input data)
sizeof(lpInBuf1), // Size in Bytes of input data
buffer
lpOutBuf1, // LP to a buffer for output data
sizeof(lpOutBuf1), // Size in Bytes of output buffer
&dwDummy1, // LP to variable (size of data in out
buffer)
NULL);

CloseHandle(hDevice1);

}
-------------------------------------------------------------------------------------------------------------------------------




The functions do some basic rawread and rawwrite on an SD card.
Now how can i use this code in the c# (managed code). Specifically i
need to know how to marshal "char *".

I did try out with the following code (the dll created by evc++ was
SD_card_dll.dll. But it doesnt seam to work.

[DllImport("SD_card_dll.dll")]
public static extern void OnRawRead(int memory_location,ref
IntPtr lpOutBuf);
[DllImport("SD_card_dll.dll")]
public static extern void OnRawWrite(int memory_location,ref
IntPtr lpBuffer);
}

Thanks and Regards,
Rithesh

Student
IIIT, Bangalore

From: " ctacke/>" on
Well a char * would likely be a byte array, though your code is not
conducive to that. You're using a strcpy on it, without knowing a length
which is generally very unsafe (this is how many security holes in the
desktop OS are created and exploited).

You code appears to assume ASCII string input. Also not the best design for
CE - especially when you need to marshal from managed code where strings are
always Unicode.

To keep with your definitions, change your P/Invoke to a byte[], then take
your string data, pass it through Encoding.ASCII.GetBytes and pass that
through.


--
Chris Tacke
OpenNETCF Consulting
Managed Code in the Embedded World
www.opennetcf.com
--



"Wrecked" <rithesh.rg(a)gmail.com> wrote in message
news:1166417850.957390.142050(a)79g2000cws.googlegroups.com...
> Below is the unmanaged code written with evc++
>
>
> -------------------------------------------------------------------------------------------------------------------------------
> #include <windows.h>
> #include <windowsx.h>
> #include <aygshell.h>
> #include <msgqueue.h>
> #include <pnp.h>
> #include <diskio.h>
> #include <Pkfuncs.h>
> #include <sdcardddk.h>
>
>
>
> extern "C" _declspec(dllexport) void WINAPI OnRawRead(DWORD
> memory_location,unsigned char* lpOutBuf)
> {
> // TODO: Add your control notification handler code here
>
> HANDLE hDevice
> =CreateFile(L"DSK1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> SG_REQ lpInBuf;
> DWORD dwDummy = 3;
> //unsigned char *lpOutBuf;
> lpOutBuf = (unsigned char *)malloc(512);
> memset(lpOutBuf, 0x00, 512); // only to see the changes
> lpInBuf.sr_start = memory_location;//0xFF;//0x0018555; //
> physical sector to read
> lpInBuf.sr_num_sec = 1; // read 1 sector
> lpInBuf.sr_num_sg = 1;
> lpInBuf.sr_status = 0; //ERROR_SUCCESS;
> lpInBuf.sr_callback =NULL;// callbackDiskRead;
> lpInBuf.sr_sglist[0].sb_buf = ((LPBYTE)
> MapPtrToProcess(lpOutBuf,GetCurrentProcess()));
> lpInBuf.sr_sglist[0].sb_len = 512 * lpInBuf.sr_num_sec;
>
> BOOL bRet=DeviceIoControl(hDevice, // Handle to the device
> IOCTL_DISK_READ, // IOCTL for the operation
> &lpInBuf, // LP to a buffer (input data)
> sizeof(lpInBuf), // Size in Bytes of input data
> buffer
> lpOutBuf, // LP to a buffer for output data
> sizeof(lpOutBuf), // Size in Bytes of output buffer
> &dwDummy, // LP to variable (size of data in out
> buffer)
> NULL);
> CloseHandle(hDevice);
>
>
> }
>
>
> extern "C" _declspec(dllexport) void WINAPI OnRawWrite(DWORD
> memory_location,unsigned char* pBuffer)
> {
> HANDLE hDevice1
> =CreateFile(L"DSK1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> SG_REQ lpInBuf1;
> DWORD dwDummy1 = 3;
> char *lpOutBuf1;
> lpOutBuf1 = (char *)malloc(512);
> memset(lpOutBuf1, 0x00, 512); // only to see the changes
>
>
> strcpy(( char*)lpOutBuf1,( char *)pBuffer);
>
> lpInBuf1.sr_start = memory_location; //0x0018555; // physical
> sector
> lpInBuf1.sr_num_sec = 1; // number of sectors sector
> lpInBuf1.sr_num_sg = 1;
> lpInBuf1.sr_status = 0; //ERROR_SUCCESS;
> lpInBuf1.sr_callback =NULL;// callbackDiskRead;
> lpInBuf1.sr_sglist[0].sb_buf = ((LPBYTE)
> MapPtrToProcess(lpOutBuf1,GetCurrentProcess()));
> lpInBuf1.sr_sglist[0].sb_len = 512 * lpInBuf1.sr_num_sec;
>
> BOOL bRet=DeviceIoControl(hDevice1, // Handle to the device
> IOCTL_DISK_WRITE, // IOCTL for the operation
> &lpInBuf1, // LP to a buffer (input data)
> sizeof(lpInBuf1), // Size in Bytes of input data
> buffer
> lpOutBuf1, // LP to a buffer for output data
> sizeof(lpOutBuf1), // Size in Bytes of output buffer
> &dwDummy1, // LP to variable (size of data in out
> buffer)
> NULL);
>
> CloseHandle(hDevice1);
>
> }
> -------------------------------------------------------------------------------------------------------------------------------
>
>
>
>
> The functions do some basic rawread and rawwrite on an SD card.
> Now how can i use this code in the c# (managed code). Specifically i
> need to know how to marshal "char *".
>
> I did try out with the following code (the dll created by evc++ was
> SD_card_dll.dll. But it doesnt seam to work.
>
> [DllImport("SD_card_dll.dll")]
> public static extern void OnRawRead(int memory_location,ref
> IntPtr lpOutBuf);
> [DllImport("SD_card_dll.dll")]
> public static extern void OnRawWrite(int memory_location,ref
> IntPtr lpBuffer);
> }
>
> Thanks and Regards,
> Rithesh
>
> Student
> IIIT, Bangalore
>


From: Wrecked on
Hello Chris,

>From one of the previous discussions i understand that i could as well
use OpenNetCF to use createfile and deviceIocontrol in the
StreamInterfaceDriver. Kindly if u could throw some light on how this
could be done, it would be great. I couldnt find much documentation for
this.
All i could know about this class was one could use this abstract base
class to create wrappers around Stream Interface Drivers that are not
supported by the CF. I am not able to figure out how i could pass
SG_REQ structure.

It would help me a lot to use the functions OpenNetCF since then i
wouldnt have to worry about deploying my project on phones with
different architectures. I am not an expert on .net CF, a skeleton flow
of how i could write this would be of great help.

Thanks and Regards,
Rithesh
Student,
IIIT, Bangalore

<ctacke/> wrote:
> Well a char * would likely be a byte array, though your code is not
> conducive to that. You're using a strcpy on it, without knowing a length
> which is generally very unsafe (this is how many security holes in the
> desktop OS are created and exploited).
>
> You code appears to assume ASCII string input. Also not the best design for
> CE - especially when you need to marshal from managed code where strings are
> always Unicode.
>
> To keep with your definitions, change your P/Invoke to a byte[], then take
> your string data, pass it through Encoding.ASCII.GetBytes and pass that
> through.
>
>
> --
> Chris Tacke
> OpenNETCF Consulting
> Managed Code in the Embedded World
> www.opennetcf.com
> --
>
>
>
> "Wrecked" <rithesh.rg(a)gmail.com> wrote in message
> news:1166417850.957390.142050(a)79g2000cws.googlegroups.com...
> > Below is the unmanaged code written with evc++
> >
> >
> > -------------------------------------------------------------------------------------------------------------------------------
> > #include <windows.h>
> > #include <windowsx.h>
> > #include <aygshell.h>
> > #include <msgqueue.h>
> > #include <pnp.h>
> > #include <diskio.h>
> > #include <Pkfuncs.h>
> > #include <sdcardddk.h>
> >
> >
> >
> > extern "C" _declspec(dllexport) void WINAPI OnRawRead(DWORD
> > memory_location,unsigned char* lpOutBuf)
> > {
> > // TODO: Add your control notification handler code here
> >
> > HANDLE hDevice
> > =CreateFile(L"DSK1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> > SG_REQ lpInBuf;
> > DWORD dwDummy = 3;
> > //unsigned char *lpOutBuf;
> > lpOutBuf = (unsigned char *)malloc(512);
> > memset(lpOutBuf, 0x00, 512); // only to see the changes
> > lpInBuf.sr_start = memory_location;//0xFF;//0x0018555; //
> > physical sector to read
> > lpInBuf.sr_num_sec = 1; // read 1 sector
> > lpInBuf.sr_num_sg = 1;
> > lpInBuf.sr_status = 0; //ERROR_SUCCESS;
> > lpInBuf.sr_callback =NULL;// callbackDiskRead;
> > lpInBuf.sr_sglist[0].sb_buf = ((LPBYTE)
> > MapPtrToProcess(lpOutBuf,GetCurrentProcess()));
> > lpInBuf.sr_sglist[0].sb_len = 512 * lpInBuf.sr_num_sec;
> >
> > BOOL bRet=DeviceIoControl(hDevice, // Handle to the device
> > IOCTL_DISK_READ, // IOCTL for the operation
> > &lpInBuf, // LP to a buffer (input data)
> > sizeof(lpInBuf), // Size in Bytes of input data
> > buffer
> > lpOutBuf, // LP to a buffer for output data
> > sizeof(lpOutBuf), // Size in Bytes of output buffer
> > &dwDummy, // LP to variable (size of data in out
> > buffer)
> > NULL);
> > CloseHandle(hDevice);
> >
> >
> > }
> >
> >
> > extern "C" _declspec(dllexport) void WINAPI OnRawWrite(DWORD
> > memory_location,unsigned char* pBuffer)
> > {
> > HANDLE hDevice1
> > =CreateFile(L"DSK1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> > SG_REQ lpInBuf1;
> > DWORD dwDummy1 = 3;
> > char *lpOutBuf1;
> > lpOutBuf1 = (char *)malloc(512);
> > memset(lpOutBuf1, 0x00, 512); // only to see the changes
> >
> >
> > strcpy(( char*)lpOutBuf1,( char *)pBuffer);
> >
> > lpInBuf1.sr_start = memory_location; //0x0018555; // physical
> > sector
> > lpInBuf1.sr_num_sec = 1; // number of sectors sector
> > lpInBuf1.sr_num_sg = 1;
> > lpInBuf1.sr_status = 0; //ERROR_SUCCESS;
> > lpInBuf1.sr_callback =NULL;// callbackDiskRead;
> > lpInBuf1.sr_sglist[0].sb_buf = ((LPBYTE)
> > MapPtrToProcess(lpOutBuf1,GetCurrentProcess()));
> > lpInBuf1.sr_sglist[0].sb_len = 512 * lpInBuf1.sr_num_sec;
> >
> > BOOL bRet=DeviceIoControl(hDevice1, // Handle to the device
> > IOCTL_DISK_WRITE, // IOCTL for the operation
> > &lpInBuf1, // LP to a buffer (input data)
> > sizeof(lpInBuf1), // Size in Bytes of input data
> > buffer
> > lpOutBuf1, // LP to a buffer for output data
> > sizeof(lpOutBuf1), // Size in Bytes of output buffer
> > &dwDummy1, // LP to variable (size of data in out
> > buffer)
> > NULL);
> >
> > CloseHandle(hDevice1);
> >
> > }
> > -------------------------------------------------------------------------------------------------------------------------------
> >
> >
> >
> >
> > The functions do some basic rawread and rawwrite on an SD card.
> > Now how can i use this code in the c# (managed code). Specifically i
> > need to know how to marshal "char *".
> >
> > I did try out with the following code (the dll created by evc++ was
> > SD_card_dll.dll. But it doesnt seam to work.
> >
> > [DllImport("SD_card_dll.dll")]
> > public static extern void OnRawRead(int memory_location,ref
> > IntPtr lpOutBuf);
> > [DllImport("SD_card_dll.dll")]
> > public static extern void OnRawWrite(int memory_location,ref
> > IntPtr lpBuffer);
> > }
> >
> > Thanks and Regards,
> > Rithesh
> >
> > Student
> > IIIT, Bangalore
> >

From: " ctacke/>" on
You'd simply derive from StreamInterfaceDriver and set the prefix to DSK1:
and that gives you the foundation. Create a function for reading and have
it call its internal Read, and the same for Write.

For reading or writing any specific structure, you need to define the
sructure (or class) and then pass it, following hte rules of CF marshaling
appropriate for your version.


--
Chris Tacke
OpenNETCF Consulting
Managed Code in the Embedded World
www.opennetcf.com
--


"Wrecked" <rithesh.rg(a)gmail.com> wrote in message
news:1166453269.094586.65330(a)80g2000cwy.googlegroups.com...
> Hello Chris,
>
>>From one of the previous discussions i understand that i could as well
> use OpenNetCF to use createfile and deviceIocontrol in the
> StreamInterfaceDriver. Kindly if u could throw some light on how this
> could be done, it would be great. I couldnt find much documentation for
> this.
> All i could know about this class was one could use this abstract base
> class to create wrappers around Stream Interface Drivers that are not
> supported by the CF. I am not able to figure out how i could pass
> SG_REQ structure.
>
> It would help me a lot to use the functions OpenNetCF since then i
> wouldnt have to worry about deploying my project on phones with
> different architectures. I am not an expert on .net CF, a skeleton flow
> of how i could write this would be of great help.
>
> Thanks and Regards,
> Rithesh
> Student,
> IIIT, Bangalore
>
> <ctacke/> wrote:
>> Well a char * would likely be a byte array, though your code is not
>> conducive to that. You're using a strcpy on it, without knowing a length
>> which is generally very unsafe (this is how many security holes in the
>> desktop OS are created and exploited).
>>
>> You code appears to assume ASCII string input. Also not the best design
>> for
>> CE - especially when you need to marshal from managed code where strings
>> are
>> always Unicode.
>>
>> To keep with your definitions, change your P/Invoke to a byte[], then
>> take
>> your string data, pass it through Encoding.ASCII.GetBytes and pass that
>> through.
>>
>>
>> --
>> Chris Tacke
>> OpenNETCF Consulting
>> Managed Code in the Embedded World
>> www.opennetcf.com
>> --
>>
>>
>>
>> "Wrecked" <rithesh.rg(a)gmail.com> wrote in message
>> news:1166417850.957390.142050(a)79g2000cws.googlegroups.com...
>> > Below is the unmanaged code written with evc++
>> >
>> >
>> > -------------------------------------------------------------------------------------------------------------------------------
>> > #include <windows.h>
>> > #include <windowsx.h>
>> > #include <aygshell.h>
>> > #include <msgqueue.h>
>> > #include <pnp.h>
>> > #include <diskio.h>
>> > #include <Pkfuncs.h>
>> > #include <sdcardddk.h>
>> >
>> >
>> >
>> > extern "C" _declspec(dllexport) void WINAPI OnRawRead(DWORD
>> > memory_location,unsigned char* lpOutBuf)
>> > {
>> > // TODO: Add your control notification handler code here
>> >
>> > HANDLE hDevice
>> > =CreateFile(L"DSK1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
>> > SG_REQ lpInBuf;
>> > DWORD dwDummy = 3;
>> > //unsigned char *lpOutBuf;
>> > lpOutBuf = (unsigned char *)malloc(512);
>> > memset(lpOutBuf, 0x00, 512); // only to see the changes
>> > lpInBuf.sr_start = memory_location;//0xFF;//0x0018555; //
>> > physical sector to read
>> > lpInBuf.sr_num_sec = 1; // read 1 sector
>> > lpInBuf.sr_num_sg = 1;
>> > lpInBuf.sr_status = 0; //ERROR_SUCCESS;
>> > lpInBuf.sr_callback =NULL;// callbackDiskRead;
>> > lpInBuf.sr_sglist[0].sb_buf = ((LPBYTE)
>> > MapPtrToProcess(lpOutBuf,GetCurrentProcess()));
>> > lpInBuf.sr_sglist[0].sb_len = 512 * lpInBuf.sr_num_sec;
>> >
>> > BOOL bRet=DeviceIoControl(hDevice, // Handle to the device
>> > IOCTL_DISK_READ, // IOCTL for the operation
>> > &lpInBuf, // LP to a buffer (input data)
>> > sizeof(lpInBuf), // Size in Bytes of input data
>> > buffer
>> > lpOutBuf, // LP to a buffer for output data
>> > sizeof(lpOutBuf), // Size in Bytes of output buffer
>> > &dwDummy, // LP to variable (size of data in out
>> > buffer)
>> > NULL);
>> > CloseHandle(hDevice);
>> >
>> >
>> > }
>> >
>> >
>> > extern "C" _declspec(dllexport) void WINAPI OnRawWrite(DWORD
>> > memory_location,unsigned char* pBuffer)
>> > {
>> > HANDLE hDevice1
>> > =CreateFile(L"DSK1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
>> > SG_REQ lpInBuf1;
>> > DWORD dwDummy1 = 3;
>> > char *lpOutBuf1;
>> > lpOutBuf1 = (char *)malloc(512);
>> > memset(lpOutBuf1, 0x00, 512); // only to see the changes
>> >
>> >
>> > strcpy(( char*)lpOutBuf1,( char *)pBuffer);
>> >
>> > lpInBuf1.sr_start = memory_location; //0x0018555; // physical
>> > sector
>> > lpInBuf1.sr_num_sec = 1; // number of sectors sector
>> > lpInBuf1.sr_num_sg = 1;
>> > lpInBuf1.sr_status = 0; //ERROR_SUCCESS;
>> > lpInBuf1.sr_callback =NULL;// callbackDiskRead;
>> > lpInBuf1.sr_sglist[0].sb_buf = ((LPBYTE)
>> > MapPtrToProcess(lpOutBuf1,GetCurrentProcess()));
>> > lpInBuf1.sr_sglist[0].sb_len = 512 * lpInBuf1.sr_num_sec;
>> >
>> > BOOL bRet=DeviceIoControl(hDevice1, // Handle to the device
>> > IOCTL_DISK_WRITE, // IOCTL for the operation
>> > &lpInBuf1, // LP to a buffer (input data)
>> > sizeof(lpInBuf1), // Size in Bytes of input data
>> > buffer
>> > lpOutBuf1, // LP to a buffer for output data
>> > sizeof(lpOutBuf1), // Size in Bytes of output buffer
>> > &dwDummy1, // LP to variable (size of data in out
>> > buffer)
>> > NULL);
>> >
>> > CloseHandle(hDevice1);
>> >
>> > }
>> > -------------------------------------------------------------------------------------------------------------------------------
>> >
>> >
>> >
>> >
>> > The functions do some basic rawread and rawwrite on an SD card.
>> > Now how can i use this code in the c# (managed code). Specifically i
>> > need to know how to marshal "char *".
>> >
>> > I did try out with the following code (the dll created by evc++ was
>> > SD_card_dll.dll. But it doesnt seam to work.
>> >
>> > [DllImport("SD_card_dll.dll")]
>> > public static extern void OnRawRead(int memory_location,ref
>> > IntPtr lpOutBuf);
>> > [DllImport("SD_card_dll.dll")]
>> > public static extern void OnRawWrite(int memory_location,ref
>> > IntPtr lpBuffer);
>> > }
>> >
>> > Thanks and Regards,
>> > Rithesh
>> >
>> > Student
>> > IIIT, Bangalore
>> >
>


From: Wrecked on
Hello Chris,
Thanks again for your help. I am still trying to hook up with C#
and excuse me if u find my questions too simple. I couldnt exactly
follow - "set the prefix to DSK1:", kindly could u be a bit more
specific as how i could do that.

Staying with c#, to access specific locations on DSK1 to read/write(i.e
after creating an handle to it - which i am yet to figure out how),
could i use PhysicalAddressPointer(int,int) and then use
ReadByte/WriteByte in PhysicalAddressPointer class. Is this also an
alternative to DeviceIoControl and Createfile functions.

Thanks and Regards,
Rithesh
Student,
IIIT, Bangalore


<ctacke/> wrote:
> You'd simply derive from StreamInterfaceDriver and set the prefix to DSK1:
> and that gives you the foundation. Create a function for reading and have
> it call its internal Read, and the same for Write.
>
> For reading or writing any specific structure, you need to define the
> sructure (or class) and then pass it, following hte rules of CF marshaling
> appropriate for your version.
>
>
> --
> Chris Tacke
> OpenNETCF Consulting
> Managed Code in the Embedded World
> www.opennetcf.com
> --
>
>
> "Wrecked" <rithesh.rg(a)gmail.com> wrote in message
> news:1166453269.094586.65330(a)80g2000cwy.googlegroups.com...
> > Hello Chris,
> >
> >>From one of the previous discussions i understand that i could as well
> > use OpenNetCF to use createfile and deviceIocontrol in the
> > StreamInterfaceDriver. Kindly if u could throw some light on how this
> > could be done, it would be great. I couldnt find much documentation for
> > this.
> > All i could know about this class was one could use this abstract base
> > class to create wrappers around Stream Interface Drivers that are not
> > supported by the CF. I am not able to figure out how i could pass
> > SG_REQ structure.
> >
> > It would help me a lot to use the functions OpenNetCF since then i
> > wouldnt have to worry about deploying my project on phones with
> > different architectures. I am not an expert on .net CF, a skeleton flow
> > of how i could write this would be of great help.
> >
> > Thanks and Regards,
> > Rithesh
> > Student,
> > IIIT, Bangalore
> >
> > <ctacke/> wrote:
> >> Well a char * would likely be a byte array, though your code is not
> >> conducive to that. You're using a strcpy on it, without knowing a length
> >> which is generally very unsafe (this is how many security holes in the
> >> desktop OS are created and exploited).
> >>
> >> You code appears to assume ASCII string input. Also not the best design
> >> for
> >> CE - especially when you need to marshal from managed code where strings
> >> are
> >> always Unicode.
> >>
> >> To keep with your definitions, change your P/Invoke to a byte[], then
> >> take
> >> your string data, pass it through Encoding.ASCII.GetBytes and pass that
> >> through.
> >>
> >>
> >> --
> >> Chris Tacke
> >> OpenNETCF Consulting
> >> Managed Code in the Embedded World
> >> www.opennetcf.com
> >> --
> >>
> >>
> >>
> >> "Wrecked" <rithesh.rg(a)gmail.com> wrote in message
> >> news:1166417850.957390.142050(a)79g2000cws.googlegroups.com...
> >> > Below is the unmanaged code written with evc++
> >> >
> >> >
> >> > -------------------------------------------------------------------------------------------------------------------------------
> >> > #include <windows.h>
> >> > #include <windowsx.h>
> >> > #include <aygshell.h>
> >> > #include <msgqueue.h>
> >> > #include <pnp.h>
> >> > #include <diskio.h>
> >> > #include <Pkfuncs.h>
> >> > #include <sdcardddk.h>
> >> >
> >> >
> >> >
> >> > extern "C" _declspec(dllexport) void WINAPI OnRawRead(DWORD
> >> > memory_location,unsigned char* lpOutBuf)
> >> > {
> >> > // TODO: Add your control notification handler code here
> >> >
> >> > HANDLE hDevice
> >> > =CreateFile(L"DSK1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> >> > SG_REQ lpInBuf;
> >> > DWORD dwDummy = 3;
> >> > //unsigned char *lpOutBuf;
> >> > lpOutBuf = (unsigned char *)malloc(512);
> >> > memset(lpOutBuf, 0x00, 512); // only to see the changes
> >> > lpInBuf.sr_start = memory_location;//0xFF;//0x0018555; //
> >> > physical sector to read
> >> > lpInBuf.sr_num_sec = 1; // read 1 sector
> >> > lpInBuf.sr_num_sg = 1;
> >> > lpInBuf.sr_status = 0; //ERROR_SUCCESS;
> >> > lpInBuf.sr_callback =NULL;// callbackDiskRead;
> >> > lpInBuf.sr_sglist[0].sb_buf = ((LPBYTE)
> >> > MapPtrToProcess(lpOutBuf,GetCurrentProcess()));
> >> > lpInBuf.sr_sglist[0].sb_len = 512 * lpInBuf.sr_num_sec;
> >> >
> >> > BOOL bRet=DeviceIoControl(hDevice, // Handle to the device
> >> > IOCTL_DISK_READ, // IOCTL for the operation
> >> > &lpInBuf, // LP to a buffer (input data)
> >> > sizeof(lpInBuf), // Size in Bytes of input data
> >> > buffer
> >> > lpOutBuf, // LP to a buffer for output data
> >> > sizeof(lpOutBuf), // Size in Bytes of output buffer
> >> > &dwDummy, // LP to variable (size of data in out
> >> > buffer)
> >> > NULL);
> >> > CloseHandle(hDevice);
> >> >
> >> >
> >> > }
> >> >
> >> >
> >> > extern "C" _declspec(dllexport) void WINAPI OnRawWrite(DWORD
> >> > memory_location,unsigned char* pBuffer)
> >> > {
> >> > HANDLE hDevice1
> >> > =CreateFile(L"DSK1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
> >> > SG_REQ lpInBuf1;
> >> > DWORD dwDummy1 = 3;
> >> > char *lpOutBuf1;
> >> > lpOutBuf1 = (char *)malloc(512);
> >> > memset(lpOutBuf1, 0x00, 512); // only to see the changes
> >> >
> >> >
> >> > strcpy(( char*)lpOutBuf1,( char *)pBuffer);
> >> >
> >> > lpInBuf1.sr_start = memory_location; //0x0018555; // physical
> >> > sector
> >> > lpInBuf1.sr_num_sec = 1; // number of sectors sector
> >> > lpInBuf1.sr_num_sg = 1;
> >> > lpInBuf1.sr_status = 0; //ERROR_SUCCESS;
> >> > lpInBuf1.sr_callback =NULL;// callbackDiskRead;
> >> > lpInBuf1.sr_sglist[0].sb_buf = ((LPBYTE)
> >> > MapPtrToProcess(lpOutBuf1,GetCurrentProcess()));
> >> > lpInBuf1.sr_sglist[0].sb_len = 512 * lpInBuf1.sr_num_sec;
> >> >
> >> > BOOL bRet=DeviceIoControl(hDevice1, // Handle to the device
> >> > IOCTL_DISK_WRITE, // IOCTL for the operation
> >> > &lpInBuf1, // LP to a buffer (input data)
> >> > sizeof(lpInBuf1), // Size in Bytes of input data
> >> > buffer
> >> > lpOutBuf1, // LP to a buffer for output data
> >> > sizeof(lpOutBuf1), // Size in Bytes of output buffer
> >> > &dwDummy1, // LP to variable (size of data in out
> >> > buffer)
> >> > NULL);
> >> >
> >> > CloseHandle(hDevice1);
> >> >
> >> > }
> >> > -------------------------------------------------------------------------------------------------------------------------------
> >> >
> >> >
> >> >
> >> >
> >> > The functions do some basic rawread and rawwrite on an SD card.
> >> > Now how can i use this code in the c# (managed code). Specifically i
> >> > need to know how to marshal "char *".
> >> >
> >> > I did try out with the following code (the dll created by evc++ was
> >> > SD_card_dll.dll. But it doesnt seam to work.
> >> >
> >> > [DllImport("SD_card_dll.dll")]
> >> > public static extern void OnRawRead(int memory_location,ref
> >> > IntPtr lpOutBuf);
> >> > [DllImport("SD_card_dll.dll")]
> >> > public static extern void OnRawWrite(int memory_location,ref
> >> > IntPtr lpBuffer);
> >> > }
> >> >
> >> > Thanks and Regards,
> >> > Rithesh
> >> >
> >> > Student
> >> > IIIT, Bangalore
> >> >
> >