/*********************************************************************** * CreateToolhelp32Snapshot (KERNEL32.@) */ HANDLE WINAPI CreateToolhelp32Snapshot( DWORD flags, DWORD process ) { SYSTEM_PROCESS_INFORMATION* spi = NULL; LDR_MODULE* mod = NULL; ULONG num_pcs, num_thd, num_mod; HANDLE hSnapShot = 0; TRACE("%x,%x\n", flags, process ); if (!(flags & (TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE))) { FIXME("flags %x not implemented\n", flags ); SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); return INVALID_HANDLE_VALUE; } if (fetch_module( process, flags, &mod, &num_mod ) && fetch_process_thread( flags, &spi, &num_pcs, &num_thd )) { ULONG sect_size; struct snapshot*snap; SECURITY_ATTRIBUTES sa; /* create & fill the snapshot section */ sect_size = sizeof(struct snapshot) - 1; /* for last data[1] */ if (flags & TH32CS_SNAPMODULE) sect_size += num_mod * sizeof(MODULEENTRY32W); if (flags & TH32CS_SNAPPROCESS) sect_size += num_pcs * sizeof(PROCESSENTRY32W); if (flags & TH32CS_SNAPTHREAD) sect_size += num_thd * sizeof(THREADENTRY32); if (flags & TH32CS_SNAPHEAPLIST)FIXME("Unimplemented: heap list snapshot\n"); sa.bInheritHandle = (flags & TH32CS_INHERIT) ? TRUE : FALSE; sa.lpSecurityDescriptor = NULL; hSnapShot = CreateFileMappingW( INVALID_HANDLE_VALUE, &sa, SEC_COMMIT | PAGE_READWRITE, 0, sect_size, NULL ); if (hSnapShot && (snap = MapViewOfFile( hSnapShot, FILE_MAP_ALL_ACCESS, 0, 0, 0 ))) { DWORD offset = 0; fill_module( snap, &offset, process, mod, num_mod ); fill_process( snap, &offset, spi, num_pcs ); fill_thread( snap, &offset, spi, num_thd ); UnmapViewOfFile( snap ); } } while (num_mod--) { HeapFree( GetProcessHeap(), 0, mod[num_mod].BaseDllName.Buffer ); HeapFree( GetProcessHeap(), 0, mod[num_mod].FullDllName.Buffer ); } HeapFree( GetProcessHeap(), 0, mod ); HeapFree( GetProcessHeap(), 0, spi ); if (!hSnapShot) return INVALID_HANDLE_VALUE; return hSnapShot; }
/* Executes the SQL CREATE queries, opens the sqlite * database connection and calls swill or pico_ql_test * depending on the compile flag TEST. */ int register_table(int argc, int view_index, const char **q, const char **sqlite_names, int port_number) { /* This definition implicitly constraints a table name * to 140 characters. It should be more than enough. */ char sqlite_query[200]; int re, i=0; sqlite3 *db; /* Virtual table schema will be in-memory and will not persist. Views can be included in the DSL */ re = sqlite3_open(":memory:", &db); if (re) { printf("can't open database\n"); sqlite3_close(db); return re; } #ifdef PICO_QL_DEBUG for (i = 0; i < argc; i++) { printf("\nquery to be executed: %s.\n", q[i]); } #endif sqlite3_module *mod; mod = (sqlite3_module *)sqlite3_malloc(sizeof(sqlite3_module)); fill_module(mod); int output = sqlite3_create_module(db, "PicoQL", mod, NULL); if (output == 1) printf("Error while registering module\n"); #ifdef PICO_QL_DEBUG else if (output == 0) printf("Module registered successfully\n"); #endif // sqlite3_create_function() calls for (i = 0; i < argc; i++) { char sqlite_type[10]; if (i < view_index) strcpy(sqlite_type, "table"); else strcpy(sqlite_type, "view"); sprintf(sqlite_query, "SELECT * FROM sqlite_master WHERE type='%s' AND name='%s';", sqlite_type, sqlite_names[i]); if (prep_exec(NULL, db, (const char *)sqlite_query, NULL) != SQLITE_ROW) { re = prep_exec(NULL, db, (const char *)q[i], NULL); #ifdef PICO_QL_DEBUG printf("Query %s returned %i\n", q[i], re); #endif if (re != 101) { printf("Extended error code: %i.\n", sqlite3_extended_errcode(db)); printf("Extended error message:\n%s.\n", sqlite3_errmsg(db)); return re; } } } start_serving(); #ifndef PICO_QL_TEST printf("Please visit http://localhost:%i to be served\n", port_number); call_swill(db, port_number); #else re = call_test(db); #endif sqlite3_free(mod); return re; }