private static unsafe int DoSearch(IntPtr aPtr, uint aVersion, char *aContainerID, char *aSearchCriteria, char *aFilter, uint aStartingIndex, uint aRequestedCount, char *aSortCriteria, char **aResult, uint *aNumberReturned, uint *aTotalMatches, uint *aUpdateID)
        {
            GCHandle gch = GCHandle.FromIntPtr(aPtr);
            DvServiceUpnpOrgContentDirectory1 self = (DvServiceUpnpOrgContentDirectory1)gch.Target;
            string containerID    = Marshal.PtrToStringAnsi((IntPtr)aContainerID);
            string searchCriteria = Marshal.PtrToStringAnsi((IntPtr)aSearchCriteria);
            string filter         = Marshal.PtrToStringAnsi((IntPtr)aFilter);
            string sortCriteria   = Marshal.PtrToStringAnsi((IntPtr)aSortCriteria);
            string result;
            uint   numberReturned;
            uint   totalMatches;
            uint   updateID;

            self.Search(aVersion, containerID, searchCriteria, filter, aStartingIndex, aRequestedCount, sortCriteria, out result, out numberReturned, out totalMatches, out updateID);
            *aResult         = (char *)Marshal.StringToHGlobalAnsi(result).ToPointer();
            *aNumberReturned = numberReturned;
            *aTotalMatches   = totalMatches;
            *aUpdateID       = updateID;
            return(0);
        }