private static unsafe int DoBrowse(IntPtr aPtr, uint aVersion, char *aObjectID, char *aBrowseFlag, char *aFilter, uint aStartingIndex, uint aRequestedCount, char *aSortCriteria, char **aResult, uint *aNumberReturned, uint *aTotalMatches, uint *aUpdateID)
        {
            GCHandle gch = GCHandle.FromIntPtr(aPtr);
            DvServiceUpnpOrgContentDirectory3 self = (DvServiceUpnpOrgContentDirectory3)gch.Target;
            string objectID     = Marshal.PtrToStringAnsi((IntPtr)aObjectID);
            string browseFlag   = Marshal.PtrToStringAnsi((IntPtr)aBrowseFlag);
            string filter       = Marshal.PtrToStringAnsi((IntPtr)aFilter);
            string sortCriteria = Marshal.PtrToStringAnsi((IntPtr)aSortCriteria);
            string result;
            uint   numberReturned;
            uint   totalMatches;
            uint   updateID;

            self.Browse(aVersion, objectID, browseFlag, 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);
        }