- pingMsg->msgHdr.msgh_size = msgSize - pingMsg->notifyHeader.size
- + sizeof( IOServiceInterestContent64 )
- - sizeof( data->messageArgument)
- + argSize;
+ thisMsgSize = msgSize
+ + sizeof( IOServiceInterestContent64 )
+ - sizeof( data->messageArgument)
+ + argSize;
+
+ if (thisMsgSize > sizeof(stackMsg))
+ {
+ allocMsg = IOMalloc(thisMsgSize);
+ if (!allocMsg) return (kIOReturnNoMemory);
+ thisMsg = (typeof(thisMsg)) allocMsg;
+ }
+ else
+ {
+ allocMsg = 0;
+ thisMsg = (typeof(thisMsg)) stackMsg;
+ }
+
+ bcopy(pingMsg, thisMsg, msgSize);
+ thisMsg->notifyHeader.type = type;
+ data = (IOServiceInterestContent64 *) (((uint8_t *) thisMsg) + msgSize);
+ // == pingMsg->notifyHeader.content;
+ data->messageType = messageType;
+
+ if (callerArgSize == 0)
+ {
+ data->messageArgument[0] = (io_user_reference_t) messageArgument;
+ if (!clientIs64)
+ {
+ data->messageArgument[0] |= (data->messageArgument[0] << 32);
+ }
+ }
+ else
+ {
+ bcopy( messageArgument, data->messageArgument, callerArgSize );
+ bzero((void *)(((uintptr_t) &data->messageArgument[0]) + callerArgSize), argSize - callerArgSize);
+ }
+
+ thisMsg->notifyHeader.type = type;
+ thisMsg->msgHdr.msgh_size = thisMsgSize;