/* call the driver init entry point */ static NTSTATUS init_driver( HMODULE module, UNICODE_STRING *keyname ) { unsigned int i; NTSTATUS status; const IMAGE_NT_HEADERS *nt = RtlImageNtHeader( module ); if (!nt->OptionalHeader.AddressOfEntryPoint) return STATUS_SUCCESS; driver_obj.Size = sizeof(driver_obj); driver_obj.DriverSection = find_ldr_module( module ); driver_obj.DriverInit = (PDRIVER_INITIALIZE)((char *)module + nt->OptionalHeader.AddressOfEntryPoint); driver_obj.DriverExtension = &driver_extension; driver_extension.DriverObject = &driver_obj; driver_extension.ServiceKeyName = *keyname; if (WINE_TRACE_ON(relay)) WINE_DPRINTF( "%04x:Call driver init %p (obj=%p,str=%s)\n", GetCurrentThreadId(), driver_obj.DriverInit, &driver_obj, wine_dbgstr_w(keyname->Buffer) ); status = driver_obj.DriverInit( &driver_obj, keyname ); if (WINE_TRACE_ON(relay)) WINE_DPRINTF( "%04x:Ret driver init %p (obj=%p,str=%s) retval=%08x\n", GetCurrentThreadId(), driver_obj.DriverInit, &driver_obj, wine_dbgstr_w(keyname->Buffer), status ); WINE_TRACE( "init done for %s obj %p\n", wine_dbgstr_w(driver_name), &driver_obj ); WINE_TRACE( "- DriverInit = %p\n", driver_obj.DriverInit ); WINE_TRACE( "- DriverStartIo = %p\n", driver_obj.DriverStartIo ); WINE_TRACE( "- DriverUnload = %p\n", driver_obj.DriverUnload ); for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) WINE_TRACE( "- MajorFunction[%d] = %p\n", i, driver_obj.MajorFunction[i] ); return status; }
/********************************************************************** * COMCAT_ICatInformation_IsClassOfCategories */ static HRESULT WINAPI COMCAT_ICatInformation_IsClassOfCategories( LPCATINFORMATION iface, REFCLSID rclsid, ULONG cImplemented, CATID *rgcatidImpl, ULONG cRequired, CATID *rgcatidReq) { /* ICOM_THIS_MULTI(ComCatMgrImpl, infVtbl, iface); */ WCHAR keyname[45] = { 'C', 'L', 'S', 'I', 'D', '\\', 0 }; HRESULT res; struct class_categories *categories; HKEY key; if (WINE_TRACE_ON(ole)) { ULONG count; TRACE("\n\tCLSID:\t%s\n\tImplemented %u\n",debugstr_guid(rclsid),cImplemented); for (count = 0; count < cImplemented; ++count) TRACE("\t\t%s\n",debugstr_guid(&rgcatidImpl[count])); TRACE("\tRequired %u\n",cRequired); for (count = 0; count < cRequired; ++count) TRACE("\t\t%s\n",debugstr_guid(&rgcatidReq[count])); } if ((cImplemented && rgcatidImpl == NULL) || (cRequired && rgcatidReq == NULL)) return E_POINTER; res = StringFromGUID2(rclsid, keyname + 6, 39); if (FAILED(res)) return res; categories = COMCAT_PrepareClassCategories(cImplemented, rgcatidImpl, cRequired, rgcatidReq); if (categories == NULL) return E_OUTOFMEMORY; res = RegOpenKeyExW(HKEY_CLASSES_ROOT, keyname, 0, KEY_READ, &key); if (res == ERROR_SUCCESS) { res = COMCAT_IsClassOfCategories(key, categories); RegCloseKey(key); } else res = S_FALSE; HeapFree(GetProcessHeap(), 0, categories); return res; }
/*********************************************************************** * main */ int main( int argc, char *argv[] ) { DWORD count; HINSTANCE16 instance; LOADPARAMS16 params; WORD showCmd[2]; char buffer[MAX_PATH]; STARTUPINFOA info; char *cmdline, *appname, **first_arg; char *p; if (!argv[1]) usage(); if (!strcmp( argv[1], "--app-name" )) { if (!(appname = argv[2])) usage(); first_arg = argv + 3; } else { if (!SearchPathA( NULL, argv[1], ".exe", sizeof(buffer), buffer, NULL )) { WINE_MESSAGE( "winevdm: unable to exec '%s': file not found\n", argv[1] ); ExitProcess(1); } appname = buffer; first_arg = argv + 1; } if (*first_arg) first_arg++; /* skip program name */ cmdline = build_command_line( first_arg ); if (WINE_TRACE_ON(winevdm)) { int i; WINE_TRACE( "GetCommandLine = '%s'\n", GetCommandLineA() ); WINE_TRACE( "appname = '%s'\n", appname ); WINE_TRACE( "cmdline = '%.*s'\n", cmdline[0], cmdline+1 ); for (i = 0; argv[i]; i++) WINE_TRACE( "argv[%d]: '%s'\n", i, argv[i] ); } GetStartupInfoA( &info ); showCmd[0] = 2; showCmd[1] = (info.dwFlags & STARTF_USESHOWWINDOW) ? info.wShowWindow : SW_SHOWNORMAL; params.hEnvironment = 0; params.cmdLine = MapLS( cmdline ); params.showCmd = MapLS( showCmd ); params.reserved = 0; RestoreThunkLock(1); /* grab the Win16 lock */ /* some programs assume mmsystem is always present */ LoadLibrary16( "gdi.exe" ); LoadLibrary16( "user.exe" ); LoadLibrary16( "mmsystem.dll" ); if ((instance = LoadModule16( appname, ¶ms )) < 32) { if (instance == 11) { /* first see if it is a .pif file */ if( ( p = strrchr( appname, '.' )) && !strcasecmp( p, ".pif")) pif_cmd( appname, cmdline + 1); else { /* try DOS format */ /* loader expects arguments to be regular C strings */ start_dos_exe( appname, cmdline + 1 ); } /* if we get back here it failed */ instance = GetLastError(); } WINE_MESSAGE( "winevdm: can't exec '%s': ", appname ); switch (instance) { case 2: WINE_MESSAGE("file not found\n" ); break; case 11: WINE_MESSAGE("invalid program file\n" ); break; default: WINE_MESSAGE("error=%d\n", instance ); break; } ExitProcess(instance); } /* wait forever; the process will be killed when the last task exits */ ReleaseThunkLock( &count ); Sleep( INFINITE ); return 0; }
cudaError_t WINAPI wine_cudaLaunch(const char *entry) { WINE_TRACE("%p\n", entry); if (QUEUE_MAX == numQueued) { cudaError_t evtErr; if (WINE_TRACE_ON(cuda)) { /* print out if event was recorded or not */ WINE_TRACE("check event recorded %s\n", debug_cudaError(cudaEventQuery(event))); } /* wait for event */ unsigned int sleepCount = 0; char * SLTIME = getenv("SLEEPTIME"); if ( SLTIME == NULL ) { sleep = 300000; } else { sleep = atoi ( SLTIME ); } while (cudaEventQuery(event) != cudaSuccess) { nanosleep(sleep, NULL); sleepCount++; } WINE_TRACE("slept %u times\n", sleepCount); WINE_TRACE("event recorded, continuing\n"); /* record a new event and subtract HALF_QUEUE_MAX from numQueued */ numQueued = HALF_QUEUE_MAX; evtErr = cudaEventRecord(event, 0); if (evtErr) { WINE_ERR("cudaEventRecord: %s\n", debug_cudaError(evtErr)); } } cudaError_t err = cudaLaunch(entry); if (!eventInitialized) { /* Create an event on the first cudaLaunch call. This is done here so the calling program * has a chance to select the GPU device with cudaSetDevice if desired. */ cudaError_t evtErr = cudaEventCreate(&event); if (evtErr) { WINE_ERR("cudaEventCreate: %s\n", debug_cudaError(evtErr)); } /* cudaEventCreate can WINE_TRACE("\n"); return errors from previous asynchronous calls, so an error here does * not necessarily mean the event wasn't created. Assume it was created for now. */ eventInitialized = TRUE; WINE_TRACE("created event %d\n", event); } /* record an event at HALF_QUEUE_MAX */ if (HALF_QUEUE_MAX == ++numQueued) { cudaError_t evtErr = cudaEventRecord(event, 0); /* Assuming everything using stream 0 */ if (evtErr) { WINE_ERR("cudaEventRecord: %s\n", debug_cudaError(evtErr)); } } if (err) { WINE_TRACE("return %s\n", debug_cudaError(err)); } return err; }