site_archiver@lists.apple.com Delivered-To: darwin-kernel@lists.apple.com Hi Dan, I have make some changes in my code as follows. UserkernelShared.h includes the following structure. typedef struct MySampleStruct { UInt32 size; char* buff; } MySampleStruct; // these are the User Client method names enum { kMyUserClientOpen, kMyUserClientClose, kMyDoWrite, kMyDoRead, kMyNumberOfMethods }; In main function of userspace application i am calling the MyDoWrite function as follows kernResult = MyDoWrite(dataPort); if (kernResult != KERN_SUCCESS) { printf("\n kMyDoWrite returned %d\n", kernResult); fflush(stdout); } The definition of MyDoWrite is as follows. MyDoWrite(io_connect_t connect) { kern_return_t kernResult; MySampleStruct sampleStruct; char *buf; UInt32 size; size = kBufSize; //kBufSize = 512 buf = malloc(sizeof(char) * kBufSize); bzero(buf, sizeof(char) * kBufSize); strcpy(buf, "Hello MAC.OS.X"); sampleStruct.size = size; sampleStruct.buff = buf; IOByteCount structSize = sizeof(MySampleStruct); if (!connect) { return kIOReturnNoDevice; } else { kernResult = IOConnectMethodScalarIStructureI(connect, kMyDoWrite, 0, structSize, &sampleStruct ); } if (kernResult == kIOReturnSuccess) { printf("\n kMyDoWrite was successful..........\n"); } return kernResult; } My Userclient.h includes the following code. class com_MySoftwareCompany_MyUserClient : public IOUserClient //derived from IOUserClient IOService* fProvider; //previously i was mentioned //com_MySoftwareCompany_driver_MyFilterSchemeheme My Userclient.cpp includes the following code. IOExternalMethod * com_MySoftwareCompany_MyUserClient::getTargetAndMethodForIndex(IOService ** target, UInt32 index) { { // kMyDoWrite NULL, (IOMethod) &com_MySoftwareCompany_MyUserClient::myDoWrite, kIOUCScalarIStructI, 0, sizeof(MySampleStruct) },*/ } IOReturn com_MySoftwareCompany_MyUserClient::myDoWrite(MySampleStruct * vInStruct, UInt32 * structSize) { IOReturn retWrite = kIOReturnSuccess; char *buf; UInt32 Size; IOService* ffProvider; memset(buf, 0x0, 512); buf = vInStruct->buff; Size = vInStruct->size; if ( *structSize != sizeof(MySampleStruct)) return kIOReturnBadArgument; if (fProvider && !isInactive()) { IOMemoryDescriptor *mem = IOMemoryDescriptor::withAddress(buf, Size, kIODirectionOut, fTask); if (mem) { retWrite = mem->prepare(); if(kIOReturnSuccess == retWrite) { ffProvider = OSDynamicCast(com_MySoftwareCompany_driver_MyFilterScheme, fProvider); // is this a correct way of casting??? if (!ffProvider) { return false; } else { //retWrite = ffProvider->write(provider, 512, mem, completion); retWrite = ffProvider->DoDriverWrite(mem); } } mem->complete(); mem->release(); } else { retWrite = kIOReturnNoMemory; } release(); } else { retWrite = kIOReturnNotAttached; } if (kIOReturnSuccess != retWrite) { IOLog("\n myDoWrite returned = %d\n", retWrite); } return retWrite; } But i am still facing the same problem that "no matching function IOService::DoDriverWrite()" And if i have to call driver routine from my userclient how should i call them??? Thanks in Advance, Yogesh Pahilwan On Thu, 2005-03-31 at 02:44, Dan Markarian wrote:
Hi Parav,
I believe I see the disconnect. I saw MySampleStruct and was under the impression that MySampleStruct is what carries the "buf" address and the "buf" size into the kernel. It seems, rather, that it passes the "buf" address and "buf" size as a variable-size structure across the user client interface. You might wish to note that technique is limited to 4 kB, I believe, and does involve a copy across the kernel boundary. I am not sure what the problem is though offhand. It might be one of:
size = kBufSize;
size = 1024;
bzero(buf, sizeof(char) * 1048576);
bzero(buf, sizeof(char) * 1024);
IOMemoryDescriptor *mem = IOMemoryDescriptor::withAddress(buf, 1024, kIODirectionOut);
IOMemoryDescriptor *mem = IOMemoryDescriptor::withAddress(buf, size, kIODirectionOut);
Dan
On 30 Mar 2005, at 12:44 PM, Parav Pandit wrote:
com_MySoftwareCompany_driver_MyFilterScheme* fProvider;
I am sorry, I haven't look the code properly. you have fProvider of your filterScheme class.
fTask would tell to map in kernel userClient context for calling task - fTask but than how this would solve the problem of calling the driver function?
Please help me to understand. fTask is the application task which has made the code to driver. is this correct? We need to share memory between kernel task and user space, so why to give fTask rather than kernel_task? I couldn't find the answer from the Writing custom user client docuement.
Regards, Parav Pandit
Dan Markarian <markarian@apple.com> wrote: Hi Yogesh,
IOMemoryDescriptor *mem = IOMemoryDescriptor::withAddress(buf, 1024, kIODirectionOut);
IOMemoryDescriptor *mem = IOMemoryDescriptor::withAddress(buf, 1024, kIODirectionOut, fTask);
Dan
On 30 Mar 2005, at 7:54 AM, Yogesh P wrote:
Hi folks, I have written a filter scheme driver,userclient and userspace application tool for doing read/write operations on IOMedia partitions.
I have successfully send a structure from userspace to kernelspace through userclient.But when i try to read/write a buffer from userspace to kernel space,i am not able to map userspace buffer to kernel address space. I am specifying my code here. UserkernelShared.h includes the following structure. typedef struct MySampleStruct ! { UInt32 size; void* buff; } MySampleStruct; In main function of userspace application i am calling the SPSOFT_Write function as follows. char *buf; UInt32 size; size = kBufSize; buf = malloc(sizeof(char) * 1024); bzero(buf, sizeof(char) * 1048576); strcpy(buf, " Hello MACOSX");
I want to write this "buf" to the disk through userclient.
// This shows an example of calling a user client's open method. kernResult = MyDoWrite(dataPort, buf, size); if (kernResult != KERN_SUCCESS) { printf("\n kMyDoWrite returned %d\n", kernResult); // This closes the connection to our user client and destroys the connect handle. IOServiceClose(dataPort); return 0; }
The definition of MyDoWrite is as follows. kern_return_t MyDoWrite(io_connect_t connect, void *buf, UInt32 size) { kern_return_t kernResult; if (!connect){ return kIOReturnNoDevice; } else { kernResult = IOConnectMethodScalarIStructureI(connect, kMyDoWrite, 0, size, buf ); } if (kernResult == kIOReturnSuccess){ printf("\n kMyDoWrite was successful..........\n"); } return kernResult; } My Userclient.h and Userclient.cpp includes the following code.
com_MySoftwareCompany_driver_MyFilterScheme* fProvider;
IOExternalMethod * com_MySoftwareCompany_MyUserClient::getTargetAndMethodForIndex (IOService ** target, UInt32 index) { { // kMyDoWrite NULL, (IOMethod) &com_MySoftwareCompany_MyUserClient::myDoWrite, kIOUCScalarIStructI, 0, 0xffffffff }, } IOReturn com_MySoftwareCompany_MyUserClient::myDoWrite(void* buf, UInt32 size) { IOReturn retWrite = kIOReturnSuccess; UInt32 Size = size; if (fProvider && !isInactive()){ IOMemoryDescriptor *mem = IOMemoryDescriptor::withAddress(buf, 1024, kIODirectionOut); if (mem){ retWrite = mem->prepare(); if(kIOReturnSuccess == retWrite){ retWrite = fProvider->myDoWrite (mem,Size); //when i call this driver function it gives me the error as IOService::fProvider has no function myDoWrite. } mem->complete(); mem->release(); }else{ retWrite = kIOReturnNoMemory; } release(); }
How should i call the filter scheme driver read/write routines from my userclient?? Or is there any sample code of read/write for filter scheme driver???
Any help, certainly help me in solving this problem. Thanks! in advance. Yogesh Pahilwan
_______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-kernel mailing list (Darwin-kernel@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/darwin-kernel/markarian% 40apple.com
This email sent to markarian@apple.com
_______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-kernel mailing list (Darwin-kernel@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/darwin-kernel/parav_pandit% 40yahoo.co.in
This email sent to parav_pandit@yahoo.co.in Yahoo! India Matrimony: Find your life partner online.
----
_______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-kernel mailing list (Darwin-kernel@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/darwin-kernel/sayyad.asif%40spsoftind...
This email sent to sayyad.asif@spsoftindia.com
_______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-kernel mailing list (Darwin-kernel@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/darwin-kernel/site_archiver%40lists.a... This email sent to site_archiver@lists.apple.com
participants (1)
-
Yogesh P