From: Wrecked on 19 Dec 2006 07:12 Hello Chris, Just out of curiosity how do u actually send back a string from a evc++ dll to the managed code.. as an example i was trying to use the following code which i had given above.. but i am getting not getting any thing back ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ extern "C" _declspec(dllexport) unsigned char* WINAPI Read() { unsigned char *lpOutBuf; lpOutBuf = (unsigned char *)malloc(512); memset(lpOutBuf, 0x97, 512); return lpOutBuf; } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ and on the c# side i am importing as-- string t = Read(); .. .. .. .. [DllImport("SD_card_dll.dll",EntryPoint="Read")] public static extern string Read(); The code runs without any exceptions but it only returns a null... Whats wrong with the code.. or is there a better way to do it?? Thanks and Regards, Rithesh Student, IIIT, Bangalore On Dec 18, 10:56 pm, "Wrecked" <rithesh...(a)gmail.com> wrote: > Chris, > Thanks a lot for your help. I will keep you posted if this thing > actually works.. else may be i will have to use the DLL approach. > > Thanks and regards, > Rithesh > Student, > IIIT, Bangalore > > <ctacke/> wrote: > > I've not used the DSK driver to do this, so I'm not sure if that is how it > > work. Intuitively that sounds right, but to know for sure I'd go look in PB > > for examples that do use the driver and see what's going on there, or just > > try that with known data to see if it works. > > > This is especially true for Flahs, as it has to be put into write mode > > before a write occurs. Maybe the driver does that - maybe not. And if it's > > a TFAT system I'd be interested to see how that works. There are a whole > > lot of unknowns here without doing research, and all in all I can't see what > > good this is for anyway. For disk access there is a file system, and that's > > what you should be using. Doing direct reads and writes sounds like a > > recipe for a corrupt file system to me. > > > -- > > Chris Tacke > > OpenNETCF Consulting > > Managed Code in the Embedded World > >www.opennetcf.com > > -- > > > "Wrecked" <rithesh...(a)gmail.com> wrote in message > >news:1166458858.700982.36620(a)n67g2000cwd.googlegroups.com... > > > Chris, > > > After i pass the DSK1 to the ctor, let me know if this approach is > > > valid. To write/read to a specific location- > > > I open() it, then seek() to the required location and then use > > > read()/write() and then close() it. > > > > Thanks and Regards > > > Rithesh > > > Student, > > > IIIT, Bangalore > > > > <ctacke/> wrote: > > >> If you look at the StreamInterfaceDriver class, it's ctor takes a device > > >> prefix, which is what it passes to CreateFile. > > > >> I'd discourage using the PhysicalAddressPointer for a few reasons: > > >> 1. it circumvents any existing driver, so you could get conflicts > > >> 2. it's not supported in CE 6.0 > > >> 3. disks don't really work that way > > > >> -- > > >> Chris Tacke > > >> OpenNETCF Consulting > > >> Managed Code in the Embedded World > > >>www.opennetcf.com > > >> -- > > > >> "Wrecked" <rithesh...(a)gmail.com> wrote in message > > >>news:1166457040.808907.41090(a)79g2000cws.googlegroups.com... > > >> > 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...(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...(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);... > > read more »
From: " ctacke/>" on 19 Dec 2006 08:48 This occurs often enough I really need to blog it. It is rarely, if ever, a good idea to return a string from a function, as controlling ownership of the memory is an issue and you will often result in memory leaks or hard to maintain code. If you need to "return" a string, pass a string pointer as a parameter, along with another that tells how big that buffer is so the caller maintains ownership. -- Chris Tacke OpenNETCF Consulting Managed Code in the Embedded World www.opennetcf.com -- "Wrecked" <rithesh.rg(a)gmail.com> wrote in message news:1166530336.578161.327650(a)n67g2000cwd.googlegroups.com... Hello Chris, Just out of curiosity how do u actually send back a string from a evc++ dll to the managed code.. as an example i was trying to use the following code which i had given above.. but i am getting not getting any thing back ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ extern "C" _declspec(dllexport) unsigned char* WINAPI Read() { unsigned char *lpOutBuf; lpOutBuf = (unsigned char *)malloc(512); memset(lpOutBuf, 0x97, 512); return lpOutBuf; } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ and on the c# side i am importing as-- string t = Read(); .. .. .. .. [DllImport("SD_card_dll.dll",EntryPoint="Read")] public static extern string Read(); The code runs without any exceptions but it only returns a null... Whats wrong with the code.. or is there a better way to do it?? Thanks and Regards, Rithesh Student, IIIT, Bangalore On Dec 18, 10:56 pm, "Wrecked" <rithesh...(a)gmail.com> wrote: > Chris, > Thanks a lot for your help. I will keep you posted if this thing > actually works.. else may be i will have to use the DLL approach. > > Thanks and regards, > Rithesh > Student, > IIIT, Bangalore > > <ctacke/> wrote: > > I've not used the DSK driver to do this, so I'm not sure if that is how > > it > > work. Intuitively that sounds right, but to know for sure I'd go look > > in PB > > for examples that do use the driver and see what's going on there, or > > just > > try that with known data to see if it works. > > > This is especially true for Flahs, as it has to be put into write mode > > before a write occurs. Maybe the driver does that - maybe not. And if > > it's > > a TFAT system I'd be interested to see how that works. There are a > > whole > > lot of unknowns here without doing research, and all in all I can't see > > what > > good this is for anyway. For disk access there is a file system, and > > that's > > what you should be using. Doing direct reads and writes sounds like a > > recipe for a corrupt file system to me. > > > -- > > Chris Tacke > > OpenNETCF Consulting > > Managed Code in the Embedded World > >www.opennetcf.com > > -- > > > "Wrecked" <rithesh...(a)gmail.com> wrote in message > >news:1166458858.700982.36620(a)n67g2000cwd.googlegroups.com... > > > Chris, > > > After i pass the DSK1 to the ctor, let me know if this approach is > > > valid. To write/read to a specific location- > > > I open() it, then seek() to the required location and then use > > > read()/write() and then close() it. > > > > Thanks and Regards > > > Rithesh > > > Student, > > > IIIT, Bangalore > > > > <ctacke/> wrote: > > >> If you look at the StreamInterfaceDriver class, it's ctor takes a > > >> device > > >> prefix, which is what it passes to CreateFile. > > > >> I'd discourage using the PhysicalAddressPointer for a few reasons: > > >> 1. it circumvents any existing driver, so you could get conflicts > > >> 2. it's not supported in CE 6.0 > > >> 3. disks don't really work that way > > > >> -- > > >> Chris Tacke > > >> OpenNETCF Consulting > > >> Managed Code in the Embedded World > > >>www.opennetcf.com > > >> -- > > > >> "Wrecked" <rithesh...(a)gmail.com> wrote in message > > >>news:1166457040.808907.41090(a)79g2000cws.googlegroups.com... > > >> > 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...(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...(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);... > > read more �
From: " ctacke/>" on 19 Dec 2006 09:58 Here's a better explanation: http://blog.opennetcf.org/ctacke/PermaLink,guid,4677c4fd-008a-4394-b571-a14123ce67d3.aspx -Chris "Wrecked" <rithesh.rg(a)gmail.com> wrote in message news:1166530336.578161.327650(a)n67g2000cwd.googlegroups.com... Hello Chris, Just out of curiosity how do u actually send back a string from a evc++ dll to the managed code.. as an example i was trying to use the following code which i had given above.. but i am getting not getting any thing back ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ extern "C" _declspec(dllexport) unsigned char* WINAPI Read() { unsigned char *lpOutBuf; lpOutBuf = (unsigned char *)malloc(512); memset(lpOutBuf, 0x97, 512); return lpOutBuf; } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ and on the c# side i am importing as-- string t = Read(); .. .. .. .. [DllImport("SD_card_dll.dll",EntryPoint="Read")] public static extern string Read(); The code runs without any exceptions but it only returns a null... Whats wrong with the code.. or is there a better way to do it?? Thanks and Regards, Rithesh Student, IIIT, Bangalore On Dec 18, 10:56 pm, "Wrecked" <rithesh...(a)gmail.com> wrote: > Chris, > Thanks a lot for your help. I will keep you posted if this thing > actually works.. else may be i will have to use the DLL approach. > > Thanks and regards, > Rithesh > Student, > IIIT, Bangalore > > <ctacke/> wrote: > > I've not used the DSK driver to do this, so I'm not sure if that is how > > it > > work. Intuitively that sounds right, but to know for sure I'd go look > > in PB > > for examples that do use the driver and see what's going on there, or > > just > > try that with known data to see if it works. > > > This is especially true for Flahs, as it has to be put into write mode > > before a write occurs. Maybe the driver does that - maybe not. And if > > it's > > a TFAT system I'd be interested to see how that works. There are a > > whole > > lot of unknowns here without doing research, and all in all I can't see > > what > > good this is for anyway. For disk access there is a file system, and > > that's > > what you should be using. Doing direct reads and writes sounds like a > > recipe for a corrupt file system to me. > > > -- > > Chris Tacke > > OpenNETCF Consulting > > Managed Code in the Embedded World > >www.opennetcf.com > > -- > > > "Wrecked" <rithesh...(a)gmail.com> wrote in message > >news:1166458858.700982.36620(a)n67g2000cwd.googlegroups.com... > > > Chris, > > > After i pass the DSK1 to the ctor, let me know if this approach is > > > valid. To write/read to a specific location- > > > I open() it, then seek() to the required location and then use > > > read()/write() and then close() it. > > > > Thanks and Regards > > > Rithesh > > > Student, > > > IIIT, Bangalore > > > > <ctacke/> wrote: > > >> If you look at the StreamInterfaceDriver class, it's ctor takes a > > >> device > > >> prefix, which is what it passes to CreateFile. > > > >> I'd discourage using the PhysicalAddressPointer for a few reasons: > > >> 1. it circumvents any existing driver, so you could get conflicts > > >> 2. it's not supported in CE 6.0 > > >> 3. disks don't really work that way > > > >> -- > > >> Chris Tacke > > >> OpenNETCF Consulting > > >> Managed Code in the Embedded World > > >>www.opennetcf.com > > >> -- > > > >> "Wrecked" <rithesh...(a)gmail.com> wrote in message > > >>news:1166457040.808907.41090(a)79g2000cws.googlegroups.com... > > >> > 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...(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...(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);... > > read more �
From: Wrecked on 20 Dec 2006 02:35 Hello Chris, Thanks a lot for that posting. Regards, Rithesh Student IIIT, Bangalore <ctacke/> wrote: > Here's a better explanation: > > http://blog.opennetcf.org/ctacke/PermaLink,guid,4677c4fd-008a-4394-b571-a14123ce67d3.aspx > > -Chris > > > "Wrecked" <rithesh.rg(a)gmail.com> wrote in message > news:1166530336.578161.327650(a)n67g2000cwd.googlegroups.com... > Hello Chris, > Just out of curiosity how do u actually send back a string from > a evc++ dll to the managed code.. as an example i was trying to use the > following code which i had given above.. but i am getting not getting > any thing back > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > extern "C" _declspec(dllexport) unsigned char* WINAPI Read() > { > > unsigned char *lpOutBuf; > lpOutBuf = (unsigned char *)malloc(512); > memset(lpOutBuf, 0x97, 512); > return lpOutBuf; > > } > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > > and on the c# side i am importing as-- > > string t = Read(); > . > . > . > . > > [DllImport("SD_card_dll.dll",EntryPoint="Read")] > public static extern string Read(); > > > The code runs without any exceptions but it only returns a null... > > Whats wrong with the code.. or is there a better way to do it?? > > > Thanks and Regards, > Rithesh > Student, > IIIT, Bangalore > > > > On Dec 18, 10:56 pm, "Wrecked" <rithesh...(a)gmail.com> wrote: > > Chris, > > Thanks a lot for your help. I will keep you posted if this thing > > actually works.. else may be i will have to use the DLL approach. > > > > Thanks and regards, > > Rithesh > > Student, > > IIIT, Bangalore > > > > <ctacke/> wrote: > > > I've not used the DSK driver to do this, so I'm not sure if that is how > > > it > > > work. Intuitively that sounds right, but to know for sure I'd go look > > > in PB > > > for examples that do use the driver and see what's going on there, or > > > just > > > try that with known data to see if it works. > > > > > This is especially true for Flahs, as it has to be put into write mode > > > before a write occurs. Maybe the driver does that - maybe not. And if > > > it's > > > a TFAT system I'd be interested to see how that works. There are a > > > whole > > > lot of unknowns here without doing research, and all in all I can't see > > > what > > > good this is for anyway. For disk access there is a file system, and > > > that's > > > what you should be using. Doing direct reads and writes sounds like a > > > recipe for a corrupt file system to me. > > > > > -- > > > Chris Tacke > > > OpenNETCF Consulting > > > Managed Code in the Embedded World > > >www.opennetcf.com > > > -- > > > > > "Wrecked" <rithesh...(a)gmail.com> wrote in message > > >news:1166458858.700982.36620(a)n67g2000cwd.googlegroups.com... > > > > Chris, > > > > After i pass the DSK1 to the ctor, let me know if this approach is > > > > valid. To write/read to a specific location- > > > > I open() it, then seek() to the required location and then use > > > > read()/write() and then close() it. > > > > > > Thanks and Regards > > > > Rithesh > > > > Student, > > > > IIIT, Bangalore > > > > > > <ctacke/> wrote: > > > >> If you look at the StreamInterfaceDriver class, it's ctor takes a > > > >> device > > > >> prefix, which is what it passes to CreateFile. > > > > > >> I'd discourage using the PhysicalAddressPointer for a few reasons: > > > >> 1. it circumvents any existing driver, so you could get conflicts > > > >> 2. it's not supported in CE 6.0 > > > >> 3. disks don't really work that way > > > > > >> -- > > > >> Chris Tacke > > > >> OpenNETCF Consulting > > > >> Managed Code in the Embedded World > > > >>www.opennetcf.com > > > >> -- > > > > > >> "Wrecked" <rithesh...(a)gmail.com> wrote in message > > > >>news:1166457040.808907.41090(a)79g2000cws.googlegroups.com... > > > >> > 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...(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...(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);... > > > > read more »
First
|
Prev
|
Pages: 1 2 3 Prev: Install NETCFv2.wce4.ARMV4.cab in ROM Next: Monitor.Wait Workaround |