From a1608caf319b5ef55e5e28b71efeb0832fb86934 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 6 Feb 2010 21:28:28 +0000 Subject: [PATCH 01/97] [MSI] sync msi to wine 1.1.38 svn path=/trunk/; revision=45468 --- reactos/dll/win32/msi/action.c | 469 +++++++++++++++++++++-------- reactos/dll/win32/msi/appsearch.c | 2 +- reactos/dll/win32/msi/automation.c | 20 ++ reactos/dll/win32/msi/cond.tab.c | 250 +++++++++------ reactos/dll/win32/msi/cond.tab.h | 2 +- reactos/dll/win32/msi/cond.y | 122 ++++++-- reactos/dll/win32/msi/custom.c | 24 +- reactos/dll/win32/msi/database.c | 8 +- reactos/dll/win32/msi/dialog.c | 55 +++- reactos/dll/win32/msi/events.c | 23 ++ reactos/dll/win32/msi/files.c | 3 +- reactos/dll/win32/msi/helpers.c | 232 -------------- reactos/dll/win32/msi/join.c | 121 +++++++- reactos/dll/win32/msi/msi.rc | 1 + reactos/dll/win32/msi/msi_Uk.rc | 41 +++ reactos/dll/win32/msi/msipriv.h | 1 - reactos/dll/win32/msi/msiquery.c | 2 +- reactos/dll/win32/msi/package.c | 233 +++++++++++++- reactos/dll/win32/msi/storages.c | 4 +- reactos/dll/win32/msi/streams.c | 73 +++-- reactos/include/psdk/msi.h | 4 + 21 files changed, 1160 insertions(+), 530 deletions(-) create mode 100644 reactos/dll/win32/msi/msi_Uk.rc diff --git a/reactos/dll/win32/msi/action.c b/reactos/dll/win32/msi/action.c index 79047704173..d94d842cae1 100644 --- a/reactos/dll/win32/msi/action.c +++ b/reactos/dll/win32/msi/action.c @@ -959,10 +959,6 @@ UINT msi_create_component_directories( MSIPACKAGE *package ) return ERROR_SUCCESS; } -/* - * Also we cannot enable/disable components either, so for now I am just going - * to do all the directories for all the components. - */ static UINT ACTION_CreateFolders(MSIPACKAGE *package) { static const WCHAR ExecSeqQuery[] = @@ -981,7 +977,60 @@ static UINT ACTION_CreateFolders(MSIPACKAGE *package) rc = MSI_IterateRecords(view, NULL, ITERATE_CreateFolders, package); msiobj_release(&view->hdr); - msi_create_component_directories( package ); + return rc; +} + +static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param ) +{ + MSIPACKAGE *package = param; + LPCWSTR dir; + LPWSTR full_path; + MSIRECORD *uirow; + MSIFOLDER *folder; + + dir = MSI_RecordGetString( row, 1 ); + if (!dir) + { + ERR("Unable to get folder id\n"); + return ERROR_SUCCESS; + } + + full_path = resolve_folder( package, dir, FALSE, FALSE, TRUE, &folder ); + if (!full_path) + { + ERR("Unable to resolve folder id %s\n", debugstr_w(dir)); + return ERROR_SUCCESS; + } + + TRACE("folder is %s\n", debugstr_w(full_path)); + + uirow = MSI_CreateRecord( 1 ); + MSI_RecordSetStringW( uirow, 1, full_path ); + ui_actiondata( package, szRemoveFolders, uirow ); + msiobj_release( &uirow->hdr ); + + RemoveDirectoryW( full_path ); + folder->State = 0; + + msi_free( full_path ); + return ERROR_SUCCESS; +} + +static UINT ACTION_RemoveFolders( MSIPACKAGE *package ) +{ + static const WCHAR query[] = + {'S','E','L','E','C','T',' ', '`','D','i','r','e','c','t','o','r','y','_','`', + ' ','F','R','O','M',' ', '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0}; + + MSIQUERY *view; + UINT rc; + + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (rc != ERROR_SUCCESS) + return ERROR_SUCCESS; + + rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveFolders, package ); + msiobj_release( &view->hdr ); return rc; } @@ -1562,8 +1611,10 @@ static BOOL process_state_property(MSIPACKAGE* package, int level, while (ptr) { - if ((ptr2 && strncmpW(ptr,feature->Feature, ptr2-ptr)==0) - || (!ptr2 && strcmpW(ptr,feature->Feature)==0)) + int len = ptr2 - ptr; + + if ((ptr2 && strlenW(feature->Feature) == len && !strncmpW(ptr, feature->Feature, len)) + || (!ptr2 && !strcmpW(ptr, feature->Feature))) { msi_feature_set_state(package, feature, state); break; @@ -1583,55 +1634,57 @@ static BOOL process_state_property(MSIPACKAGE* package, int level, return TRUE; } -UINT MSI_SetFeatureStates(MSIPACKAGE *package) +static BOOL process_overrides( MSIPACKAGE *package, int level ) { - int level; - static const WCHAR szlevel[] = - {'I','N','S','T','A','L','L','L','E','V','E','L',0}; static const WCHAR szAddLocal[] = {'A','D','D','L','O','C','A','L',0}; static const WCHAR szAddSource[] = {'A','D','D','S','O','U','R','C','E',0}; static const WCHAR szAdvertise[] = {'A','D','V','E','R','T','I','S','E',0}; - BOOL override = FALSE; + BOOL ret = FALSE; + + /* all these activation/deactivation things happen in order and things + * later on the list override things earlier on the list. + * + * 0 INSTALLLEVEL processing + * 1 ADDLOCAL + * 2 REMOVE + * 3 ADDSOURCE + * 4 ADDDEFAULT + * 5 REINSTALL + * 6 ADVERTISE + * 7 COMPADDLOCAL + * 8 COMPADDSOURCE + * 9 FILEADDLOCAL + * 10 FILEADDSOURCE + * 11 FILEADDDEFAULT + */ + ret |= process_state_property( package, level, szAddLocal, INSTALLSTATE_LOCAL ); + ret |= process_state_property( package, level, szRemove, INSTALLSTATE_ABSENT ); + ret |= process_state_property( package, level, szAddSource, INSTALLSTATE_SOURCE ); + ret |= process_state_property( package, level, szReinstall, INSTALLSTATE_UNKNOWN ); + ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED ); + + if (ret) + MSI_SetPropertyW( package, szPreselected, szOne ); + + return ret; +} + +UINT MSI_SetFeatureStates(MSIPACKAGE *package) +{ + int level; + static const WCHAR szlevel[] = + {'I','N','S','T','A','L','L','L','E','V','E','L',0}; MSICOMPONENT* component; MSIFEATURE *feature; - - /* I do not know if this is where it should happen.. but */ - TRACE("Checking Install Level\n"); level = msi_get_property_int(package, szlevel, 1); - /* ok here is the _real_ rub - * all these activation/deactivation things happen in order and things - * later on the list override things earlier on the list. - * 0) INSTALLLEVEL processing - * 1) ADDLOCAL - * 2) REMOVE - * 3) ADDSOURCE - * 4) ADDDEFAULT - * 5) REINSTALL - * 6) ADVERTISE - * 7) COMPADDLOCAL - * 8) COMPADDSOURCE - * 9) FILEADDLOCAL - * 10) FILEADDSOURCE - * 11) FILEADDDEFAULT - * - * I am still ignoring a lot of these. But that is ok for now, ADDLOCAL and - * REMOVE are the big ones, since we don't handle administrative installs - * yet anyway. - */ - override |= process_state_property(package, level, szAddLocal, INSTALLSTATE_LOCAL); - override |= process_state_property(package, level, szRemove, INSTALLSTATE_ABSENT); - override |= process_state_property(package, level, szAddSource, INSTALLSTATE_SOURCE); - override |= process_state_property(package, level, szReinstall, INSTALLSTATE_UNKNOWN); - override |= process_state_property(package, level, szAdvertise, INSTALLSTATE_ADVERTISED); - - if (!override) + if (!msi_get_property_int( package, szPreselected, 0 )) { LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) { @@ -1661,8 +1714,6 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) msi_feature_set_state(package, fl->feature, INSTALLSTATE_UNKNOWN); } } - else - MSI_SetPropertyW(package, szPreselected, szOne); /* * now we want to enable or disable components base on feature @@ -1961,7 +2012,7 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package) static const WCHAR szOutOfDiskSpace[] = {'O','u','t','O','f','D','i','s','k','S','p','a','c','e',0}; MSICOMPONENT *comp; - UINT rc; + UINT rc = ERROR_SUCCESS; MSIQUERY * view; LPWSTR level; @@ -1982,26 +2033,28 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package) TRACE("File calculations\n"); msi_check_file_install_states( package ); - TRACE("Evaluating Condition Table\n"); - - rc = MSI_DatabaseOpenViewW(package->db, ConditionQuery, &view); - if (rc == ERROR_SUCCESS) + if (!process_overrides( package, msi_get_property_int( package, szlevel, 1 ) )) { - rc = MSI_IterateRecords(view, NULL, ITERATE_CostFinalizeConditions, - package); - msiobj_release(&view->hdr); - } + TRACE("Evaluating Condition Table\n"); - TRACE("Enabling or Disabling Components\n"); - LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) - { - if (MSI_EvaluateConditionW(package, comp->Condition) == MSICONDITION_FALSE) + rc = MSI_DatabaseOpenViewW( package->db, ConditionQuery, &view ); + if (rc == ERROR_SUCCESS) { - TRACE("Disabling component %s\n", debugstr_w(comp->Component)); - comp->Enabled = FALSE; + rc = MSI_IterateRecords( view, NULL, ITERATE_CostFinalizeConditions, package ); + msiobj_release( &view->hdr ); + } + + TRACE("Enabling or Disabling Components\n"); + LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) + { + if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE) + { + TRACE("Disabling component %s\n", debugstr_w(comp->Component)); + comp->Enabled = FALSE; + } + else + comp->Enabled = TRUE; } - else - comp->Enabled = TRUE; } MSI_SetPropertyW(package,szCosting,szOne); @@ -3652,6 +3705,89 @@ static UINT ACTION_SelfRegModules(MSIPACKAGE *package) return ERROR_SUCCESS; } +static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) +{ + static const WCHAR regsvr32[] = + {'r','e','g','s','v','r','3','2','.','e','x','e',' ','/','u',' ','\"',0}; + static const WCHAR close[] = {'\"',0}; + MSIPACKAGE *package = param; + LPCWSTR filename; + LPWSTR cmdline; + MSIFILE *file; + DWORD len; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + BOOL ret; + MSIRECORD *uirow; + LPWSTR uipath, p; + + memset( &si, 0, sizeof(STARTUPINFOW) ); + + filename = MSI_RecordGetString( row, 1 ); + file = get_loaded_file( package, filename ); + + if (!file) + { + ERR("Unable to find file id %s\n", debugstr_w(filename)); + return ERROR_SUCCESS; + } + + len = strlenW( regsvr32 ) + strlenW( file->TargetPath ) + 2; + + cmdline = msi_alloc( len * sizeof(WCHAR) ); + strcpyW( cmdline, regsvr32 ); + strcatW( cmdline, file->TargetPath ); + strcatW( cmdline, close ); + + TRACE("Unregistering %s\n", debugstr_w(cmdline)); + + ret = CreateProcessW( NULL, cmdline, NULL, NULL, FALSE, 0, NULL, c_colon, &si, &pi ); + if (ret) + { + CloseHandle( pi.hThread ); + msi_dialog_check_messages( pi.hProcess ); + CloseHandle( pi.hProcess ); + } + + msi_free( cmdline ); + + uirow = MSI_CreateRecord( 2 ); + uipath = strdupW( file->TargetPath ); + if ((p = strrchrW( uipath, '\\' ))) + { + *p = 0; + MSI_RecordSetStringW( uirow, 1, ++p ); + } + MSI_RecordSetStringW( uirow, 2, uipath ); + ui_actiondata( package, szSelfUnregModules, uirow ); + msiobj_release( &uirow->hdr ); + msi_free( uipath ); + /* FIXME call ui_progress? */ + + return ERROR_SUCCESS; +} + +static UINT ACTION_SelfUnregModules( MSIPACKAGE *package ) +{ + UINT rc; + MSIQUERY *view; + static const WCHAR query[] = + {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','S','e','l','f','R','e','g','`',0}; + + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (rc != ERROR_SUCCESS) + { + TRACE("no SelfReg table\n"); + return ERROR_SUCCESS; + } + + MSI_IterateRecords( view, NULL, ITERATE_SelfUnregModules, package ); + msiobj_release( &view->hdr ); + + return ERROR_SUCCESS; +} + static UINT ACTION_PublishFeatures(MSIPACKAGE *package) { MSIFEATURE *feature; @@ -4462,8 +4598,8 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param) MSIPACKAGE *package = param; MSICOMPONENT *comp; SC_HANDLE scm, service = NULL; - LPCWSTR name, *vector = NULL; - LPWSTR args; + LPCWSTR *vector = NULL; + LPWSTR name, args; DWORD event, numargs; UINT r = ERROR_FUNCTION_FAILED; @@ -4471,9 +4607,9 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param) if (!comp || comp->Action == INSTALLSTATE_UNKNOWN || comp->Action == INSTALLSTATE_ABSENT) return ERROR_SUCCESS; - name = MSI_RecordGetString(rec, 2); + deformat_string(package, MSI_RecordGetString(rec, 2), &name); + deformat_string(package, MSI_RecordGetString(rec, 4), &args); event = MSI_RecordGetInteger(rec, 3); - args = strdupW(MSI_RecordGetString(rec, 4)); if (!(event & msidbServiceControlEventStart)) return ERROR_SUCCESS; @@ -4488,15 +4624,16 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param) service = OpenServiceW(scm, name, SERVICE_START); if (!service) { - ERR("Failed to open service %s\n", debugstr_w(name)); + ERR("Failed to open service %s (%u)\n", debugstr_w(name), GetLastError()); goto done; } vector = msi_service_args_to_vector(args, &numargs); - if (!StartServiceW(service, numargs, vector)) + if (!StartServiceW(service, numargs, vector) && + GetLastError() != ERROR_SERVICE_ALREADY_RUNNING) { - ERR("Failed to start service %s\n", debugstr_w(name)); + ERR("Failed to start service %s (%u)\n", debugstr_w(name), GetLastError()); goto done; } @@ -4506,6 +4643,7 @@ done: CloseServiceHandle(service); CloseServiceHandle(scm); + msi_free(name); msi_free(args); msi_free(vector); return r; @@ -4570,27 +4708,12 @@ error: return FALSE; } -static UINT ITERATE_StopService(MSIRECORD *rec, LPVOID param) +static UINT stop_service( LPCWSTR name ) { - MSIPACKAGE *package = param; - MSICOMPONENT *comp; + SC_HANDLE scm = NULL, service = NULL; SERVICE_STATUS status; SERVICE_STATUS_PROCESS ssp; - SC_HANDLE scm = NULL, service = NULL; - LPWSTR name, args; - DWORD event, needed; - - event = MSI_RecordGetInteger(rec, 3); - if (!(event & msidbServiceControlEventStop)) - return ERROR_SUCCESS; - - comp = get_loaded_component(package, MSI_RecordGetString(rec, 6)); - if (!comp || comp->Action == INSTALLSTATE_UNKNOWN || comp->Action == INSTALLSTATE_ABSENT) - return ERROR_SUCCESS; - - deformat_string(package, MSI_RecordGetString(rec, 2), &name); - deformat_string(package, MSI_RecordGetString(rec, 4), &args); - args = strdupW(MSI_RecordGetString(rec, 4)); + DWORD needed; scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!scm) @@ -4605,16 +4728,14 @@ static UINT ITERATE_StopService(MSIRECORD *rec, LPVOID param) SERVICE_ENUMERATE_DEPENDENTS); if (!service) { - WARN("Failed to open service (%s): %d\n", - debugstr_w(name), GetLastError()); + WARN("Failed to open service (%s): %d\n", debugstr_w(name), GetLastError()); goto done; } if (!QueryServiceStatusEx(service, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &needed)) { - WARN("Failed to query service status (%s): %d\n", - debugstr_w(name), GetLastError()); + WARN("Failed to query service status (%s): %d\n", debugstr_w(name), GetLastError()); goto done; } @@ -4629,8 +4750,28 @@ static UINT ITERATE_StopService(MSIRECORD *rec, LPVOID param) done: CloseServiceHandle(service); CloseServiceHandle(scm); - msi_free(name); - msi_free(args); + + return ERROR_SUCCESS; +} + +static UINT ITERATE_StopService( MSIRECORD *rec, LPVOID param ) +{ + MSIPACKAGE *package = param; + MSICOMPONENT *comp; + LPWSTR name; + DWORD event; + + event = MSI_RecordGetInteger( rec, 3 ); + if (!(event & msidbServiceControlEventStop)) + return ERROR_SUCCESS; + + comp = get_loaded_component( package, MSI_RecordGetString( rec, 6 ) ); + if (!comp || comp->Action == INSTALLSTATE_UNKNOWN || comp->Action == INSTALLSTATE_ABSENT) + return ERROR_SUCCESS; + + deformat_string( package, MSI_RecordGetString( rec, 2 ), &name ); + stop_service( name ); + msi_free( name ); return ERROR_SUCCESS; } @@ -4654,6 +4795,69 @@ static UINT ACTION_StopServices( MSIPACKAGE *package ) return rc; } +static UINT ITERATE_DeleteService( MSIRECORD *rec, LPVOID param ) +{ + MSIPACKAGE *package = param; + MSICOMPONENT *comp; + LPWSTR name = NULL; + DWORD event; + SC_HANDLE scm = NULL, service = NULL; + + event = MSI_RecordGetInteger( rec, 3 ); + if (!(event & msidbServiceControlEventDelete)) + return ERROR_SUCCESS; + + comp = get_loaded_component( package, MSI_RecordGetString(rec, 6) ); + if (!comp || comp->Action == INSTALLSTATE_UNKNOWN || comp->Action == INSTALLSTATE_ABSENT) + return ERROR_SUCCESS; + + deformat_string( package, MSI_RecordGetString(rec, 2), &name ); + stop_service( name ); + + scm = OpenSCManagerW( NULL, NULL, SC_MANAGER_ALL_ACCESS ); + if (!scm) + { + WARN("Failed to open the SCM: %d\n", GetLastError()); + goto done; + } + + service = OpenServiceW( scm, name, DELETE ); + if (!service) + { + WARN("Failed to open service (%s): %u\n", debugstr_w(name), GetLastError()); + goto done; + } + + if (!DeleteService( service )) + WARN("Failed to delete service (%s): %u\n", debugstr_w(name), GetLastError()); + +done: + CloseServiceHandle( service ); + CloseServiceHandle( scm ); + msi_free( name ); + + return ERROR_SUCCESS; +} + +static UINT ACTION_DeleteServices( MSIPACKAGE *package ) +{ + UINT rc; + MSIQUERY *view; + + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0 }; + + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (rc != ERROR_SUCCESS) + return ERROR_SUCCESS; + + rc = MSI_IterateRecords( view, NULL, ITERATE_DeleteService, package ); + msiobj_release( &view->hdr ); + + return rc; +} + static MSIFILE *msi_find_file( MSIPACKAGE *package, LPCWSTR filename ) { MSIFILE *file; @@ -4922,16 +5126,30 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags ) LPCWSTR ptr = *value; if (!strncmpW(ptr, prefix, prefix_len)) { - *flags |= ENV_MOD_APPEND; - *value += lstrlenW(prefix); + if (ptr[prefix_len] == szSemiColon[0]) + { + *flags |= ENV_MOD_APPEND; + *value += lstrlenW(prefix); + } + else + { + *value = NULL; + } } else if (lstrlenW(*value) >= prefix_len) { ptr += lstrlenW(ptr) - prefix_len; if (!lstrcmpW(ptr, prefix)) { - *flags |= ENV_MOD_PREFIX; - /* the "[~]" will be removed by deformat_string */; + if ((ptr-1) > *value && *(ptr-1) == szSemiColon[0]) + { + *flags |= ENV_MOD_PREFIX; + /* the "[~]" will be removed by deformat_string */; + } + else + { + *value = NULL; + } } } } @@ -4977,7 +5195,7 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) TRACE("name %s value %s\n", debugstr_w(name), debugstr_w(value)); res = env_set_flags(&name, &value, &flags); - if (res != ERROR_SUCCESS) + if (res != ERROR_SUCCESS || !value) goto done; if (value && !deformat_string(package, value, &deformatted)) @@ -5023,6 +5241,9 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) goto done; } + /* If we are appending but the string was empty, strip ; */ + if ((flags & ENV_MOD_APPEND) && (value[0] == szSemiColon[0])) value++; + size = (lstrlenW(value) + 1) * sizeof(WCHAR); newval = strdupW(value); if (!newval) @@ -5033,7 +5254,8 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) } else { - if (flags & ENV_ACT_SETABSENT) + /* Contrary to MSDN, +-variable to [~];path works */ + if (flags & ENV_ACT_SETABSENT && !(flags & ENV_MOD_MASK)) { res = ERROR_SUCCESS; goto done; @@ -5063,7 +5285,7 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) int multiplier = 0; if (flags & ENV_MOD_APPEND) multiplier++; if (flags & ENV_MOD_PREFIX) multiplier++; - mod_size = (lstrlenW(value) + 1) * multiplier; + mod_size = lstrlenW(value) * multiplier; size += mod_size * sizeof(WCHAR); } @@ -5078,26 +5300,18 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) if (flags & ENV_MOD_PREFIX) { lstrcpyW(newval, value); - lstrcatW(newval, szSemiColon); - ptr = newval + lstrlenW(value) + 1; + ptr = newval + lstrlenW(value); } lstrcpyW(ptr, data); if (flags & ENV_MOD_APPEND) { - lstrcatW(newval, szSemiColon); lstrcatW(newval, value); } } - - if (newval) - { - TRACE("setting %s to %s\n", debugstr_w(name), debugstr_w(newval)); - res = RegSetValueExW(env, name, 0, type, (LPVOID)newval, size); - } - else - res = ERROR_SUCCESS; + TRACE("setting %s to %s\n", debugstr_w(name), debugstr_w(newval)); + res = RegSetValueExW(env, name, 0, type, (LPVOID)newval, size); done: if (env) RegCloseKey(env); @@ -5911,6 +6125,13 @@ done: return r; } +static UINT ACTION_ScheduleReboot( MSIPACKAGE *package ) +{ + TRACE("\n"); + package->need_reboot = 1; + return ERROR_SUCCESS; +} + static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, LPCSTR action, LPCWSTR table ) { @@ -5973,18 +6194,6 @@ static UINT ACTION_MigrateFeatureStates( MSIPACKAGE *package ) return msi_unimplemented_action_stub( package, "MigrateFeatureStates", table ); } -static UINT ACTION_SelfUnregModules( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { 'S','e','l','f','R','e','g',0 }; - return msi_unimplemented_action_stub( package, "SelfUnregModules", table ); -} - -static UINT ACTION_DeleteServices( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { - 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0 }; - return msi_unimplemented_action_stub( package, "DeleteServices", table ); -} static UINT ACTION_ValidateProductID( MSIPACKAGE *package ) { static const WCHAR table[] = { @@ -6048,12 +6257,6 @@ static UINT ACTION_RemoveExistingProducts( MSIPACKAGE *package ) return msi_unimplemented_action_stub( package, "RemoveExistingProducts", table ); } -static UINT ACTION_RemoveFolders( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { 'C','r','e','a','t','e','F','o','l','d','e','r',0 }; - return msi_unimplemented_action_stub( package, "RemoveFolders", table ); -} - static UINT ACTION_RemoveODBC( MSIPACKAGE *package ) { static const WCHAR table[] = { 'O','D','B','C','D','r','i','v','e','r',0 }; @@ -6072,6 +6275,12 @@ static UINT ACTION_RemoveShortcuts( MSIPACKAGE *package ) return msi_unimplemented_action_stub( package, "RemoveShortcuts", table ); } +static UINT ACTION_SetODBCFolders( MSIPACKAGE *package ) +{ + static const WCHAR table[] = { 'D','i','r','e','c','t','o','r','y',0 }; + return msi_unimplemented_action_stub( package, "SetODBCFolders", table ); +} + static UINT ACTION_UnpublishComponents( MSIPACKAGE *package ) { static const WCHAR table[] = { 'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t',0 }; @@ -6173,10 +6382,10 @@ StandardActions[] = { szRemoveShortcuts, ACTION_RemoveShortcuts }, { szResolveSource, ACTION_ResolveSource }, { szRMCCPSearch, ACTION_RMCCPSearch }, - { szScheduleReboot, NULL }, + { szScheduleReboot, ACTION_ScheduleReboot }, { szSelfRegModules, ACTION_SelfRegModules }, { szSelfUnregModules, ACTION_SelfUnregModules }, - { szSetODBCFolders, NULL }, + { szSetODBCFolders, ACTION_SetODBCFolders }, { szStartServices, ACTION_StartServices }, { szStopServices, ACTION_StopServices }, { szUnpublishComponents, ACTION_UnpublishComponents }, diff --git a/reactos/dll/win32/msi/appsearch.c b/reactos/dll/win32/msi/appsearch.c index b99b4f52085..c4e4e588077 100644 --- a/reactos/dll/win32/msi/appsearch.c +++ b/reactos/dll/win32/msi/appsearch.c @@ -463,7 +463,7 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNAT ACTION_ConvertRegValue(regType, value, sz, appValue); break; default: - FIXME("AppSearch unimplemented for type %d (key path %s, value %s)\n", + FIXME("unimplemented for type %d (key path %s, value %s)\n", type, debugstr_w(keyPath), debugstr_w(valueName)); } end: diff --git a/reactos/dll/win32/msi/automation.c b/reactos/dll/win32/msi/automation.c index 5305f9c9d47..f935a64397d 100644 --- a/reactos/dll/win32/msi/automation.c +++ b/reactos/dll/win32/msi/automation.c @@ -1138,6 +1138,21 @@ static HRESULT WINAPI ViewImpl_Invoke( return S_OK; } +static HRESULT DatabaseImpl_LastErrorRecord(WORD wFlags, + DISPPARAMS* pDispParams, + VARIANT* pVarResult, + EXCEPINFO* pExcepInfo, + UINT* puArgErr) +{ + if (!(wFlags & DISPATCH_METHOD)) + return DISP_E_MEMBERNOTFOUND; + + FIXME("\n"); + + VariantInit(pVarResult); + return S_OK; +} + static HRESULT WINAPI DatabaseImpl_Invoke( AutomationObject* This, DISPID dispIdMember, @@ -1208,6 +1223,11 @@ static HRESULT WINAPI DatabaseImpl_Invoke( else return DISP_E_MEMBERNOTFOUND; break; + case DISPID_INSTALLER_LASTERRORRECORD: + return DatabaseImpl_LastErrorRecord(wFlags, pDispParams, + pVarResult, pExcepInfo, + puArgErr); + default: return DISP_E_MEMBERNOTFOUND; } diff --git a/reactos/dll/win32/msi/cond.tab.c b/reactos/dll/win32/msi/cond.tab.c index a35bd98e5d6..5449d99fdab 100644 --- a/reactos/dll/win32/msi/cond.tab.c +++ b/reactos/dll/win32/msi/cond.tab.c @@ -119,6 +119,7 @@ #include "msiserver.h" #include "wine/debug.h" #include "wine/unicode.h" +#include "wine/list.h" #define YYLEX_PARAM info #define YYPARSE_PARAM info @@ -133,6 +134,7 @@ typedef struct tag_yyinput LPCWSTR str; INT n; MSICONDITION result; + struct list mem; } COND_input; struct cond_str { @@ -140,10 +142,14 @@ struct cond_str { INT len; }; -static LPWSTR COND_GetString( const struct cond_str *str ); -static LPWSTR COND_GetLiteral( const struct cond_str *str ); +static LPWSTR COND_GetString( COND_input *info, const struct cond_str *str ); +static LPWSTR COND_GetLiteral( COND_input *info, const struct cond_str *str ); static int cond_lex( void *COND_lval, COND_input *info); +static void *cond_alloc( COND_input *cond, unsigned int sz ); +static void *cond_track_mem( COND_input *cond, void *ptr, unsigned int sz ); +static void cond_free( void *ptr ); + static INT compare_int( INT a, INT operator, INT b ); static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert ); @@ -152,8 +158,8 @@ static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert ) INT r; r = compare_string( a, op, b, convert ); - msi_free( a ); - msi_free( b ); + cond_free( a ); + cond_free( b ); return r; } @@ -184,7 +190,7 @@ static BOOL num_from_prop( LPCWSTR p, INT *val ) /* Line 189 of yacc.c */ -#line 188 "cond.tab.c" +#line 194 "cond.tab.c" /* Enabling traces. */ #ifndef YYDEBUG @@ -259,7 +265,7 @@ typedef union YYSTYPE { /* Line 214 of yacc.c */ -#line 110 "cond.y" +#line 116 "cond.y" struct cond_str str; LPWSTR string; @@ -268,7 +274,7 @@ typedef union YYSTYPE /* Line 214 of yacc.c */ -#line 272 "cond.tab.c" +#line 278 "cond.tab.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -280,7 +286,7 @@ typedef union YYSTYPE /* Line 264 of yacc.c */ -#line 284 "cond.tab.c" +#line 290 "cond.tab.c" #ifdef short # undef short @@ -584,12 +590,12 @@ static const yytype_int8 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 134, 134, 140, 147, 151, 155, 159, 163, 170, - 174, 181, 185, 189, 194, 198, 207, 216, 220, 224, - 228, 232, 237, 242, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 271, 275, 282, 291, 295, 304, 313, 326, - 338, 345, 359, 368 + 0, 140, 140, 146, 153, 157, 161, 165, 169, 176, + 180, 187, 191, 195, 200, 204, 213, 222, 226, 230, + 234, 238, 243, 248, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 277, 281, 288, 298, 302, 311, 320, 333, + 345, 358, 375, 385 }; #endif @@ -1540,7 +1546,7 @@ yyreduce: case 2: /* Line 1455 of yacc.c */ -#line 135 "cond.y" +#line 141 "cond.y" { COND_input* cond = (COND_input*) info; cond->result = (yyvsp[(1) - (1)].value); @@ -1550,7 +1556,7 @@ yyreduce: case 3: /* Line 1455 of yacc.c */ -#line 140 "cond.y" +#line 146 "cond.y" { COND_input* cond = (COND_input*) info; cond->result = MSICONDITION_NONE; @@ -1560,7 +1566,7 @@ yyreduce: case 4: /* Line 1455 of yacc.c */ -#line 148 "cond.y" +#line 154 "cond.y" { (yyval.value) = (yyvsp[(1) - (1)].value); ;} @@ -1569,7 +1575,7 @@ yyreduce: case 5: /* Line 1455 of yacc.c */ -#line 152 "cond.y" +#line 158 "cond.y" { (yyval.value) = (yyvsp[(1) - (3)].value) || (yyvsp[(3) - (3)].value); ;} @@ -1578,7 +1584,7 @@ yyreduce: case 6: /* Line 1455 of yacc.c */ -#line 156 "cond.y" +#line 162 "cond.y" { (yyval.value) = !(yyvsp[(1) - (3)].value) || (yyvsp[(3) - (3)].value); ;} @@ -1587,7 +1593,7 @@ yyreduce: case 7: /* Line 1455 of yacc.c */ -#line 160 "cond.y" +#line 166 "cond.y" { (yyval.value) = ( (yyvsp[(1) - (3)].value) || (yyvsp[(3) - (3)].value) ) && !( (yyvsp[(1) - (3)].value) && (yyvsp[(3) - (3)].value) ); ;} @@ -1596,7 +1602,7 @@ yyreduce: case 8: /* Line 1455 of yacc.c */ -#line 164 "cond.y" +#line 170 "cond.y" { (yyval.value) = ( (yyvsp[(1) - (3)].value) && (yyvsp[(3) - (3)].value) ) || ( !(yyvsp[(1) - (3)].value) && !(yyvsp[(3) - (3)].value) ); ;} @@ -1605,7 +1611,7 @@ yyreduce: case 9: /* Line 1455 of yacc.c */ -#line 171 "cond.y" +#line 177 "cond.y" { (yyval.value) = (yyvsp[(1) - (1)].value); ;} @@ -1614,7 +1620,7 @@ yyreduce: case 10: /* Line 1455 of yacc.c */ -#line 175 "cond.y" +#line 181 "cond.y" { (yyval.value) = (yyvsp[(1) - (3)].value) && (yyvsp[(3) - (3)].value); ;} @@ -1623,7 +1629,7 @@ yyreduce: case 11: /* Line 1455 of yacc.c */ -#line 182 "cond.y" +#line 188 "cond.y" { (yyval.value) = (yyvsp[(2) - (2)].value) ? 0 : 1; ;} @@ -1632,7 +1638,7 @@ yyreduce: case 12: /* Line 1455 of yacc.c */ -#line 186 "cond.y" +#line 192 "cond.y" { (yyval.value) = (yyvsp[(1) - (1)].value) ? 1 : 0; ;} @@ -1641,17 +1647,17 @@ yyreduce: case 13: /* Line 1455 of yacc.c */ -#line 190 "cond.y" +#line 196 "cond.y" { (yyval.value) = ((yyvsp[(1) - (1)].string) && (yyvsp[(1) - (1)].string)[0]) ? 1 : 0; - msi_free((yyvsp[(1) - (1)].string)); + cond_free( (yyvsp[(1) - (1)].string) ); ;} break; case 14: /* Line 1455 of yacc.c */ -#line 195 "cond.y" +#line 201 "cond.y" { (yyval.value) = compare_int( (yyvsp[(1) - (3)].value), (yyvsp[(2) - (3)].value), (yyvsp[(3) - (3)].value) ); ;} @@ -1660,35 +1666,35 @@ yyreduce: case 15: /* Line 1455 of yacc.c */ -#line 199 "cond.y" +#line 205 "cond.y" { int num; if (num_from_prop( (yyvsp[(1) - (3)].string), &num )) (yyval.value) = compare_int( num, (yyvsp[(2) - (3)].value), (yyvsp[(3) - (3)].value) ); else (yyval.value) = ((yyvsp[(2) - (3)].value) == COND_NE || (yyvsp[(2) - (3)].value) == COND_INE ); - msi_free((yyvsp[(1) - (3)].string)); + cond_free( (yyvsp[(1) - (3)].string) ); ;} break; case 16: /* Line 1455 of yacc.c */ -#line 208 "cond.y" +#line 214 "cond.y" { int num; if (num_from_prop( (yyvsp[(3) - (3)].string), &num )) (yyval.value) = compare_int( (yyvsp[(1) - (3)].value), (yyvsp[(2) - (3)].value), num ); else (yyval.value) = ((yyvsp[(2) - (3)].value) == COND_NE || (yyvsp[(2) - (3)].value) == COND_INE ); - msi_free((yyvsp[(3) - (3)].string)); + cond_free( (yyvsp[(3) - (3)].string) ); ;} break; case 17: /* Line 1455 of yacc.c */ -#line 217 "cond.y" +#line 223 "cond.y" { (yyval.value) = compare_and_free_strings( (yyvsp[(1) - (3)].string), (yyvsp[(2) - (3)].value), (yyvsp[(3) - (3)].string), TRUE ); ;} @@ -1697,7 +1703,7 @@ yyreduce: case 18: /* Line 1455 of yacc.c */ -#line 221 "cond.y" +#line 227 "cond.y" { (yyval.value) = compare_and_free_strings( (yyvsp[(1) - (3)].string), (yyvsp[(2) - (3)].value), (yyvsp[(3) - (3)].string), TRUE ); ;} @@ -1706,7 +1712,7 @@ yyreduce: case 19: /* Line 1455 of yacc.c */ -#line 225 "cond.y" +#line 231 "cond.y" { (yyval.value) = compare_and_free_strings( (yyvsp[(1) - (3)].string), (yyvsp[(2) - (3)].value), (yyvsp[(3) - (3)].string), TRUE ); ;} @@ -1715,7 +1721,7 @@ yyreduce: case 20: /* Line 1455 of yacc.c */ -#line 229 "cond.y" +#line 235 "cond.y" { (yyval.value) = compare_and_free_strings( (yyvsp[(1) - (3)].string), (yyvsp[(2) - (3)].value), (yyvsp[(3) - (3)].string), FALSE ); ;} @@ -1724,27 +1730,27 @@ yyreduce: case 21: /* Line 1455 of yacc.c */ -#line 233 "cond.y" +#line 239 "cond.y" { (yyval.value) = 0; - msi_free((yyvsp[(1) - (3)].string)); + cond_free( (yyvsp[(1) - (3)].string) ); ;} break; case 22: /* Line 1455 of yacc.c */ -#line 238 "cond.y" +#line 244 "cond.y" { (yyval.value) = 0; - msi_free((yyvsp[(3) - (3)].string)); + cond_free( (yyvsp[(3) - (3)].string) ); ;} break; case 23: /* Line 1455 of yacc.c */ -#line 243 "cond.y" +#line 249 "cond.y" { (yyval.value) = (yyvsp[(2) - (3)].value); ;} @@ -1753,133 +1759,133 @@ yyreduce: case 24: /* Line 1455 of yacc.c */ -#line 250 "cond.y" +#line 256 "cond.y" { (yyval.value) = COND_EQ; ;} break; case 25: /* Line 1455 of yacc.c */ -#line 251 "cond.y" +#line 257 "cond.y" { (yyval.value) = COND_NE; ;} break; case 26: /* Line 1455 of yacc.c */ -#line 252 "cond.y" +#line 258 "cond.y" { (yyval.value) = COND_LT; ;} break; case 27: /* Line 1455 of yacc.c */ -#line 253 "cond.y" +#line 259 "cond.y" { (yyval.value) = COND_GT; ;} break; case 28: /* Line 1455 of yacc.c */ -#line 254 "cond.y" +#line 260 "cond.y" { (yyval.value) = COND_LE; ;} break; case 29: /* Line 1455 of yacc.c */ -#line 255 "cond.y" +#line 261 "cond.y" { (yyval.value) = COND_GE; ;} break; case 30: /* Line 1455 of yacc.c */ -#line 256 "cond.y" +#line 262 "cond.y" { (yyval.value) = COND_SS; ;} break; case 31: /* Line 1455 of yacc.c */ -#line 257 "cond.y" +#line 263 "cond.y" { (yyval.value) = COND_IEQ; ;} break; case 32: /* Line 1455 of yacc.c */ -#line 258 "cond.y" +#line 264 "cond.y" { (yyval.value) = COND_INE; ;} break; case 33: /* Line 1455 of yacc.c */ -#line 259 "cond.y" +#line 265 "cond.y" { (yyval.value) = COND_ILT; ;} break; case 34: /* Line 1455 of yacc.c */ -#line 260 "cond.y" +#line 266 "cond.y" { (yyval.value) = COND_IGT; ;} break; case 35: /* Line 1455 of yacc.c */ -#line 261 "cond.y" +#line 267 "cond.y" { (yyval.value) = COND_ILE; ;} break; case 36: /* Line 1455 of yacc.c */ -#line 262 "cond.y" +#line 268 "cond.y" { (yyval.value) = COND_IGE; ;} break; case 37: /* Line 1455 of yacc.c */ -#line 263 "cond.y" +#line 269 "cond.y" { (yyval.value) = COND_ISS; ;} break; case 38: /* Line 1455 of yacc.c */ -#line 264 "cond.y" +#line 270 "cond.y" { (yyval.value) = COND_LHS; ;} break; case 39: /* Line 1455 of yacc.c */ -#line 265 "cond.y" +#line 271 "cond.y" { (yyval.value) = COND_RHS; ;} break; case 40: /* Line 1455 of yacc.c */ -#line 266 "cond.y" +#line 272 "cond.y" { (yyval.value) = COND_ILHS; ;} break; case 41: /* Line 1455 of yacc.c */ -#line 267 "cond.y" +#line 273 "cond.y" { (yyval.value) = COND_IRHS; ;} break; case 42: /* Line 1455 of yacc.c */ -#line 272 "cond.y" +#line 278 "cond.y" { (yyval.string) = (yyvsp[(1) - (1)].string); ;} @@ -1888,7 +1894,7 @@ yyreduce: case 43: /* Line 1455 of yacc.c */ -#line 276 "cond.y" +#line 282 "cond.y" { (yyval.string) = (yyvsp[(1) - (1)].string); ;} @@ -1897,9 +1903,10 @@ yyreduce: case 44: /* Line 1455 of yacc.c */ -#line 283 "cond.y" +#line 289 "cond.y" { - (yyval.string) = COND_GetLiteral(&(yyvsp[(1) - (1)].str)); + COND_input* cond = (COND_input*) info; + (yyval.string) = COND_GetLiteral( cond, &(yyvsp[(1) - (1)].str) ); if( !(yyval.string) ) YYABORT; ;} @@ -1908,7 +1915,7 @@ yyreduce: case 45: /* Line 1455 of yacc.c */ -#line 292 "cond.y" +#line 299 "cond.y" { (yyval.value) = (yyvsp[(1) - (1)].value); ;} @@ -1917,35 +1924,35 @@ yyreduce: case 46: /* Line 1455 of yacc.c */ -#line 296 "cond.y" +#line 303 "cond.y" { COND_input* cond = (COND_input*) info; INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN; MSI_GetComponentStateW(cond->package, (yyvsp[(2) - (2)].string), &install, &action ); (yyval.value) = action; - msi_free( (yyvsp[(2) - (2)].string) ); + cond_free( (yyvsp[(2) - (2)].string) ); ;} break; case 47: /* Line 1455 of yacc.c */ -#line 305 "cond.y" +#line 312 "cond.y" { COND_input* cond = (COND_input*) info; INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN; MSI_GetComponentStateW(cond->package, (yyvsp[(2) - (2)].string), &install, &action ); (yyval.value) = install; - msi_free( (yyvsp[(2) - (2)].string) ); + cond_free( (yyvsp[(2) - (2)].string) ); ;} break; case 48: /* Line 1455 of yacc.c */ -#line 314 "cond.y" +#line 321 "cond.y" { COND_input* cond = (COND_input*) info; INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN; @@ -1956,58 +1963,68 @@ yyreduce: else (yyval.value) = action; - msi_free( (yyvsp[(2) - (2)].string) ); + cond_free( (yyvsp[(2) - (2)].string) ); ;} break; case 49: /* Line 1455 of yacc.c */ -#line 327 "cond.y" +#line 334 "cond.y" { COND_input* cond = (COND_input*) info; INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN; MSI_GetFeatureStateW(cond->package, (yyvsp[(2) - (2)].string), &install, &action ); (yyval.value) = install; - msi_free( (yyvsp[(2) - (2)].string) ); + cond_free( (yyvsp[(2) - (2)].string) ); ;} break; case 50: /* Line 1455 of yacc.c */ -#line 339 "cond.y" +#line 346 "cond.y" { COND_input* cond = (COND_input*) info; + UINT len; (yyval.string) = msi_dup_property( cond->package, (yyvsp[(1) - (1)].string) ); - msi_free( (yyvsp[(1) - (1)].string) ); + if ((yyval.string)) + { + len = (lstrlenW((yyval.string)) + 1) * sizeof (WCHAR); + (yyval.string) = cond_track_mem( cond, (yyval.string), len ); + } + cond_free( (yyvsp[(1) - (1)].string) ); ;} break; case 51: /* Line 1455 of yacc.c */ -#line 346 "cond.y" +#line 359 "cond.y" { + COND_input* cond = (COND_input*) info; UINT len = GetEnvironmentVariableW( (yyvsp[(2) - (2)].string), NULL, 0 ); (yyval.string) = NULL; if (len++) { - (yyval.string) = msi_alloc( len*sizeof (WCHAR) ); + (yyval.string) = cond_alloc( cond, len*sizeof (WCHAR) ); + if( !(yyval.string) ) + YYABORT; GetEnvironmentVariableW( (yyvsp[(2) - (2)].string), (yyval.string), len ); } - msi_free( (yyvsp[(2) - (2)].string) ); + cond_free( (yyvsp[(2) - (2)].string) ); ;} break; case 52: /* Line 1455 of yacc.c */ -#line 360 "cond.y" +#line 376 "cond.y" { - (yyval.string) = COND_GetString(&(yyvsp[(1) - (1)].str)); + COND_input* cond = (COND_input*) info; + (yyval.string) = COND_GetString( cond, &(yyvsp[(1) - (1)].str) ); if( !(yyval.string) ) YYABORT; ;} @@ -2016,20 +2033,21 @@ yyreduce: case 53: /* Line 1455 of yacc.c */ -#line 369 "cond.y" +#line 386 "cond.y" { - LPWSTR szNum = COND_GetString(&(yyvsp[(1) - (1)].str)); + COND_input* cond = (COND_input*) info; + LPWSTR szNum = COND_GetString( cond, &(yyvsp[(1) - (1)].str) ); if( !szNum ) YYABORT; (yyval.value) = atoiW( szNum ); - msi_free( szNum ); + cond_free( szNum ); ;} break; /* Line 1455 of yacc.c */ -#line 2033 "cond.tab.c" +#line 2051 "cond.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -2241,7 +2259,7 @@ yyreturn: /* Line 1675 of yacc.c */ -#line 378 "cond.y" +#line 396 "cond.y" @@ -2558,11 +2576,11 @@ static int cond_lex( void *COND_lval, COND_input *cond ) return rc; } -static LPWSTR COND_GetString( const struct cond_str *str ) +static LPWSTR COND_GetString( COND_input *cond, const struct cond_str *str ) { LPWSTR ret; - ret = msi_alloc( (str->len+1) * sizeof (WCHAR) ); + ret = cond_alloc( cond, (str->len+1) * sizeof (WCHAR) ); if( ret ) { memcpy( ret, str->data, str->len * sizeof(WCHAR)); @@ -2572,11 +2590,11 @@ static LPWSTR COND_GetString( const struct cond_str *str ) return ret; } -static LPWSTR COND_GetLiteral( const struct cond_str *str ) +static LPWSTR COND_GetLiteral( COND_input *cond, const struct cond_str *str ) { LPWSTR ret; - ret = msi_alloc( (str->len-1) * sizeof (WCHAR) ); + ret = cond_alloc( cond, (str->len-1) * sizeof (WCHAR) ); if( ret ) { memcpy( ret, str->data+1, (str->len-2) * sizeof(WCHAR) ); @@ -2586,6 +2604,48 @@ static LPWSTR COND_GetLiteral( const struct cond_str *str ) return ret; } +static void *cond_alloc( COND_input *cond, unsigned int sz ) +{ + struct list *mem; + + mem = msi_alloc( sizeof (struct list) + sz ); + if( !mem ) + return NULL; + + list_add_head( &(cond->mem), mem ); + return mem + 1; +} + +static void *cond_track_mem( COND_input *cond, void *ptr, unsigned int sz ) +{ + void *new_ptr; + + if( !ptr ) + return ptr; + + new_ptr = cond_alloc( cond, sz ); + if( !new_ptr ) + { + msi_free( ptr ); + return NULL; + } + + memcpy( new_ptr, ptr, sz ); + msi_free( ptr ); + return new_ptr; +} + +static void cond_free( void *ptr ) +{ + struct list *mem = (struct list *)ptr - 1; + + if( ptr ) + { + list_remove( mem ); + msi_free( mem ); + } +} + static int cond_error(const char *str) { TRACE("%s\n", str ); @@ -2596,6 +2656,7 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition ) { COND_input cond; MSICONDITION r; + struct list *mem, *safety; TRACE("%s\n", debugstr_w( szCondition ) ); @@ -2606,12 +2667,23 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition ) cond.str = szCondition; cond.n = 0; cond.result = MSICONDITION_ERROR; - + + list_init( &cond.mem ); + if ( !cond_parse( &cond ) ) r = cond.result; else r = MSICONDITION_ERROR; + LIST_FOR_EACH_SAFE( mem, safety, &cond.mem ) + { + /* The tracked memory lives directly after the list struct */ + void *ptr = mem + 1; + if ( r != MSICONDITION_ERROR ) + WARN( "condition parser failed to free up some memory: %p\n", ptr ); + cond_free( ptr ); + } + TRACE("%i <- %s\n", r, debugstr_w(szCondition)); return r; } diff --git a/reactos/dll/win32/msi/cond.tab.h b/reactos/dll/win32/msi/cond.tab.h index ebc6e23ed3e..47f4816deb3 100644 --- a/reactos/dll/win32/msi/cond.tab.h +++ b/reactos/dll/win32/msi/cond.tab.h @@ -87,7 +87,7 @@ typedef union YYSTYPE { /* Line 1676 of yacc.c */ -#line 110 "cond.y" +#line 116 "cond.y" struct cond_str str; LPWSTR string; diff --git a/reactos/dll/win32/msi/cond.y b/reactos/dll/win32/msi/cond.y index c2a17376e29..f3db635a10a 100644 --- a/reactos/dll/win32/msi/cond.y +++ b/reactos/dll/win32/msi/cond.y @@ -40,6 +40,7 @@ #include "msiserver.h" #include "wine/debug.h" #include "wine/unicode.h" +#include "wine/list.h" #define YYLEX_PARAM info #define YYPARSE_PARAM info @@ -54,6 +55,7 @@ typedef struct tag_yyinput LPCWSTR str; INT n; MSICONDITION result; + struct list mem; } COND_input; struct cond_str { @@ -61,10 +63,14 @@ struct cond_str { INT len; }; -static LPWSTR COND_GetString( const struct cond_str *str ); -static LPWSTR COND_GetLiteral( const struct cond_str *str ); +static LPWSTR COND_GetString( COND_input *info, const struct cond_str *str ); +static LPWSTR COND_GetLiteral( COND_input *info, const struct cond_str *str ); static int cond_lex( void *COND_lval, COND_input *info); +static void *cond_alloc( COND_input *cond, unsigned int sz ); +static void *cond_track_mem( COND_input *cond, void *ptr, unsigned int sz ); +static void cond_free( void *ptr ); + static INT compare_int( INT a, INT operator, INT b ); static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert ); @@ -73,8 +79,8 @@ static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert ) INT r; r = compare_string( a, op, b, convert ); - msi_free( a ); - msi_free( b ); + cond_free( a ); + cond_free( b ); return r; } @@ -189,7 +195,7 @@ boolean_factor: | value_s { $$ = ($1 && $1[0]) ? 1 : 0; - msi_free($1); + cond_free( $1 ); } | value_i operator value_i { @@ -202,7 +208,7 @@ boolean_factor: $$ = compare_int( num, $2, $3 ); else $$ = ($2 == COND_NE || $2 == COND_INE ); - msi_free($1); + cond_free( $1 ); } | value_i operator symbol_s { @@ -211,7 +217,7 @@ boolean_factor: $$ = compare_int( $1, $2, num ); else $$ = ($2 == COND_NE || $2 == COND_INE ); - msi_free($3); + cond_free( $3 ); } | symbol_s operator symbol_s { @@ -232,12 +238,12 @@ boolean_factor: | literal operator value_i { $$ = 0; - msi_free($1); + cond_free( $1 ); } | value_i operator literal { $$ = 0; - msi_free($3); + cond_free( $3 ); } | COND_LPAR expression COND_RPAR { @@ -281,7 +287,8 @@ value_s: literal: COND_LITER { - $$ = COND_GetLiteral(&$1); + COND_input* cond = (COND_input*) info; + $$ = COND_GetLiteral( cond, &$1 ); if( !$$ ) YYABORT; } @@ -299,7 +306,7 @@ value_i: MSI_GetComponentStateW(cond->package, $2, &install, &action ); $$ = action; - msi_free( $2 ); + cond_free( $2 ); } | COND_QUESTION identifier { @@ -308,7 +315,7 @@ value_i: MSI_GetComponentStateW(cond->package, $2, &install, &action ); $$ = install; - msi_free( $2 ); + cond_free( $2 ); } | COND_AMPER identifier { @@ -321,7 +328,7 @@ value_i: else $$ = action; - msi_free( $2 ); + cond_free( $2 ); } | COND_EXCLAM identifier { @@ -330,7 +337,7 @@ value_i: MSI_GetFeatureStateW(cond->package, $2, &install, &action ); $$ = install; - msi_free( $2 ); + cond_free( $2 ); } ; @@ -338,27 +345,37 @@ symbol_s: identifier { COND_input* cond = (COND_input*) info; + UINT len; $$ = msi_dup_property( cond->package, $1 ); - msi_free( $1 ); + if ($$) + { + len = (lstrlenW($$) + 1) * sizeof (WCHAR); + $$ = cond_track_mem( cond, $$, len ); + } + cond_free( $1 ); } | COND_PERCENT identifier { + COND_input* cond = (COND_input*) info; UINT len = GetEnvironmentVariableW( $2, NULL, 0 ); $$ = NULL; if (len++) { - $$ = msi_alloc( len*sizeof (WCHAR) ); + $$ = cond_alloc( cond, len*sizeof (WCHAR) ); + if( !$$ ) + YYABORT; GetEnvironmentVariableW( $2, $$, len ); } - msi_free( $2 ); + cond_free( $2 ); } ; identifier: COND_IDENT { - $$ = COND_GetString(&$1); + COND_input* cond = (COND_input*) info; + $$ = COND_GetString( cond, &$1 ); if( !$$ ) YYABORT; } @@ -367,11 +384,12 @@ identifier: integer: COND_NUMBER { - LPWSTR szNum = COND_GetString(&$1); + COND_input* cond = (COND_input*) info; + LPWSTR szNum = COND_GetString( cond, &$1 ); if( !szNum ) YYABORT; $$ = atoiW( szNum ); - msi_free( szNum ); + cond_free( szNum ); } ; @@ -691,11 +709,11 @@ static int cond_lex( void *COND_lval, COND_input *cond ) return rc; } -static LPWSTR COND_GetString( const struct cond_str *str ) +static LPWSTR COND_GetString( COND_input *cond, const struct cond_str *str ) { LPWSTR ret; - ret = msi_alloc( (str->len+1) * sizeof (WCHAR) ); + ret = cond_alloc( cond, (str->len+1) * sizeof (WCHAR) ); if( ret ) { memcpy( ret, str->data, str->len * sizeof(WCHAR)); @@ -705,11 +723,11 @@ static LPWSTR COND_GetString( const struct cond_str *str ) return ret; } -static LPWSTR COND_GetLiteral( const struct cond_str *str ) +static LPWSTR COND_GetLiteral( COND_input *cond, const struct cond_str *str ) { LPWSTR ret; - ret = msi_alloc( (str->len-1) * sizeof (WCHAR) ); + ret = cond_alloc( cond, (str->len-1) * sizeof (WCHAR) ); if( ret ) { memcpy( ret, str->data+1, (str->len-2) * sizeof(WCHAR) ); @@ -719,6 +737,48 @@ static LPWSTR COND_GetLiteral( const struct cond_str *str ) return ret; } +static void *cond_alloc( COND_input *cond, unsigned int sz ) +{ + struct list *mem; + + mem = msi_alloc( sizeof (struct list) + sz ); + if( !mem ) + return NULL; + + list_add_head( &(cond->mem), mem ); + return mem + 1; +} + +static void *cond_track_mem( COND_input *cond, void *ptr, unsigned int sz ) +{ + void *new_ptr; + + if( !ptr ) + return ptr; + + new_ptr = cond_alloc( cond, sz ); + if( !new_ptr ) + { + msi_free( ptr ); + return NULL; + } + + memcpy( new_ptr, ptr, sz ); + msi_free( ptr ); + return new_ptr; +} + +static void cond_free( void *ptr ) +{ + struct list *mem = (struct list *)ptr - 1; + + if( ptr ) + { + list_remove( mem ); + msi_free( mem ); + } +} + static int cond_error(const char *str) { TRACE("%s\n", str ); @@ -729,6 +789,7 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition ) { COND_input cond; MSICONDITION r; + struct list *mem, *safety; TRACE("%s\n", debugstr_w( szCondition ) ); @@ -739,12 +800,23 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition ) cond.str = szCondition; cond.n = 0; cond.result = MSICONDITION_ERROR; - + + list_init( &cond.mem ); + if ( !cond_parse( &cond ) ) r = cond.result; else r = MSICONDITION_ERROR; + LIST_FOR_EACH_SAFE( mem, safety, &cond.mem ) + { + /* The tracked memory lives directly after the list struct */ + void *ptr = mem + 1; + if ( r != MSICONDITION_ERROR ) + WARN( "condition parser failed to free up some memory: %p\n", ptr ); + cond_free( ptr ); + } + TRACE("%i <- %s\n", r, debugstr_w(szCondition)); return r; } diff --git a/reactos/dll/win32/msi/custom.c b/reactos/dll/win32/msi/custom.c index 508bf6b2b4d..2b2a3e1373f 100644 --- a/reactos/dll/win32/msi/custom.c +++ b/reactos/dll/win32/msi/custom.c @@ -647,6 +647,28 @@ static UINT get_action_info( const GUID *guid, INT *type, MSIHANDLE *handle, return ERROR_SUCCESS; } +#ifdef __i386__ +extern UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE handle ); +__ASM_GLOBAL_FUNC( CUSTOMPROC_wrapper, + "pushl %ebp\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") + __ASM_CFI(".cfi_rel_offset %ebp,0\n\t") + "movl %esp,%ebp\n\t" + __ASM_CFI(".cfi_def_cfa_register %ebp\n\t") + "pushl 12(%ebp)\n\t" + "movl 8(%ebp),%eax\n\t" + "call *%eax\n\t" + "leave\n\t" + __ASM_CFI(".cfi_def_cfa %esp,4\n\t") + __ASM_CFI(".cfi_same_value %ebp\n\t") + "ret" ) +#else +static inline UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE handle ) +{ + return proc(handle); +} +#endif + static DWORD ACTION_CallDllFunction( const GUID *guid ) { MsiCustomActionEntryPoint fn; @@ -685,7 +707,7 @@ static DWORD ACTION_CallDllFunction( const GUID *guid ) __TRY { - r = fn( hPackage ); + r = CUSTOMPROC_wrapper( fn, hPackage ); } __EXCEPT_PAGE_FAULT { diff --git a/reactos/dll/win32/msi/database.c b/reactos/dll/win32/msi/database.c index b0966a25cf3..7855fea9186 100644 --- a/reactos/dll/win32/msi/database.c +++ b/reactos/dll/win32/msi/database.c @@ -51,6 +51,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); * Any binary data in a table is a reference to a stream. */ +#define IS_INTMSIDBOPEN(x) (((ULONG_PTR)(x) >> 16) == 0) + typedef struct tagMSITRANSFORM { struct list entry; IStorage *stg; @@ -306,7 +308,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) save_path = szDBPath; szMode = szPersist; - if( HIWORD( szPersist ) ) + if( !IS_INTMSIDBOPEN(szPersist) ) { if (!CopyFileW( szDBPath, szPersist, FALSE )) return ERROR_OPEN_FAILED; @@ -459,7 +461,7 @@ UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB) goto end; } - if( HIWORD(szPersist) ) + if( !IS_INTMSIDBOPEN(szPersist) ) { szwPersist = strdupAtoW( szPersist ); if( !szwPersist ) @@ -471,7 +473,7 @@ UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB) r = MsiOpenDatabaseW( szwDBPath, szwPersist, phDB ); end: - if( HIWORD(szPersist) ) + if( !IS_INTMSIDBOPEN(szPersist) ) msi_free( szwPersist ); msi_free( szwDBPath ); diff --git a/reactos/dll/win32/msi/dialog.c b/reactos/dll/win32/msi/dialog.c index a22091f95fa..5fd4bbd138b 100644 --- a/reactos/dll/win32/msi/dialog.c +++ b/reactos/dll/win32/msi/dialog.c @@ -166,6 +166,8 @@ static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control ); #define WM_MSI_DIALOG_CREATE (WM_USER+0x100) #define WM_MSI_DIALOG_DESTROY (WM_USER+0x101) +#define USER_INSTALLSTATE_ALL 0x1000 + static DWORD uiThreadId; static HWND hMsiHiddenWindow; @@ -1876,7 +1878,7 @@ msi_seltree_popup_menu( HWND hwnd, INT x, INT y ) /* FIXME: load strings from resources */ AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_LOCAL, "Install feature locally"); - AppendMenuA( hMenu, MF_GRAYED, 0x1000, "Install entire feature"); + AppendMenuA( hMenu, MF_ENABLED, USER_INSTALLSTATE_ALL, "Install entire feature"); AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_ADVERTISED, "Install on demand"); AppendMenuA( hMenu, MF_ENABLED, INSTALLSTATE_ABSENT, "Don't install"); r = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, @@ -1899,6 +1901,37 @@ msi_seltree_feature_from_item( HWND hwnd, HTREEITEM hItem ) return (MSIFEATURE*) tvi.lParam; } +static void +msi_seltree_update_feature_installstate( HWND hwnd, HTREEITEM hItem, + MSIPACKAGE *package, MSIFEATURE *feature, INSTALLSTATE state ) +{ + msi_feature_set_state( package, feature, state ); + msi_seltree_sync_item_state( hwnd, feature, hItem ); + ACTION_UpdateComponentStates( package, feature->Feature ); +} + +static void +msi_seltree_update_siblings_and_children_installstate( HWND hwnd, HTREEITEM curr, + MSIPACKAGE *package, INSTALLSTATE state) +{ + /* update all siblings */ + do + { + MSIFEATURE *feature; + HTREEITEM child; + + feature = msi_seltree_feature_from_item( hwnd, curr ); + msi_seltree_update_feature_installstate( hwnd, curr, package, feature, state ); + + /* update this sibling's children */ + child = (HTREEITEM)SendMessageW( hwnd, TVM_GETNEXTITEM, (WPARAM)TVGN_CHILD, (LPARAM)curr ); + if (child) + msi_seltree_update_siblings_and_children_installstate( hwnd, child, + package, state ); + } + while ((curr = (HTREEITEM)SendMessageW( hwnd, TVM_GETNEXTITEM, (WPARAM)TVGN_NEXT, (LPARAM)curr ))); +} + static LRESULT msi_seltree_menu( HWND hwnd, HTREEITEM hItem ) { @@ -1931,19 +1964,23 @@ msi_seltree_menu( HWND hwnd, HTREEITEM hItem ) switch (r) { - case INSTALLSTATE_LOCAL: + case USER_INSTALLSTATE_ALL: + r = INSTALLSTATE_LOCAL; + /* fall-through */ case INSTALLSTATE_ADVERTISED: case INSTALLSTATE_ABSENT: - msi_feature_set_state(package, feature, r); + { + HTREEITEM child; + child = (HTREEITEM)SendMessageW( hwnd, TVM_GETNEXTITEM, (WPARAM)TVGN_CHILD, (LPARAM)hItem ); + if (child) + msi_seltree_update_siblings_and_children_installstate( hwnd, child, package, r ); + } + /* fall-through */ + case INSTALLSTATE_LOCAL: + msi_seltree_update_feature_installstate( hwnd, hItem, package, feature, r ); break; - default: - FIXME("select feature and all children\n"); } - /* update */ - msi_seltree_sync_item_state( hwnd, feature, hItem ); - ACTION_UpdateComponentStates( package, feature->Feature ); - return 0; } diff --git a/reactos/dll/win32/msi/events.c b/reactos/dll/win32/msi/events.c index 6275a95e9c4..f4697dd0a34 100644 --- a/reactos/dll/win32/msi/events.c +++ b/reactos/dll/win32/msi/events.c @@ -383,6 +383,28 @@ static UINT ControlEvent_ReinstallMode(MSIPACKAGE *package, LPCWSTR argument, return MSI_SetPropertyW( package, szReinstallMode, argument ); } +static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument, + msi_dialog *dialog) +{ + static const WCHAR szProductID[] = {'P','r','o','d','u','c','t','I','D',0}; + static const WCHAR szPIDTemplate[] = {'P','I','D','T','e','m','p','l','a','t','e',0}; + static const WCHAR szPIDKEY[] = {'P','I','D','K','E','Y',0}; + LPWSTR key, template; + UINT ret = ERROR_SUCCESS; + + template = msi_dup_property( package, szPIDTemplate ); + key = msi_dup_property( package, szPIDKEY ); + + if (key && template) + { + FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) ); + ret = MSI_SetPropertyW( package, szProductID, key ); + } + msi_free( template ); + msi_free( key ); + return ret; +} + static const struct _events Events[] = { { "EndDialog",ControlEvent_EndDialog }, { "NewDialog",ControlEvent_NewDialog }, @@ -398,6 +420,7 @@ static const struct _events Events[] = { { "DirectoryListUp",ControlEvent_DirectoryListUp }, { "SelectionBrowse",ControlEvent_SpawnDialog }, { "ReinstallMode",ControlEvent_ReinstallMode }, + { "ValidateProductID",ControlEvent_ValidateProductID }, { NULL,NULL }, }; diff --git a/reactos/dll/win32/msi/files.c b/reactos/dll/win32/msi/files.c index 7e74dca9696..b7af4d39416 100644 --- a/reactos/dll/win32/msi/files.c +++ b/reactos/dll/win32/msi/files.c @@ -365,7 +365,8 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param) debugstr_w(component)); /* the action taken was the same as the current install state */ - comp->Action = comp->Installed; + if (comp) + comp->Action = comp->Installed; return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/helpers.c b/reactos/dll/win32/msi/helpers.c index 83569231029..e3009f7bce7 100644 --- a/reactos/dll/win32/msi/helpers.c +++ b/reactos/dll/win32/msi/helpers.c @@ -440,238 +440,6 @@ void msi_free_action_script(MSIPACKAGE *package, UINT script) package->script->ActionCount[script] = 0; } -static void remove_tracked_tempfiles(MSIPACKAGE* package) -{ - struct list *item, *cursor; - - LIST_FOR_EACH_SAFE( item, cursor, &package->tempfiles ) - { - MSITEMPFILE *temp = LIST_ENTRY( item, MSITEMPFILE, entry ); - - list_remove( &temp->entry ); - TRACE("deleting temp file %s\n", debugstr_w( temp->Path )); - if (!DeleteFileW( temp->Path )) - ERR("failed to delete %s\n", debugstr_w( temp->Path )); - msi_free( temp->Path ); - msi_free( temp ); - } -} - -static void free_feature( MSIFEATURE *feature ) -{ - struct list *item, *cursor; - - LIST_FOR_EACH_SAFE( item, cursor, &feature->Children ) - { - FeatureList *fl = LIST_ENTRY( item, FeatureList, entry ); - list_remove( &fl->entry ); - msi_free( fl ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &feature->Components ) - { - ComponentList *cl = LIST_ENTRY( item, ComponentList, entry ); - list_remove( &cl->entry ); - msi_free( cl ); - } - msi_free( feature->Feature ); - msi_free( feature->Feature_Parent ); - msi_free( feature->Directory ); - msi_free( feature->Description ); - msi_free( feature->Title ); - msi_free( feature ); -} - -static void free_extension( MSIEXTENSION *ext ) -{ - struct list *item, *cursor; - - LIST_FOR_EACH_SAFE( item, cursor, &ext->verbs ) - { - MSIVERB *verb = LIST_ENTRY( item, MSIVERB, entry ); - - list_remove( &verb->entry ); - msi_free( verb->Verb ); - msi_free( verb->Command ); - msi_free( verb->Argument ); - msi_free( verb ); - } - - msi_free( ext->Extension ); - msi_free( ext->ProgIDText ); - msi_free( ext ); -} - -/* Called when the package is being closed */ -void ACTION_free_package_structures( MSIPACKAGE* package) -{ - INT i; - struct list *item, *cursor; - - TRACE("Freeing package action data\n"); - - remove_tracked_tempfiles(package); - - LIST_FOR_EACH_SAFE( item, cursor, &package->features ) - { - MSIFEATURE *feature = LIST_ENTRY( item, MSIFEATURE, entry ); - list_remove( &feature->entry ); - free_feature( feature ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->folders ) - { - MSIFOLDER *folder = LIST_ENTRY( item, MSIFOLDER, entry ); - - list_remove( &folder->entry ); - msi_free( folder->Parent ); - msi_free( folder->Directory ); - msi_free( folder->TargetDefault ); - msi_free( folder->SourceLongPath ); - msi_free( folder->SourceShortPath ); - msi_free( folder->ResolvedTarget ); - msi_free( folder->ResolvedSource ); - msi_free( folder->Property ); - msi_free( folder ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->components ) - { - MSICOMPONENT *comp = LIST_ENTRY( item, MSICOMPONENT, entry ); - - list_remove( &comp->entry ); - msi_free( comp->Component ); - msi_free( comp->ComponentId ); - msi_free( comp->Directory ); - msi_free( comp->Condition ); - msi_free( comp->KeyPath ); - msi_free( comp->FullKeypath ); - msi_free( comp ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->files ) - { - MSIFILE *file = LIST_ENTRY( item, MSIFILE, entry ); - - list_remove( &file->entry ); - msi_free( file->File ); - msi_free( file->FileName ); - msi_free( file->ShortName ); - msi_free( file->LongName ); - msi_free( file->Version ); - msi_free( file->Language ); - msi_free( file->TargetPath ); - msi_free( file ); - } - - /* clean up extension, progid, class and verb structures */ - LIST_FOR_EACH_SAFE( item, cursor, &package->classes ) - { - MSICLASS *cls = LIST_ENTRY( item, MSICLASS, entry ); - - list_remove( &cls->entry ); - msi_free( cls->clsid ); - msi_free( cls->Context ); - msi_free( cls->Description ); - msi_free( cls->FileTypeMask ); - msi_free( cls->IconPath ); - msi_free( cls->DefInprocHandler ); - msi_free( cls->DefInprocHandler32 ); - msi_free( cls->Argument ); - msi_free( cls->ProgIDText ); - msi_free( cls ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->extensions ) - { - MSIEXTENSION *ext = LIST_ENTRY( item, MSIEXTENSION, entry ); - - list_remove( &ext->entry ); - free_extension( ext ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->progids ) - { - MSIPROGID *progid = LIST_ENTRY( item, MSIPROGID, entry ); - - list_remove( &progid->entry ); - msi_free( progid->ProgID ); - msi_free( progid->Description ); - msi_free( progid->IconPath ); - msi_free( progid ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->mimes ) - { - MSIMIME *mt = LIST_ENTRY( item, MSIMIME, entry ); - - list_remove( &mt->entry ); - msi_free( mt->clsid ); - msi_free( mt->ContentType ); - msi_free( mt ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->appids ) - { - MSIAPPID *appid = LIST_ENTRY( item, MSIAPPID, entry ); - - list_remove( &appid->entry ); - msi_free( appid->AppID ); - msi_free( appid->RemoteServerName ); - msi_free( appid->LocalServer ); - msi_free( appid->ServiceParameters ); - msi_free( appid->DllSurrogate ); - msi_free( appid ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->sourcelist_info ) - { - MSISOURCELISTINFO *info = LIST_ENTRY( item, MSISOURCELISTINFO, entry ); - - list_remove( &info->entry ); - msi_free( info->value ); - msi_free( info ); - } - - LIST_FOR_EACH_SAFE( item, cursor, &package->sourcelist_media ) - { - MSIMEDIADISK *info = LIST_ENTRY( item, MSIMEDIADISK, entry ); - - list_remove( &info->entry ); - msi_free( info->volume_label ); - msi_free( info->disk_prompt ); - msi_free( info ); - } - - if (package->script) - { - for (i = 0; i < TOTAL_SCRIPTS; i++) - msi_free_action_script(package, i); - - for (i = 0; i < package->script->UniqueActionsCount; i++) - msi_free(package->script->UniqueActions[i]); - - msi_free(package->script->UniqueActions); - msi_free(package->script); - } - - if (package->patch) - { - msi_free(package->patch->patchcode); - msi_free(package->patch->transforms); - msi_free(package->patch); - } - - msi_free(package->BaseURL); - msi_free(package->PackagePath); - msi_free(package->ProductCode); - msi_free(package->ActionFormat); - msi_free(package->LastAction); - - /* cleanup control event subscriptions */ - ControlEvent_CleanupSubscriptions(package); -} - /* * build_directory_name() * diff --git a/reactos/dll/win32/msi/join.c b/reactos/dll/win32/msi/join.c index 134c5698cd2..f787c309a41 100644 --- a/reactos/dll/win32/msi/join.c +++ b/reactos/dll/win32/msi/join.c @@ -117,8 +117,11 @@ static UINT JOIN_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, IStr static UINT JOIN_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec ) { - FIXME("(%p, %d, %p): stub!\n", view, row, rec); - return ERROR_FUNCTION_FAILED; + MSIJOINVIEW *jv = (MSIJOINVIEW*)view; + + TRACE("%p %d %p\n", jv, row, rec); + + return msi_view_get_row( jv->db, view, row, rec ); } static UINT JOIN_execute( struct tagMSIVIEW *view, MSIRECORD *record ) @@ -219,13 +222,119 @@ static UINT JOIN_get_column_info( struct tagMSIVIEW *view, return ERROR_FUNCTION_FAILED; } -static UINT JOIN_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, - MSIRECORD *rec, UINT row ) +static UINT join_find_row( MSIJOINVIEW *jv, MSIRECORD *rec, UINT *row ) { - TRACE("%p %d %p\n", view, eModifyMode, rec); + LPCWSTR str; + UINT i, id, data; + + str = MSI_RecordGetString( rec, 1 ); + msi_string2idW( jv->db->strings, str, &id ); + + for (i = 0; i < jv->rows; i++) + { + JOIN_fetch_int( &jv->view, i, 1, &data ); + + if (data == id) + { + *row = i; + return ERROR_SUCCESS; + } + } + return ERROR_FUNCTION_FAILED; } +static UINT JOIN_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask ) +{ + MSIJOINVIEW *jv = (MSIJOINVIEW*)view; + JOINTABLE *table; + UINT i, reduced_mask = 0, r = ERROR_SUCCESS, offset = 0, col_count; + MSIRECORD *reduced; + + TRACE("%p %d %p %u %08x\n", jv, row, rec, rec->count, mask ); + + if (mask >= 1 << jv->columns) + return ERROR_INVALID_PARAMETER; + + LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) + { + r = table->view->ops->get_dimensions( table->view, NULL, &col_count ); + if (r != ERROR_SUCCESS) + return r; + + reduced = MSI_CreateRecord( col_count ); + if (!reduced) + return ERROR_FUNCTION_FAILED; + + for (i = 0; i < col_count; i++) + { + r = MSI_RecordCopyField( rec, i + offset + 1, reduced, i + 1 ); + if (r != ERROR_SUCCESS) + break; + } + + offset += col_count; + reduced_mask = mask >> (jv->columns - offset) & ((1 << col_count) - 1); + + if (r == ERROR_SUCCESS) + r = table->view->ops->set_row( table->view, row, reduced, reduced_mask ); + + msiobj_release( &reduced->hdr ); + } + + return r; +} + +static UINT join_modify_update( struct tagMSIVIEW *view, MSIRECORD *rec ) +{ + MSIJOINVIEW *jv = (MSIJOINVIEW *)view; + UINT r, row; + + r = join_find_row( jv, rec, &row ); + if (r != ERROR_SUCCESS) + return r; + + return JOIN_set_row( view, row, rec, (1 << jv->columns) - 1 ); +} + +static UINT JOIN_modify( struct tagMSIVIEW *view, MSIMODIFY mode, MSIRECORD *rec, UINT row ) +{ + UINT r; + + TRACE("%p %d %p %u\n", view, mode, rec, row); + + switch (mode) + { + case MSIMODIFY_UPDATE: + return join_modify_update( view, rec ); + + case MSIMODIFY_ASSIGN: + case MSIMODIFY_DELETE: + case MSIMODIFY_INSERT: + case MSIMODIFY_INSERT_TEMPORARY: + case MSIMODIFY_MERGE: + case MSIMODIFY_REPLACE: + case MSIMODIFY_SEEK: + case MSIMODIFY_VALIDATE: + case MSIMODIFY_VALIDATE_DELETE: + case MSIMODIFY_VALIDATE_FIELD: + case MSIMODIFY_VALIDATE_NEW: + r = ERROR_FUNCTION_FAILED; + break; + + case MSIMODIFY_REFRESH: + r = ERROR_CALL_NOT_IMPLEMENTED; + break; + + default: + WARN("%p %d %p %u - unknown mode\n", view, mode, rec, row ); + r = ERROR_INVALID_PARAMETER; + break; + } + + return r; +} + static UINT JOIN_delete( struct tagMSIVIEW *view ) { MSIJOINVIEW *jv = (MSIJOINVIEW*)view; @@ -259,7 +368,7 @@ static UINT JOIN_find_matching_rows( struct tagMSIVIEW *view, UINT col, if (col == 0 || col > jv->columns) return ERROR_INVALID_PARAMETER; - for (i = (UINT)*handle; i < jv->rows; i++) + for (i = PtrToUlong(*handle); i < jv->rows; i++) { if (view->ops->fetch_int( view, i, col, &row_value ) != ERROR_SUCCESS) continue; diff --git a/reactos/dll/win32/msi/msi.rc b/reactos/dll/win32/msi/msi.rc index 89d524c18e1..dfccd08a9a3 100644 --- a/reactos/dll/win32/msi/msi.rc +++ b/reactos/dll/win32/msi/msi.rc @@ -48,6 +48,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "msi_Si.rc" #include "msi_Sv.rc" #include "msi_Tr.rc" +#include "msi_Uk.rc" #include "msi_Zh.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/reactos/dll/win32/msi/msi_Uk.rc b/reactos/dll/win32/msi/msi_Uk.rc new file mode 100644 index 00000000000..4b7173e8d4a --- /dev/null +++ b/reactos/dll/win32/msi/msi_Uk.rc @@ -0,0 +1,41 @@ +/* + * Ukrainian resources for MSI + * + * Copyright 2005 Mike McCormack + * Copyright 2007 Artem Reznikov + * Copyright 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "windef.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + 4 "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вказаний пакет інÑталÑції. Перевірте шлÑÑ… до файлу та Ñпробуйте знов." + 5 "шлÑÑ… %s не знайдено" + 9 "вÑтавте диÑк %s" + 10 "невірні параметри" + 11 "вкажіть папку, що міÑтить %s" + 12 "джерело вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¾Ñ— можливоÑті не вказане" + 13 "мережевий диÑк Ð´Ð»Ñ Ð´Ð°Ð½Ð¾Ñ— можливоÑті не вказаний" + 14 "можливіÑть з:" + 15 "виберіть папку, що міÑтить %s" +} diff --git a/reactos/dll/win32/msi/msipriv.h b/reactos/dll/win32/msi/msipriv.h index ac247ac4548..43486e0a830 100644 --- a/reactos/dll/win32/msi/msipriv.h +++ b/reactos/dll/win32/msi/msipriv.h @@ -689,7 +689,6 @@ extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si /* action internals */ extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR ); -extern void ACTION_free_package_structures( MSIPACKAGE* ); extern UINT ACTION_DialogBox( MSIPACKAGE*, LPCWSTR); extern UINT ACTION_ForceReboot(MSIPACKAGE *package); extern UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR szTable, INT iSequenceMode ); diff --git a/reactos/dll/win32/msi/msiquery.c b/reactos/dll/win32/msi/msiquery.c index ddbb28d6496..b673832b0c4 100644 --- a/reactos/dll/win32/msi/msiquery.c +++ b/reactos/dll/win32/msi/msiquery.c @@ -831,7 +831,7 @@ UINT WINAPI MsiDatabaseCommit( MSIHANDLE hdb ) return ERROR_INVALID_HANDLE; IWineMsiRemoteDatabase_Release( remote_database ); - WARN("MsiDatabaseCommit not allowed during a custom action!\n"); + WARN("not allowed during a custom action!\n"); return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/package.c b/reactos/dll/win32/msi/package.c index 120972fdd07..53804e22e56 100644 --- a/reactos/dll/win32/msi/package.c +++ b/reactos/dll/win32/msi/package.c @@ -49,6 +49,237 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); +static void remove_tracked_tempfiles( MSIPACKAGE *package ) +{ + struct list *item, *cursor; + + LIST_FOR_EACH_SAFE( item, cursor, &package->tempfiles ) + { + MSITEMPFILE *temp = LIST_ENTRY( item, MSITEMPFILE, entry ); + + list_remove( &temp->entry ); + TRACE("deleting temp file %s\n", debugstr_w( temp->Path )); + if (!DeleteFileW( temp->Path )) + ERR("failed to delete %s\n", debugstr_w( temp->Path )); + msi_free( temp->Path ); + msi_free( temp ); + } +} + +static void free_feature( MSIFEATURE *feature ) +{ + struct list *item, *cursor; + + LIST_FOR_EACH_SAFE( item, cursor, &feature->Children ) + { + FeatureList *fl = LIST_ENTRY( item, FeatureList, entry ); + list_remove( &fl->entry ); + msi_free( fl ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &feature->Components ) + { + ComponentList *cl = LIST_ENTRY( item, ComponentList, entry ); + list_remove( &cl->entry ); + msi_free( cl ); + } + msi_free( feature->Feature ); + msi_free( feature->Feature_Parent ); + msi_free( feature->Directory ); + msi_free( feature->Description ); + msi_free( feature->Title ); + msi_free( feature ); +} + +static void free_extension( MSIEXTENSION *ext ) +{ + struct list *item, *cursor; + + LIST_FOR_EACH_SAFE( item, cursor, &ext->verbs ) + { + MSIVERB *verb = LIST_ENTRY( item, MSIVERB, entry ); + + list_remove( &verb->entry ); + msi_free( verb->Verb ); + msi_free( verb->Command ); + msi_free( verb->Argument ); + msi_free( verb ); + } + + msi_free( ext->Extension ); + msi_free( ext->ProgIDText ); + msi_free( ext ); +} + +static void free_package_structures( MSIPACKAGE *package ) +{ + INT i; + struct list *item, *cursor; + + TRACE("Freeing package action data\n"); + + remove_tracked_tempfiles(package); + + LIST_FOR_EACH_SAFE( item, cursor, &package->features ) + { + MSIFEATURE *feature = LIST_ENTRY( item, MSIFEATURE, entry ); + list_remove( &feature->entry ); + free_feature( feature ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->folders ) + { + MSIFOLDER *folder = LIST_ENTRY( item, MSIFOLDER, entry ); + + list_remove( &folder->entry ); + msi_free( folder->Parent ); + msi_free( folder->Directory ); + msi_free( folder->TargetDefault ); + msi_free( folder->SourceLongPath ); + msi_free( folder->SourceShortPath ); + msi_free( folder->ResolvedTarget ); + msi_free( folder->ResolvedSource ); + msi_free( folder->Property ); + msi_free( folder ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->components ) + { + MSICOMPONENT *comp = LIST_ENTRY( item, MSICOMPONENT, entry ); + + list_remove( &comp->entry ); + msi_free( comp->Component ); + msi_free( comp->ComponentId ); + msi_free( comp->Directory ); + msi_free( comp->Condition ); + msi_free( comp->KeyPath ); + msi_free( comp->FullKeypath ); + msi_free( comp ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->files ) + { + MSIFILE *file = LIST_ENTRY( item, MSIFILE, entry ); + + list_remove( &file->entry ); + msi_free( file->File ); + msi_free( file->FileName ); + msi_free( file->ShortName ); + msi_free( file->LongName ); + msi_free( file->Version ); + msi_free( file->Language ); + msi_free( file->TargetPath ); + msi_free( file ); + } + + /* clean up extension, progid, class and verb structures */ + LIST_FOR_EACH_SAFE( item, cursor, &package->classes ) + { + MSICLASS *cls = LIST_ENTRY( item, MSICLASS, entry ); + + list_remove( &cls->entry ); + msi_free( cls->clsid ); + msi_free( cls->Context ); + msi_free( cls->Description ); + msi_free( cls->FileTypeMask ); + msi_free( cls->IconPath ); + msi_free( cls->DefInprocHandler ); + msi_free( cls->DefInprocHandler32 ); + msi_free( cls->Argument ); + msi_free( cls->ProgIDText ); + msi_free( cls ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->extensions ) + { + MSIEXTENSION *ext = LIST_ENTRY( item, MSIEXTENSION, entry ); + + list_remove( &ext->entry ); + free_extension( ext ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->progids ) + { + MSIPROGID *progid = LIST_ENTRY( item, MSIPROGID, entry ); + + list_remove( &progid->entry ); + msi_free( progid->ProgID ); + msi_free( progid->Description ); + msi_free( progid->IconPath ); + msi_free( progid ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->mimes ) + { + MSIMIME *mt = LIST_ENTRY( item, MSIMIME, entry ); + + list_remove( &mt->entry ); + msi_free( mt->clsid ); + msi_free( mt->ContentType ); + msi_free( mt ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->appids ) + { + MSIAPPID *appid = LIST_ENTRY( item, MSIAPPID, entry ); + + list_remove( &appid->entry ); + msi_free( appid->AppID ); + msi_free( appid->RemoteServerName ); + msi_free( appid->LocalServer ); + msi_free( appid->ServiceParameters ); + msi_free( appid->DllSurrogate ); + msi_free( appid ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->sourcelist_info ) + { + MSISOURCELISTINFO *info = LIST_ENTRY( item, MSISOURCELISTINFO, entry ); + + list_remove( &info->entry ); + msi_free( info->value ); + msi_free( info ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->sourcelist_media ) + { + MSIMEDIADISK *info = LIST_ENTRY( item, MSIMEDIADISK, entry ); + + list_remove( &info->entry ); + msi_free( info->volume_label ); + msi_free( info->disk_prompt ); + msi_free( info ); + } + + if (package->script) + { + for (i = 0; i < TOTAL_SCRIPTS; i++) + msi_free_action_script( package, i ); + + for (i = 0; i < package->script->UniqueActionsCount; i++) + msi_free( package->script->UniqueActions[i] ); + + msi_free( package->script->UniqueActions ); + msi_free( package->script ); + } + + if (package->patch) + { + msi_free( package->patch->patchcode ); + msi_free( package->patch->transforms ); + msi_free( package->patch ); + } + + msi_free( package->BaseURL ); + msi_free( package->PackagePath ); + msi_free( package->ProductCode ); + msi_free( package->ActionFormat ); + msi_free( package->LastAction ); + + /* cleanup control event subscriptions */ + ControlEvent_CleanupSubscriptions( package ); +} + static void MSI_FreePackage( MSIOBJECTHDR *arg) { MSIPACKAGE *package= (MSIPACKAGE*) arg; @@ -57,7 +288,7 @@ static void MSI_FreePackage( MSIOBJECTHDR *arg) msi_dialog_destroy( package->dialog ); msiobj_release( &package->db->hdr ); - ACTION_free_package_structures(package); + free_package_structures(package); } static UINT create_temp_property_table(MSIPACKAGE *package) diff --git a/reactos/dll/win32/msi/storages.c b/reactos/dll/win32/msi/storages.c index a54d46fc76e..6a8134b5627 100644 --- a/reactos/dll/win32/msi/storages.c +++ b/reactos/dll/win32/msi/storages.c @@ -452,7 +452,7 @@ static UINT STORAGES_find_matching_rows(struct tagMSIVIEW *view, UINT col, UINT val, UINT *row, MSIITERHANDLE *handle) { MSISTORAGESVIEW *sv = (MSISTORAGESVIEW *)view; - UINT index = (UINT)*handle; + UINT index = PtrToUlong(*handle); TRACE("(%d, %d): %d\n", *row, col, val); @@ -470,7 +470,7 @@ static UINT STORAGES_find_matching_rows(struct tagMSIVIEW *view, UINT col, index++; } - *handle = (MSIITERHANDLE)++index; + *handle = UlongToPtr(++index); if (index >= sv->num_rows) return ERROR_NO_MORE_ITEMS; diff --git a/reactos/dll/win32/msi/streams.c b/reactos/dll/win32/msi/streams.c index 4825ae67b18..8d2e748e64d 100644 --- a/reactos/dll/win32/msi/streams.c +++ b/reactos/dll/win32/msi/streams.c @@ -41,7 +41,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb); typedef struct tabSTREAM { UINT str_index; - LPWSTR name; IStream *stream; } STREAM; @@ -72,7 +71,6 @@ static STREAM *create_stream(MSISTREAMSVIEW *sv, LPWSTR name, BOOL encoded, IStr { STREAM *stream; WCHAR decoded[MAX_STREAM_NAME_LEN]; - LPWSTR ptr = name; stream = msi_alloc(sizeof(STREAM)); if (!stream) @@ -81,18 +79,11 @@ static STREAM *create_stream(MSISTREAMSVIEW *sv, LPWSTR name, BOOL encoded, IStr if (encoded) { decode_streamname(name, decoded); - ptr = decoded; TRACE("stream -> %s %s\n", debugstr_w(name), debugstr_w(decoded)); + name = decoded; } - stream->name = strdupW(ptr); - if (!stream->name) - { - msi_free(stream); - return NULL; - } - - stream->str_index = msi_addstringW(sv->db->strings, 0, stream->name, -1, 1, StringNonPersistent); + stream->str_index = msi_addstringW(sv->db->strings, 0, name, -1, 1, StringNonPersistent); stream->stream = stm; return stream; } @@ -133,9 +124,9 @@ static UINT STREAMS_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec { MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view; - FIXME("%p %d %p\n", sv, row, rec); + TRACE("%p %d %p\n", sv, row, rec); - return ERROR_CALL_NOT_IMPLEMENTED; + return msi_view_get_row( sv->db, view, row, rec ); } static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask) @@ -144,13 +135,13 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U STREAM *stream; IStream *stm; STATSTG stat; - LPWSTR name = NULL; + LPWSTR encname = NULL, name = NULL; USHORT *data = NULL; HRESULT hr; ULONG count; UINT r = ERROR_FUNCTION_FAILED; - TRACE("(%p, %p)\n", view, rec); + TRACE("(%p, %d, %p, %08x)\n", view, row, rec, mask); if (row > sv->num_rows) return ERROR_FUNCTION_FAILED; @@ -167,7 +158,10 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U } if (stat.cbSize.QuadPart >> 32) + { + WARN("stream too large\n"); goto done; + } data = msi_alloc(stat.cbSize.QuadPart); if (!data) @@ -182,7 +176,13 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U name = strdupW(MSI_RecordGetString(rec, 1)); if (!name) + { + WARN("failed to retrieve stream name\n"); goto done; + } + + encname = encode_streamname(FALSE, name); + IStorage_DestroyElement(sv->db->storage, encname); r = write_stream_data(sv->db->storage, name, data, count, FALSE); if (r != ERROR_SUCCESS) @@ -195,14 +195,20 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U if (!stream) goto done; - IStorage_OpenStream(sv->db->storage, name, 0, - STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream); + hr = IStorage_OpenStream(sv->db->storage, encname, 0, + STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream); + if (FAILED(hr)) + { + WARN("failed to open stream: %08x\n", hr); + goto done; + } sv->streams[row] = stream; done: msi_free(name); msi_free(data); + msi_free(encname); IStream_Release(stm); @@ -212,6 +218,9 @@ done: static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary) { MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view; + UINT i; + + TRACE("(%p, %p, %d, %d)\n", view, rec, row, temporary); if (!streams_set_table_size(sv, ++sv->num_rows)) return ERROR_FUNCTION_FAILED; @@ -219,7 +228,11 @@ static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row if (row == -1) row = sv->num_rows - 1; - /* FIXME have to readjust rows */ + /* shift the rows to make room for the new row */ + for (i = sv->num_rows - 1; i > row; i--) + { + sv->streams[i] = sv->streams[i - 1]; + } return STREAMS_set_row(view, row, rec, 0); } @@ -274,7 +287,7 @@ static UINT STREAMS_get_column_info(struct tagMSIVIEW *view, UINT n, { case 1: name_ptr = Name; - if (type) *type = MSITYPE_STRING | MAX_STREAM_NAME_LEN; + if (type) *type = MSITYPE_STRING | MSITYPE_VALID | MAX_STREAM_NAME_LEN; break; case 2: @@ -404,8 +417,6 @@ static UINT STREAMS_delete(struct tagMSIVIEW *view) { if (sv->streams[i]->stream) IStream_Release(sv->streams[i]->stream); - - msi_free(sv->streams[i]->name); msi_free(sv->streams[i]); } } @@ -420,9 +431,9 @@ static UINT STREAMS_find_matching_rows(struct tagMSIVIEW *view, UINT col, UINT val, UINT *row, MSIITERHANDLE *handle) { MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view; - UINT index = (UINT)*handle; + UINT index = PtrToUlong(*handle); - TRACE("(%d, %d): %d\n", *row, col, val); + TRACE("(%p, %d, %d, %p, %p)\n", view, col, val, row, handle); if (col == 0 || col > NUM_STREAMS_COLS) return ERROR_INVALID_PARAMETER; @@ -438,8 +449,9 @@ static UINT STREAMS_find_matching_rows(struct tagMSIVIEW *view, UINT col, index++; } - *handle = (MSIITERHANDLE)++index; - if (index >= sv->num_rows) + *handle = UlongToPtr(++index); + + if (index > sv->num_rows) return ERROR_NO_MORE_ITEMS; return ERROR_SUCCESS; @@ -510,10 +522,17 @@ static INT add_streams_to_table(MSISTREAMSVIEW *sv) break; } - IStorage_OpenStream(sv->db->storage, stat.pwcsName, 0, - STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream); + hr = IStorage_OpenStream(sv->db->storage, stat.pwcsName, 0, + STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream); CoTaskMemFree(stat.pwcsName); + if (FAILED(hr)) + { + WARN("failed to open stream: %08x\n", hr); + count = -1; + break; + } + if (!streams_set_table_size(sv, ++count)) { count = -1; diff --git a/reactos/include/psdk/msi.h b/reactos/include/psdk/msi.h index 2c0a37fe43b..5c2f38cc824 100644 --- a/reactos/include/psdk/msi.h +++ b/reactos/include/psdk/msi.h @@ -597,6 +597,10 @@ UINT WINAPI MsiSourceListEnumSourcesA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, UINT WINAPI MsiSourceListEnumSourcesW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWSTR, LPDWORD); #define MsiSourceListEnumSources WINELIB_NAME_AW(MsiSourceListEnumSources) +UINT WINAPI MsiSourceListClearSourceA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR); +UINT WINAPI MsiSourceListClearSourceW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, LPCWSTR); +#define MsiSourceListClearSource WINELIB_NAME_AW(MsiSourceListClearSource) + UINT WINAPI MsiSourceListClearAllA(LPCSTR, LPCSTR, DWORD); UINT WINAPI MsiSourceListClearAllW(LPCWSTR, LPCWSTR, DWORD); #define MsiSourceListClearAll WINELIB_NAME_AW(MsiSourceListClearAll) From 4cead51c5f21e949a8fae7e0d851537fb86bbed4 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 6 Feb 2010 21:29:15 +0000 Subject: [PATCH 02/97] [MSI_WINETEST] sync msi_winetest to wine 1.1.38 svn path=/trunk/; revision=45469 --- rostests/winetests/msi/db.c | 149 +++++++++- rostests/winetests/msi/install.c | 481 ++++++++++++++++++++++++++++++- rostests/winetests/msi/package.c | 8 + rostests/winetests/msi/record.c | 1 - 4 files changed, 630 insertions(+), 9 deletions(-) diff --git a/rostests/winetests/msi/db.c b/rostests/winetests/msi/db.c index d3e9ad1c376..037be7da080 100644 --- a/rostests/winetests/msi/db.c +++ b/rostests/winetests/msi/db.c @@ -1454,8 +1454,30 @@ static void test_streamtable(void) MsiViewClose( view ); MsiCloseHandle( view ); + /* insert another one */ + create_file( "test1.txt" ); + + rec = MsiCreateRecord( 2 ); + MsiRecordSetString( rec, 1, "data1" ); + + r = MsiRecordSetStream( rec, 2, "test1.txt" ); + ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r); + + DeleteFile("test1.txt"); + r = MsiDatabaseOpenView( hdb, - "SELECT `Name`, `Data` FROM `_Streams`", &view ); + "INSERT INTO `_Streams` ( `Name`, `Data` ) VALUES ( ?, ? )", &view ); + ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r); + + r = MsiViewExecute( view, rec ); + ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r); + + MsiCloseHandle( rec ); + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = MsiDatabaseOpenView( hdb, + "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data'", &view ); ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r); r = MsiViewExecute( view, 0 ); @@ -1476,10 +1498,76 @@ static void test_streamtable(void) ok( !lstrcmp(buf, "test.txt\n"), "Expected 'test.txt\\n', got %s\n", buf); MsiCloseHandle( rec ); + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = MsiDatabaseOpenView( hdb, + "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data1'", &view ); + ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r); + + r = MsiViewExecute( view, 0 ); + ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r); r = MsiViewFetch( view, &rec ); - ok( r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + size = MAX_PATH; + r = MsiRecordGetString( rec, 1, file, &size ); + ok( r == ERROR_SUCCESS, "Failed to get string: %d\n", r); + ok( !lstrcmp(file, "data1"), "Expected 'data1', got %s\n", file); + + size = MAX_PATH; + memset(buf, 0, MAX_PATH); + r = MsiRecordReadStream( rec, 2, buf, &size ); + ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r); + ok( !lstrcmp(buf, "test1.txt\n"), "Expected 'test1.txt\\n', got %s\n", buf); + + MsiCloseHandle( rec ); + MsiViewClose( view ); + MsiCloseHandle( view ); + + /* perform an update */ + create_file( "test2.txt" ); + rec = MsiCreateRecord( 1 ); + + r = MsiRecordSetStream( rec, 1, "test2.txt" ); + ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r); + + DeleteFile("test2.txt"); + + r = MsiDatabaseOpenView( hdb, + "UPDATE `_Streams` SET `Data` = ? WHERE `Name` = 'data1'", &view ); + ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r); + + r = MsiViewExecute( view, rec ); + ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r); + + MsiCloseHandle( rec ); + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = MsiDatabaseOpenView( hdb, + "SELECT `Name`, `Data` FROM `_Streams` WHERE `Name` = 'data1'", &view ); + ok( r == ERROR_SUCCESS, "Failed to open database view: %d\n", r); + + r = MsiViewExecute( view, 0 ); + ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "Failed to fetch record: %d\n", r); + + size = MAX_PATH; + r = MsiRecordGetString( rec, 1, file, &size ); + ok( r == ERROR_SUCCESS, "Failed to get string: %d\n", r); + ok( !lstrcmp(file, "data1"), "Expected 'data1', got %s\n", file); + + size = MAX_PATH; + memset(buf, 0, MAX_PATH); + r = MsiRecordReadStream( rec, 2, buf, &size ); + ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r); + todo_wine ok( !lstrcmp(buf, "test2.txt\n"), "Expected 'test2.txt\\n', got %s\n", buf); + + MsiCloseHandle( rec ); MsiViewClose( view ); MsiCloseHandle( view ); MsiCloseHandle( hdb ); @@ -3645,6 +3733,63 @@ static void test_join(void) ok( r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r ); + /* try updating a row in a join table */ + query = "SELECT `Component`.`ComponentId`, `FeatureComponents`.`Feature_` " + "FROM `Component`, `FeatureComponents` " + "WHERE `Component`.`Component` = `FeatureComponents`.`Component_` " + "ORDER BY `Feature_`"; + r = MsiDatabaseOpenView(hdb, query, &hview); + ok( r == ERROR_SUCCESS, "failed to open view: %d\n", r ); + + r = MsiViewExecute(hview, 0); + ok( r == ERROR_SUCCESS, "failed to execute view: %d\n", r ); + + r = MsiViewFetch(hview, &hrec); + ok( r == ERROR_SUCCESS, "failed to fetch view: %d\n", r ); + + r = MsiRecordSetString( hrec, 1, "epicranius" ); + ok( r == ERROR_SUCCESS, "failed to set string: %d\n", r ); + + r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); + ok( r == ERROR_SUCCESS, "failed to update row: %d\n", r ); + + /* try another valid operation for joins */ + r = MsiViewModify(hview, MSIMODIFY_REFRESH, hrec); + todo_wine ok( r == ERROR_SUCCESS, "failed to refresh row: %d\n", r ); + + /* try an invalid operation for joins */ + r = MsiViewModify(hview, MSIMODIFY_DELETE, hrec); + ok( r == ERROR_FUNCTION_FAILED, "unexpected result: %d\n", r ); + + r = MsiRecordSetString( hrec, 2, "epicranius" ); + ok( r == ERROR_SUCCESS, "failed to set string: %d\n", r ); + + /* primary key cannot be updated */ + r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); + todo_wine ok( r == ERROR_FUNCTION_FAILED, "failed to update row: %d\n", r ); + + MsiCloseHandle(hrec); + MsiViewClose(hview); + MsiCloseHandle(hview); + + r = MsiDatabaseOpenView(hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + + size = MAX_PATH; + r = MsiRecordGetString( hrec, 1, buf, &size ); + ok( r == ERROR_SUCCESS, "failed to get record string: %d\n", r ); + ok( !lstrcmp( buf, "epicranius" ), "expected 'epicranius', got %s\n", buf ); + + MsiCloseHandle(hrec); + MsiViewClose(hview); + MsiCloseHandle(hview); + MsiCloseHandle(hdb); DeleteFile(msifile); } diff --git a/rostests/winetests/msi/install.c b/rostests/winetests/msi/install.c index 68f9266ea13..a3f1897352e 100644 --- a/rostests/winetests/msi/install.c +++ b/rostests/winetests/msi/install.c @@ -226,7 +226,36 @@ static const CHAR environment_dat[] = "Environment\tName\tValue\tComponent_\n" "Var7\t!-MSITESTVAR7\t\tOne\n" "Var8\t!-*MSITESTVAR8\t\tOne\n" "Var9\t=-MSITESTVAR9\t\tOne\n" - "Var10\t=MSITESTVAR10\t\tOne\n"; + "Var10\t=MSITESTVAR10\t\tOne\n" + "Var11\t+-MSITESTVAR11\t[~];1\tOne\n" + "Var12\t+-MSITESTVAR11\t[~];2\tOne\n" + "Var13\t+-MSITESTVAR12\t[~];1\tOne\n" + "Var14\t=MSITESTVAR13\t[~];1\tOne\n" + "Var15\t=MSITESTVAR13\t[~];2\tOne\n" + "Var16\t=MSITESTVAR14\t;1;\tOne\n" + "Var17\t=MSITESTVAR15\t;;1;;\tOne\n" + "Var18\t=MSITESTVAR16\t 1 \tOne\n" + "Var19\t+-MSITESTVAR17\t1\tOne\n" + "Var20\t+-MSITESTVAR17\t;;2;;[~]\tOne\n" + "Var21\t+-MSITESTVAR18\t1\tOne\n" + "Var22\t+-MSITESTVAR18\t[~];;2;;\tOne\n" + "Var23\t+-MSITESTVAR19\t1\tOne\n" + "Var24\t+-MSITESTVAR19\t[~]2\tOne\n" + "Var25\t+-MSITESTVAR20\t1\tOne\n" + "Var26\t+-MSITESTVAR20\t2[~]\tOne\n"; + +/* Expected results, starting from MSITESTVAR11 onwards */ +static const CHAR *environment_dat_results[] = {"1;2", /*MSITESTVAR11*/ + "1", /*MSITESTVAR12*/ + "1;2", /*MSITESTVAR13*/ + ";1;", /*MSITESTVAR14*/ + ";;1;;", /*MSITESTVAR15*/ + " 1 ", /*MSITESTVAR16*/ + ";;2;;1", /*MSITESTVAR17*/ + "1;;2;;", /*MSITESTVAR18*/ + "1", /*MSITESTVAR19*/ + "1", /*MSITESTVAR20*/ + NULL}; static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n" "s38\ti2\tS255\n" @@ -320,6 +349,30 @@ static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArgument "ServiceControl\tServiceControl\n" "ServiceControl\tTestService\t8\t\t0\tservice_comp"; +static const CHAR sss_service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" + "s72\tl255\ti2\tL255\tI2\ts72\n" + "ServiceControl\tServiceControl\n" + "ServiceControl\tSpooler\t1\t\t0\tservice_comp"; + +static const CHAR sss_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "CostFinalize\t\t1000\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "ResolveSource\t\t950\n" + "MoveFiles\t\t1700\n" + "InstallFiles\t\t4000\n" + "DuplicateFiles\t\t4500\n" + "WriteEnvironmentStrings\t\t4550\n" + "CreateShortcuts\t\t4600\n" + "StartServices\t\t5000\n" + "DeleteServices\t\t5500\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n"; + /* tables for test_continuouscabs */ static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" @@ -785,7 +838,8 @@ static const CHAR df_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestNam "s72\ts72\ts72\tS255\tS72\n" "DuplicateFile\tFileKey\n" "maximus\tmaximus\tmaximus\taugustus\t\n" - "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n"; + "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n" + "augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n"; static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" @@ -1034,6 +1088,87 @@ static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISCom "CustomAction\tAction\n" "TestAllUsersProp\t19\t\tTest failed\t\n"; +static const CHAR cf_create_folders_dat[] = "Directory_\tComponent_\n" + "s72\ts72\n" + "CreateFolder\tDirectory_\tComponent_\n" + "MSITESTDIR\tOne\n"; + +static const CHAR cf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "CostFinalize\t\t1000\n" + "ValidateProductID\t\t700\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "RemoveFiles\t\t3500\n" + "CreateFolders\t\t3700\n" + "InstallExecute\t\t3800\n" + "TestCreateFolders\t\t3900\n" + "InstallFiles\t\t4000\n" + "RegisterUser\t\t6000\n" + "RegisterProduct\t\t6100\n" + "PublishFeatures\t\t6300\n" + "PublishProduct\t\t6400\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "UnpublishFeatures\t\t1800\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n"; + +static const CHAR cf_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "TestCreateFolders\t19\t\tHalts installation\t\n"; + +static const CHAR rf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "CostFinalize\t\t1000\n" + "ValidateProductID\t\t700\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "RemoveFiles\t\t3500\n" + "CreateFolders\t\t3600\n" + "RemoveFolders\t\t3700\n" + "InstallExecute\t\t3800\n" + "TestCreateFolders\t\t3900\n" + "InstallFiles\t\t4000\n" + "RegisterUser\t\t6000\n" + "RegisterProduct\t\t6100\n" + "PublishFeatures\t\t6300\n" + "PublishProduct\t\t6400\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "UnpublishFeatures\t\t1800\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n"; + + +static const CHAR sr_selfreg_dat[] = "File_\tCost\n" + "s72\tI2\n" + "SelfReg\tFile_\n" + "one.txt\t1\n"; + +static const CHAR sr_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "CostFinalize\t\t1000\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "ResolveSource\t\t950\n" + "MoveFiles\t\t1700\n" + "SelfUnregModules\t\t3900\n" + "InstallFiles\t\t4000\n" + "DuplicateFiles\t\t4500\n" + "WriteEnvironmentStrings\t\t4550\n" + "CreateShortcuts\t\t4600\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n"; + typedef struct _msi_table { const CHAR *filename; @@ -1737,6 +1872,73 @@ static const msi_table fiuc_tables[] = ADD_TABLE(property), }; +static const msi_table cf_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(cf_create_folders), + ADD_TABLE(cf_install_exec_seq), + ADD_TABLE(cf_custom_action), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rf_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(cf_create_folders), + ADD_TABLE(rf_install_exec_seq), + ADD_TABLE(cf_custom_action), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table sss_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(sss_install_exec_seq), + ADD_TABLE(sss_service_control), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table sds_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(sss_install_exec_seq), + ADD_TABLE(service_control), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table sr_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(sr_selfreg), + ADD_TABLE(sr_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + /* cabinet definitions */ /* make the max size large so there is only one cab file */ @@ -6732,6 +6934,7 @@ static void test_envvar(void) LONG res; DWORD type, size; char buffer[16]; + UINT i; if (on_win9x) { @@ -6800,8 +7003,27 @@ static void test_envvar(void) res = RegDeleteValueA(env, "MSITESTVAR10"); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - RegCloseKey(env); + i = 11; + while (environment_dat_results[(i-11)]) { + char name[20]; + sprintf(name, "MSITESTVAR%d", i); + type = REG_NONE; + size = sizeof(buffer); + buffer[0] = 0; + res = RegQueryValueExA(env, name, NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "%d: Expected ERROR_SUCCESS, got %d\n", i, res); + ok(type == REG_SZ, "%d: Expected REG_SZ, got %u\n", i, type); + ok(!lstrcmp(buffer, environment_dat_results[(i-11)]), "%d: Expected %s, got %s\n", + i, environment_dat_results[(i-11)], buffer); + + res = RegDeleteValueA(env, name); + ok(res == ERROR_SUCCESS, "%d: Expected ERROR_SUCCESS, got %d\n", i, res); + i++; + } + + + RegCloseKey(env); delete_pf("msitest\\cabout\\new\\five.txt", TRUE); delete_pf("msitest\\cabout\\new", FALSE); delete_pf("msitest\\cabout\\four.txt", TRUE); @@ -6836,9 +7058,9 @@ static void test_preselected(void) ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); ok(!delete_pf("msitest\\first", FALSE), "File installed\n"); ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); - todo_wine ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - todo_wine ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -6988,7 +7210,31 @@ static void test_allusers_prop(void) /* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */ r = MsiInstallProductA(msifile, "FULL=1"); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + if (r == ERROR_SUCCESS) + { + /* Win9x/WinMe */ + win_skip("Win9x and WinMe act differently with respect to ALLUSERS\n"); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + delete_test_files(); + } + else + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); } static char session_manager[] = "System\\CurrentControlSet\\Control\\Session Manager"; @@ -7237,6 +7483,223 @@ static void test_MsiSetExternalUI(void) ok(!error, "MsiSetExternalUIRecord failed %u\n", error); } +static void test_feature_override(void) +{ + UINT r; + + create_test_files(); + create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); + + r = MsiInstallProductA(msifile, "ADDLOCAL=One"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\cabout\\new", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\cabout", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\changed", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\first", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + delete_test_files(); +} + +static void test_create_folder(void) +{ + UINT r; + + create_test_files(); + create_database(msifile, cf_tables, sizeof(cf_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); + todo_wine ok(!delete_pf("msitest", FALSE), "Directory created\n"); + + delete_test_files(); +} + +static void test_remove_folder(void) +{ + UINT r; + + create_test_files(); + create_database(msifile, rf_tables, sizeof(rf_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); + ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); + ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); + + delete_test_files(); +} + +static void test_start_services(void) +{ + UINT r; + SC_HANDLE scm, service; + BOOL ret; + DWORD error = ERROR_SUCCESS; + + if (on_win9x) + { + win_skip("Services are not implemented on Win9x and WinMe\n"); + return; + } + scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + ok(scm != NULL, "Failed to open the SC Manager\n"); + if (!scm) return; + + service = OpenService(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + if (!service && GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST) + { + win_skip("The 'Spooler' service does not exist\n"); + CloseServiceHandle(scm); + return; + } + ok(service != NULL, "Failed to open Spooler, error %d\n", GetLastError()); + if (!service) { + CloseServiceHandle(scm); + return; + } + + ret = StartService(service, 0, NULL); + if (!ret && (error = GetLastError()) != ERROR_SERVICE_ALREADY_RUNNING) + { + skip("Terminal service not available, skipping test\n"); + CloseServiceHandle(service); + CloseServiceHandle(scm); + return; + } + + CloseServiceHandle(service); + CloseServiceHandle(scm); + + create_test_files(); + create_database(msifile, sss_tables, sizeof(sss_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + delete_test_files(); + + if (error == ERROR_SUCCESS) + { + SERVICE_STATUS status; + + scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + service = OpenService(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + + ret = ControlService(service, SERVICE_CONTROL_STOP, &status); + ok(ret, "ControlService failed %u\n", GetLastError()); + + CloseServiceHandle(service); + CloseServiceHandle(scm); + } +} + +static void test_delete_services(void) +{ + UINT r; + + create_test_files(); + create_database(msifile, sds_tables, sizeof(sds_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + delete_test_files(); +} + +static void test_self_registration(void) +{ + UINT r; + + create_test_files(); + create_database(msifile, sr_tables, sizeof(sr_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + delete_test_files(); +} + START_TEST(install) { DWORD len; @@ -7327,6 +7790,12 @@ START_TEST(install) test_file_in_use_cab(); test_MsiSetExternalUI(); test_allusers_prop(); + test_feature_override(); + test_create_folder(); + test_remove_folder(); + test_start_services(); + test_delete_services(); + test_self_registration(); DeleteFileA(log_file); diff --git a/rostests/winetests/msi/package.c b/rostests/winetests/msi/package.c index 979de1af3d0..ddb3522e94d 100644 --- a/rostests/winetests/msi/package.c +++ b/rostests/winetests/msi/package.c @@ -1047,6 +1047,14 @@ static void test_settargetpath(void) ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); ok( !lstrcmpi(buffer, "C:\\one\\two\\"), "Expected C:\\one\\two\\, got %s\n", buffer); + r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two\\three" ); + ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); + + sz = sizeof buffer - 1; + r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); + ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); + ok( !lstrcmpi(buffer, "C:\\one\\two\\three\\"), "Expected C:\\one\\two\\three\\, got %s\n", buffer); + MsiCloseHandle( hpkg ); } diff --git a/rostests/winetests/msi/record.c b/rostests/winetests/msi/record.c index 369c855bb4b..0b807797215 100644 --- a/rostests/winetests/msi/record.c +++ b/rostests/winetests/msi/record.c @@ -334,7 +334,6 @@ static void test_msirecord(void) ok(r == ERROR_SUCCESS, "failed to add stream to record\n"); r = MsiRecordReadStream(h, 1, buf, NULL); ok(r == ERROR_INVALID_PARAMETER, "should return error\n"); - /* http://test.winehq.org/data/200503181000/98_jmelgarejo98casa/msi:record.txt */ DeleteFile(filename); /* Windows 98 doesn't like this at all, so don't check return. */ r = MsiRecordReadStream(h, 1, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "should return error\n"); From 6f10f0d34b46a3fa87861dee609b514139dde7cb Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 6 Feb 2010 21:34:28 +0000 Subject: [PATCH 03/97] [MSXML3] sync msxml3 to wine 1.1.38 svn path=/trunk/; revision=45470 --- reactos/dll/win32/msxml3/attribute.c | 4 +- reactos/dll/win32/msxml3/bsc.c | 10 +-- reactos/dll/win32/msxml3/cdata.c | 51 +++++++++-- reactos/dll/win32/msxml3/comment.c | 53 ++++++++++-- reactos/dll/win32/msxml3/docfrag.c | 4 +- reactos/dll/win32/msxml3/domdoc.c | 53 +++++++----- reactos/dll/win32/msxml3/domimpl.c | 4 +- reactos/dll/win32/msxml3/element.c | 52 +++++++---- reactos/dll/win32/msxml3/entityref.c | 4 +- reactos/dll/win32/msxml3/factory.c | 3 +- reactos/dll/win32/msxml3/httprequest.c | 4 +- reactos/dll/win32/msxml3/msxml_private.h | 2 +- reactos/dll/win32/msxml3/node.c | 8 +- reactos/dll/win32/msxml3/nodelist.c | 4 +- reactos/dll/win32/msxml3/nodemap.c | 10 +-- reactos/dll/win32/msxml3/parseerror.c | 4 +- reactos/dll/win32/msxml3/pi.c | 4 +- reactos/dll/win32/msxml3/queryresult.c | 2 +- reactos/dll/win32/msxml3/regsvr.c | 6 +- reactos/dll/win32/msxml3/saxreader.c | 87 +++++++++---------- reactos/dll/win32/msxml3/schema.c | 4 +- reactos/dll/win32/msxml3/text.c | 51 +++++++++-- reactos/dll/win32/msxml3/xmldoc.c | 68 ++++++++++----- reactos/dll/win32/msxml3/xmlelem.c | 105 +++++++++++++---------- reactos/include/psdk/msxml2.idl | 8 ++ 25 files changed, 400 insertions(+), 205 deletions(-) diff --git a/reactos/dll/win32/msxml3/attribute.c b/reactos/dll/win32/msxml3/attribute.c index 6df849ee373..04b8c46cb4e 100644 --- a/reactos/dll/win32/msxml3/attribute.c +++ b/reactos/dll/win32/msxml3/attribute.c @@ -94,7 +94,7 @@ static ULONG WINAPI domattr_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -546,7 +546,7 @@ IUnknown* create_attribute( xmlNodePtr attribute ) { domattr *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/bsc.c b/reactos/dll/win32/msxml3/bsc.c index 1914ca88fa4..b24e04ca25a 100644 --- a/reactos/dll/win32/msxml3/bsc.c +++ b/reactos/dll/win32/msxml3/bsc.c @@ -93,11 +93,9 @@ static ULONG WINAPI bsc_Release( TRACE("(%p) ref=%d\n", This, ref); if(!ref) { - if(This->binding) - IBinding_Release(This->binding); - if(This->memstream) - IStream_Release(This->memstream); - HeapFree(GetProcessHeap(), 0, This); + if (This->binding) IBinding_Release(This->binding); + if (This->memstream) IStream_Release(This->memstream); + heap_free(This); } return ref; @@ -270,7 +268,7 @@ HRESULT bind_url(LPCWSTR url, HRESULT (*onDataAvailable)(void*,char*,DWORD), voi if(FAILED(hr)) return hr; - bsc = HeapAlloc(GetProcessHeap(), 0, sizeof(bsc_t)); + bsc = heap_alloc(sizeof(bsc_t)); bsc->lpVtbl = &bsc_vtbl; bsc->ref = 1; diff --git a/reactos/dll/win32/msxml3/cdata.c b/reactos/dll/win32/msxml3/cdata.c index 04b539d70bc..7d02a946a0c 100644 --- a/reactos/dll/win32/msxml3/cdata.c +++ b/reactos/dll/win32/msxml3/cdata.c @@ -101,7 +101,7 @@ static ULONG WINAPI domcdata_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -606,7 +606,7 @@ static HRESULT WINAPI domcdata_appendData( } else hr = E_FAIL; - HeapFree(GetProcessHeap(), 0, pContent); + heap_free(pContent); return hr; } @@ -667,7 +667,7 @@ static HRESULT WINAPI domcdata_insertData( xmlNodeSetContent(This->node.node, str); hr = S_OK; } - HeapFree(GetProcessHeap(), 0, str); + heap_free(str); SysFreeString(sNewString); } @@ -684,8 +684,47 @@ static HRESULT WINAPI domcdata_deleteData( IXMLDOMCDATASection *iface, LONG offset, LONG count) { - FIXME("\n"); - return E_NOTIMPL; + HRESULT hr; + LONG len = -1; + BSTR str; + + TRACE("%p %d %d\n", iface, offset, count); + + hr = IXMLDOMCDATASection_get_length(iface, &len); + if(hr != S_OK) return hr; + + if((offset < 0) || (offset > len) || (count < 0)) + return E_INVALIDARG; + + if(len == 0) return S_OK; + + /* cutting start or end */ + if((offset == 0) || ((count + offset) >= len)) + { + if(offset == 0) + IXMLDOMCDATASection_substringData(iface, count, len - count, &str); + else + IXMLDOMCDATASection_substringData(iface, 0, offset, &str); + hr = IXMLDOMCDATASection_put_data(iface, str); + } + else + /* cutting from the inside */ + { + BSTR str_end; + + IXMLDOMCDATASection_substringData(iface, 0, offset, &str); + IXMLDOMCDATASection_substringData(iface, offset + count, len - count, &str_end); + + hr = IXMLDOMCDATASection_put_data(iface, str); + if(hr == S_OK) + hr = IXMLDOMCDATASection_appendData(iface, str_end); + + SysFreeString(str_end); + } + + SysFreeString(str); + + return hr; } static HRESULT WINAPI domcdata_replaceData( @@ -765,7 +804,7 @@ IUnknown* create_cdata( xmlNodePtr text ) { domcdata *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/comment.c b/reactos/dll/win32/msxml3/comment.c index 09e3c8a4e18..1e3b965e84a 100644 --- a/reactos/dll/win32/msxml3/comment.c +++ b/reactos/dll/win32/msxml3/comment.c @@ -95,7 +95,7 @@ static ULONG WINAPI domcomment_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -541,7 +541,7 @@ static HRESULT WINAPI domcomment_substringData( LONG nLength = 0; HRESULT hr = S_FALSE; - TRACE("%p\n", iface); + TRACE("%p %d %d %p\n", iface, offset, count, p); if(!p) return E_INVALIDARG; @@ -551,7 +551,7 @@ static HRESULT WINAPI domcomment_substringData( return E_INVALIDARG; if(count == 0) - return hr; + return S_FALSE; pContent = xmlNodeGetContent(This->node.node); if(pContent) @@ -630,7 +630,7 @@ static HRESULT WINAPI domcomment_insertData( LONG nLength = 0, nLengthP = 0; xmlChar *str = NULL; - TRACE("%p\n", This); + TRACE("%p %d %p\n", iface, offset, p); /* If have a NULL or empty string, don't do anything. */ if(SysStringLen(p) == 0) @@ -692,8 +692,47 @@ static HRESULT WINAPI domcomment_deleteData( IXMLDOMComment *iface, LONG offset, LONG count) { - FIXME("\n"); - return E_NOTIMPL; + HRESULT hr; + LONG len = -1; + BSTR str; + + TRACE("%p %d %d\n", iface, offset, count); + + hr = IXMLDOMComment_get_length(iface, &len); + if(hr != S_OK) return hr; + + if((offset < 0) || (offset > len) || (count < 0)) + return E_INVALIDARG; + + if(len == 0) return S_OK; + + /* cutting start or end */ + if((offset == 0) || ((count + offset) >= len)) + { + if(offset == 0) + IXMLDOMComment_substringData(iface, count, len - count, &str); + else + IXMLDOMComment_substringData(iface, 0, offset, &str); + hr = IXMLDOMComment_put_data(iface, str); + } + else + /* cutting from the inside */ + { + BSTR str_end; + + IXMLDOMComment_substringData(iface, 0, offset, &str); + IXMLDOMComment_substringData(iface, offset + count, len - count, &str_end); + + hr = IXMLDOMComment_put_data(iface, str); + if(hr == S_OK) + hr = IXMLDOMComment_appendData(iface, str_end); + + SysFreeString(str_end); + } + + SysFreeString(str); + + return hr; } static HRESULT WINAPI domcomment_replaceData( @@ -763,7 +802,7 @@ IUnknown* create_comment( xmlNodePtr comment ) { domcomment *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/docfrag.c b/reactos/dll/win32/msxml3/docfrag.c index f5ac1aa7e55..b5f6e464799 100644 --- a/reactos/dll/win32/msxml3/docfrag.c +++ b/reactos/dll/win32/msxml3/docfrag.c @@ -94,7 +94,7 @@ static ULONG WINAPI domfrag_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -519,7 +519,7 @@ IUnknown* create_doc_fragment( xmlNodePtr fragment ) { domfrag *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/domdoc.c b/reactos/dll/win32/msxml3/domdoc.c index be19e566ff4..4914a7c0064 100644 --- a/reactos/dll/win32/msxml3/domdoc.c +++ b/reactos/dll/win32/msxml3/domdoc.c @@ -119,7 +119,7 @@ static inline xmldoc_priv * priv_from_xmlDocPtr(xmlDocPtr doc) static xmldoc_priv * create_priv(void) { xmldoc_priv *priv; - priv = HeapAlloc( GetProcessHeap(), 0, sizeof (*priv) ); + priv = heap_alloc( sizeof (*priv) ); if(priv) { @@ -164,9 +164,9 @@ LONG xmldoc_release(xmlDocPtr doc) LIST_FOR_EACH_ENTRY_SAFE( orphan, orphan2, &priv->orphans, orphan_entry, entry ) { xmlFreeNode( orphan->node ); - HeapFree( GetProcessHeap(), 0, orphan ); + heap_free( orphan ); } - HeapFree(GetProcessHeap(), 0, doc->_private); + heap_free(doc->_private); xmlFreeDoc(doc); } @@ -179,7 +179,7 @@ HRESULT xmldoc_add_orphan(xmlDocPtr doc, xmlNodePtr node) xmldoc_priv *priv = priv_from_xmlDocPtr(doc); orphan_entry *entry; - entry = HeapAlloc( GetProcessHeap(), 0, sizeof (*entry) ); + entry = heap_alloc( sizeof (*entry) ); if(!entry) return E_OUTOFMEMORY; @@ -198,7 +198,7 @@ HRESULT xmldoc_remove_orphan(xmlDocPtr doc, xmlNodePtr node) if( entry->node == node ) { list_remove( &entry->entry ); - HeapFree( GetProcessHeap(), 0, entry ); + heap_free( entry ); return S_OK; } } @@ -1041,7 +1041,7 @@ static HRESULT WINAPI domdoc_createElement( TRACE("created xmlptr %p\n", xmlnode); elem_unk = create_element(xmlnode); - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); hr = IUnknown_QueryInterface(elem_unk, &IID_IXMLDOMElement, (void **)element); IUnknown_Release(elem_unk); @@ -1094,7 +1094,7 @@ static HRESULT WINAPI domdoc_createTextNode( xml_content = xmlChar_from_wchar(data); xmlnode = xmlNewText(xml_content); - HeapFree(GetProcessHeap(), 0, xml_content); + heap_free(xml_content); if(!xmlnode) return E_FAIL; @@ -1126,7 +1126,7 @@ static HRESULT WINAPI domdoc_createComment( xml_content = xmlChar_from_wchar(data); xmlnode = xmlNewComment(xml_content); - HeapFree(GetProcessHeap(), 0, xml_content); + heap_free(xml_content); if(!xmlnode) return E_FAIL; @@ -1158,7 +1158,7 @@ static HRESULT WINAPI domdoc_createCDATASection( xml_content = xmlChar_from_wchar(data); xmlnode = xmlNewCDataBlock(get_doc( This ), xml_content, strlen( (char*)xml_content) ); - HeapFree(GetProcessHeap(), 0, xml_content); + heap_free(xml_content); if(!xmlnode) return E_FAIL; @@ -1199,8 +1199,8 @@ static HRESULT WINAPI domdoc_createProcessingInstruction( TRACE("created xmlptr %p\n", xmlnode); *pi = (IXMLDOMProcessingInstruction*)create_pi(xmlnode); - HeapFree(GetProcessHeap(), 0, xml_content); - HeapFree(GetProcessHeap(), 0, xml_target); + heap_free(xml_content); + heap_free(xml_target); return S_OK; #else @@ -1228,7 +1228,7 @@ static HRESULT WINAPI domdoc_createAttribute( xml_name = xmlChar_from_wchar(name); xmlnode = (xmlNode *)xmlNewProp(NULL, xml_name, NULL); - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); if(!xmlnode) return E_FAIL; @@ -1260,7 +1260,7 @@ static HRESULT WINAPI domdoc_createEntityReference( xml_name = xmlChar_from_wchar(name); xmlnode = xmlNewReference(get_doc( This ), xml_name ); - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); if(!xmlnode) return E_FAIL; @@ -1279,17 +1279,28 @@ static HRESULT WINAPI domdoc_getElementsByTagName( BSTR tagName, IXMLDOMNodeList** resultList ) { + static const WCHAR xpathformat[] = + { '/','/','*','[','l','o','c','a','l','-','n','a','m','e','(',')','=','\'','%','s','\'',']',0 }; domdoc *This = impl_from_IXMLDOMDocument2( iface ); LPWSTR szPattern; HRESULT hr; TRACE("(%p)->(%s, %p)\n", This, debugstr_w(tagName), resultList); - szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(2+lstrlenW(tagName)+1)); - szPattern[0] = szPattern[1] = '/'; - lstrcpyW(szPattern + 2, tagName); + if (tagName[0] == '*' && tagName[1] == 0) + { + szPattern = heap_alloc(sizeof(WCHAR)*4); + szPattern[0] = szPattern[1] = '/'; + szPattern[2] = '*'; + szPattern[3] = 0; + } + else + { + szPattern = heap_alloc(sizeof(WCHAR)*(20+lstrlenW(tagName)+1)); + wsprintfW(szPattern, xpathformat, tagName); + } hr = queryresult_create((xmlNodePtr)get_doc(This), szPattern, resultList); - HeapFree(GetProcessHeap(), 0, szPattern); + heap_free(szPattern); return hr; } @@ -1359,7 +1370,7 @@ static HRESULT WINAPI domdoc_createNode( break; } - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); if(xmlnode && *node) { @@ -1588,7 +1599,7 @@ static BOOL bstr_to_utf8( BSTR bstr, char **pstr, int *plen ) LPSTR str; len = WideCharToMultiByte( CP_UTF8, 0, bstr, blen, NULL, 0, NULL, NULL ); - str = HeapAlloc( GetProcessHeap(), 0, len ); + str = heap_alloc( len ); if ( !str ) return FALSE; WideCharToMultiByte( CP_UTF8, 0, bstr, blen, str, len, NULL, NULL ); @@ -1619,7 +1630,7 @@ static HRESULT WINAPI domdoc_loadXML( if ( bstrXML && bstr_to_utf8( bstrXML, &str, &len ) ) { xmldoc = doparse( str, len ); - HeapFree( GetProcessHeap(), 0, str ); + heap_free( str ); if ( !xmldoc ) This->error = E_FAIL; else @@ -2193,7 +2204,7 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **docu { domdoc *doc; - doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) ); + doc = heap_alloc( sizeof (*doc) ); if( !doc ) return E_OUTOFMEMORY; diff --git a/reactos/dll/win32/msxml3/domimpl.c b/reactos/dll/win32/msxml3/domimpl.c index b0b1cdead0e..1a07676e33f 100644 --- a/reactos/dll/win32/msxml3/domimpl.c +++ b/reactos/dll/win32/msxml3/domimpl.c @@ -89,7 +89,7 @@ static ULONG WINAPI dimimpl_Release( ref = InterlockedDecrement( &This->ref ); if ( ref == 0 ) { - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -216,7 +216,7 @@ IUnknown* create_doc_Implementation(void) { domimpl *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/element.c b/reactos/dll/win32/msxml3/element.c index 63bf7af1d4b..f7bd3b03e08 100644 --- a/reactos/dll/win32/msxml3/element.c +++ b/reactos/dll/win32/msxml3/element.c @@ -502,7 +502,7 @@ static HRESULT WINAPI domelem_get_tagName( len = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->name, -1, NULL, 0 ); if (element->ns) len += MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->ns->prefix, -1, NULL, 0 ); - str = HeapAlloc( GetProcessHeap(), 0, len * sizeof (WCHAR) ); + str = heap_alloc( len * sizeof (WCHAR) ); if ( !str ) return E_OUTOFMEMORY; if (element->ns) @@ -512,7 +512,7 @@ static HRESULT WINAPI domelem_get_tagName( } MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->name, -1, str + offset, len - offset ); *p = SysAllocString( str ); - HeapFree( GetProcessHeap(), 0, str ); + heap_free( str ); return S_OK; } @@ -545,7 +545,7 @@ static HRESULT WINAPI domelem_getAttribute( else xml_value = xmlGetNsProp(element, xml_name, NULL); - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); if(xml_value) { V_VT(value) = VT_BSTR; @@ -587,8 +587,8 @@ static HRESULT WINAPI domelem_setAttribute( if(!xmlSetNsProp(element, NULL, xml_name, xml_value)) hr = E_FAIL; - HeapFree(GetProcessHeap(), 0, xml_value); - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_value); + heap_free(xml_name); VariantClear(&var); return hr; @@ -598,8 +598,19 @@ static HRESULT WINAPI domelem_removeAttribute( IXMLDOMElement *iface, BSTR p) { - FIXME("\n"); - return E_NOTIMPL; + domelem *This = impl_from_IXMLDOMElement( iface ); + IXMLDOMNamedNodeMap *attr; + HRESULT hr; + + TRACE("(%p)->(%s)", This, debugstr_w(p)); + + hr = IXMLDOMElement_get_attributes(iface, &attr); + if (hr != S_OK) return hr; + + hr = IXMLDOMNamedNodeMap_removeNamedItem(attr, p, NULL); + IXMLDOMNamedNodeMap_Release(attr); + + return hr; } static HRESULT WINAPI domelem_getAttributeNode( @@ -628,7 +639,7 @@ static HRESULT WINAPI domelem_getAttributeNode( if(!xmlValidateNameValue(xml_name)) { - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); return E_FAIL; } @@ -639,7 +650,7 @@ static HRESULT WINAPI domelem_getAttributeNode( IUnknown_Release(unk); } - HeapFree(GetProcessHeap(), 0, xml_name); + heap_free(xml_name); return hr; } @@ -666,6 +677,8 @@ static HRESULT WINAPI domelem_getElementsByTagName( IXMLDOMElement *iface, BSTR bstrName, IXMLDOMNodeList** resultList) { + static const WCHAR xpathformat[] = + { '.','/','/','*','[','l','o','c','a','l','-','n','a','m','e','(',')','=','\'','%','s','\'',']',0 }; domelem *This = impl_from_IXMLDOMElement( iface ); LPWSTR szPattern; xmlNodePtr element; @@ -673,10 +686,19 @@ static HRESULT WINAPI domelem_getElementsByTagName( TRACE("(%p)->(%s,%p)\n", This, debugstr_w(bstrName), resultList); - szPattern = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(3+lstrlenW(bstrName)+1)); - szPattern[0] = '.'; - szPattern[1] = szPattern[2] = '/'; - lstrcpyW(szPattern+3, bstrName); + if (bstrName[0] == '*' && bstrName[1] == 0) + { + szPattern = heap_alloc(sizeof(WCHAR)*5); + szPattern[0] = '.'; + szPattern[1] = szPattern[2] = '/'; + szPattern[3] = '*'; + szPattern[4] = 0; + } + else + { + szPattern = heap_alloc(sizeof(WCHAR)*(21+lstrlenW(bstrName)+1)); + wsprintfW(szPattern, xpathformat, bstrName); + } TRACE("%s\n", debugstr_w(szPattern)); element = get_element(This); @@ -684,7 +706,7 @@ static HRESULT WINAPI domelem_getElementsByTagName( hr = E_FAIL; else hr = queryresult_create(element, szPattern, resultList); - HeapFree(GetProcessHeap(), 0, szPattern); + heap_free(szPattern); return hr; } @@ -768,7 +790,7 @@ IUnknown* create_element( xmlNodePtr element ) { domelem *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/entityref.c b/reactos/dll/win32/msxml3/entityref.c index 7ba06c3d09b..1489dbd0c57 100644 --- a/reactos/dll/win32/msxml3/entityref.c +++ b/reactos/dll/win32/msxml3/entityref.c @@ -94,7 +94,7 @@ static ULONG WINAPI entityref_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -518,7 +518,7 @@ IUnknown* create_doc_entity_ref( xmlNodePtr entity ) { entityref *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/factory.c b/reactos/dll/win32/msxml3/factory.c index 37dfe01afcc..45ba3680c0f 100644 --- a/reactos/dll/win32/msxml3/factory.c +++ b/reactos/dll/win32/msxml3/factory.c @@ -147,7 +147,8 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) if( IsEqualCLSID( rclsid, &CLSID_DOMDocument ) || /* Version indep. v 2.x */ IsEqualCLSID( rclsid, &CLSID_DOMDocument2 ) || /* Version indep. v 3.0 */ - IsEqualCLSID( rclsid, &CLSID_DOMDocument30 ) ) /* Version dep. v 3.0 */ + IsEqualCLSID( rclsid, &CLSID_DOMDocument30 )|| /* Version dep. v 3.0 */ + IsEqualCLSID( rclsid, &CLSID_DOMDocument40 )) /* Version dep. v 4.0 */ { cf = (IClassFactory*) &domdoccf.lpVtbl; } diff --git a/reactos/dll/win32/msxml3/httprequest.c b/reactos/dll/win32/msxml3/httprequest.c index bc0fe7c3fb2..a477753a71a 100644 --- a/reactos/dll/win32/msxml3/httprequest.c +++ b/reactos/dll/win32/msxml3/httprequest.c @@ -83,7 +83,7 @@ static ULONG WINAPI httprequest_Release(IXMLHTTPRequest *iface) ref = InterlockedDecrement( &This->ref ); if ( ref == 0 ) { - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -317,7 +317,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, LPVOID *ppObj) TRACE("(%p,%p)\n", pUnkOuter, ppObj); - req = HeapAlloc( GetProcessHeap(), 0, sizeof (*req) ); + req = heap_alloc( sizeof (*req) ); if( !req ) return E_OUTOFMEMORY; diff --git a/reactos/dll/win32/msxml3/msxml_private.h b/reactos/dll/win32/msxml3/msxml_private.h index d62a8a467d2..e46642d84b6 100644 --- a/reactos/dll/win32/msxml3/msxml_private.h +++ b/reactos/dll/win32/msxml3/msxml_private.h @@ -135,7 +135,7 @@ extern LONG xmldoc_release( xmlDocPtr doc ); extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node ); extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node ); -extern HRESULT XMLElement_create( IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj ); +extern HRESULT XMLElement_create( IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj, BOOL own ); extern xmlDocPtr parse_xml(char *ptr, int len); diff --git a/reactos/dll/win32/msxml3/node.c b/reactos/dll/win32/msxml3/node.c index 82f4c5678f2..6729512d69e 100644 --- a/reactos/dll/win32/msxml3/node.c +++ b/reactos/dll/win32/msxml3/node.c @@ -130,7 +130,7 @@ static ULONG WINAPI xmlnode_Release( ref = InterlockedDecrement( &This->ref ); if(!ref) { destroy_xmlnode(This); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -354,7 +354,7 @@ static HRESULT WINAPI xmlnode_put_nodeValue( { str = xmlChar_from_wchar(V_BSTR(&string_value)); xmlNodeSetContent(This->node, str); - HeapFree(GetProcessHeap(),0,str); + heap_free(str); hr = S_OK; break; } @@ -920,7 +920,7 @@ static HRESULT WINAPI xmlnode_put_text( /* Escape the string. */ str2 = xmlEncodeEntitiesReentrant(This->node->doc, str); - HeapFree(GetProcessHeap(), 0, str); + heap_free(str); xmlNodeSetContent(This->node, str2); xmlFree(str2); @@ -1284,7 +1284,7 @@ static HRESULT WINAPI xmlnode_put_dataType( else ERR("Failed to Create Namepsace\n"); } - HeapFree( GetProcessHeap(), 0, str ); + heap_free( str ); } return hr; diff --git a/reactos/dll/win32/msxml3/nodelist.c b/reactos/dll/win32/msxml3/nodelist.c index e4ae604a5b9..011fff0bf61 100644 --- a/reactos/dll/win32/msxml3/nodelist.c +++ b/reactos/dll/win32/msxml3/nodelist.c @@ -104,7 +104,7 @@ static ULONG WINAPI xmlnodelist_Release( if ( ref == 0 ) { xmldoc_release( This->parent->doc ); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -314,7 +314,7 @@ IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node ) { xmlnodelist *nodelist; - nodelist = HeapAlloc( GetProcessHeap(), 0, sizeof *nodelist ); + nodelist = heap_alloc( sizeof *nodelist ); if ( !nodelist ) return NULL; diff --git a/reactos/dll/win32/msxml3/nodemap.c b/reactos/dll/win32/msxml3/nodemap.c index 825abef3149..91f7a323e5e 100644 --- a/reactos/dll/win32/msxml3/nodemap.c +++ b/reactos/dll/win32/msxml3/nodemap.c @@ -102,7 +102,7 @@ static ULONG WINAPI xmlnodemap_Release( if ( ref == 0 ) { IXMLDOMNode_Release( This->node ); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -191,7 +191,7 @@ xmlChar *xmlChar_from_wchar( LPWSTR str ) xmlChar *xmlstr; len = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL ); - xmlstr = HeapAlloc( GetProcessHeap(), 0, len ); + xmlstr = heap_alloc( len ); if ( xmlstr ) WideCharToMultiByte( CP_UTF8, 0, str, -1, (LPSTR) xmlstr, len, NULL, NULL ); return xmlstr; @@ -218,7 +218,7 @@ static HRESULT WINAPI xmlnodemap_getNamedItem( element_name = xmlChar_from_wchar( name ); attr = xmlHasNsProp( node, element_name, NULL ); - HeapFree( GetProcessHeap(), 0, element_name ); + heap_free( element_name ); if ( !attr ) { @@ -303,7 +303,7 @@ static HRESULT WINAPI xmlnodemap_removeNamedItem( element_name = xmlChar_from_wchar( name ); attr = xmlHasNsProp( node, element_name, NULL ); - HeapFree( GetProcessHeap(), 0, element_name ); + heap_free( element_name ); if ( !attr ) { @@ -531,7 +531,7 @@ IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node ) { xmlnodemap *nodemap; - nodemap = HeapAlloc( GetProcessHeap(), 0, sizeof *nodemap ); + nodemap = heap_alloc( sizeof *nodemap ); if ( !nodemap ) return NULL; diff --git a/reactos/dll/win32/msxml3/parseerror.c b/reactos/dll/win32/msxml3/parseerror.c index b78f82915e9..40b17a0f3d9 100644 --- a/reactos/dll/win32/msxml3/parseerror.c +++ b/reactos/dll/win32/msxml3/parseerror.c @@ -97,7 +97,7 @@ static ULONG WINAPI parseError_Release( SysFreeString(This->url); SysFreeString(This->reason); SysFreeString(This->srcText); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -283,7 +283,7 @@ IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR src { parse_error_t *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof(*This) ); + This = heap_alloc( sizeof(*This) ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/pi.c b/reactos/dll/win32/msxml3/pi.c index e814b8d1910..f32cebf8300 100644 --- a/reactos/dll/win32/msxml3/pi.c +++ b/reactos/dll/win32/msxml3/pi.c @@ -94,7 +94,7 @@ static ULONG WINAPI dom_pi_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -604,7 +604,7 @@ IUnknown* create_pi( xmlNodePtr pi ) { dom_pi *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/queryresult.c b/reactos/dll/win32/msxml3/queryresult.c index 50e8b79a83f..ab545968c08 100644 --- a/reactos/dll/win32/msxml3/queryresult.c +++ b/reactos/dll/win32/msxml3/queryresult.c @@ -413,7 +413,7 @@ cleanup: IXMLDOMNodeList_Release( (IXMLDOMNodeList*) &This->lpVtbl ); if (ctxt != NULL) xmlXPathFreeContext(ctxt); - HeapFree(GetProcessHeap(), 0, str); + heap_free(str); return hr; } diff --git a/reactos/dll/win32/msxml3/regsvr.c b/reactos/dll/win32/msxml3/regsvr.c index c8ae753c47d..d9b47dde89b 100644 --- a/reactos/dll/win32/msxml3/regsvr.c +++ b/reactos/dll/win32/msxml3/regsvr.c @@ -47,7 +47,7 @@ #include "wine/debug.h" #include "wine/unicode.h" -WINE_DEFAULT_DEBUG_CHANNEL(ole); +WINE_DEFAULT_DEBUG_CHANNEL(msxml); /* * Near the bottom of this file are the exported DllRegisterServer and @@ -702,7 +702,7 @@ static struct progid const progid_list[] = { }; /*********************************************************************** - * DllRegisterServer (OLEAUT32.@) + * DllRegisterServer (MSXML3.@) */ HRESULT WINAPI DllRegisterServer(void) { @@ -729,7 +729,7 @@ HRESULT WINAPI DllRegisterServer(void) } /*********************************************************************** - * DllUnregisterServer (OLEAUT32.@) + * DllUnregisterServer (MSXML3.@) */ HRESULT WINAPI DllUnregisterServer(void) { diff --git a/reactos/dll/win32/msxml3/saxreader.c b/reactos/dll/win32/msxml3/saxreader.c index 90600eb5a08..a3de7571694 100644 --- a/reactos/dll/win32/msxml3/saxreader.c +++ b/reactos/dll/win32/msxml3/saxreader.c @@ -126,6 +126,11 @@ static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface ) return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpSAXAttributesVtbl)); } +static inline BOOL has_content_handler(const saxlocator *locator) +{ + return (locator->vbInterface && locator->saxreader->vbcontentHandler) || + (!locator->vbInterface && locator->saxreader->contentHandler); +} static HRESULT namespacePush(saxlocator *locator, int ns) { @@ -161,13 +166,13 @@ static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len) dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0); if(len != -1) dLen++; - str = HeapAlloc(GetProcessHeap(), 0, dLen * sizeof (WCHAR)); + str = heap_alloc(dLen * sizeof (WCHAR)); if (!str) return NULL; MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, str, dLen); if(len != -1) str[dLen-1] = '\0'; bstr = SysAllocString(str); - HeapFree(GetProcessHeap(), 0, str); + heap_free(str); return bstr; } @@ -185,7 +190,7 @@ static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name) dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, NULL, 0) + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0); - str = HeapAlloc(GetProcessHeap(), 0, dLen * sizeof(WCHAR)); + str = heap_alloc(dLen * sizeof(WCHAR)); if(!str) return NULL; @@ -194,7 +199,7 @@ static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name) MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, &str[dLast], dLen-dLast); bstr = SysAllocString(str); - HeapFree(GetProcessHeap(), 0, str); + heap_free(str); return bstr; } @@ -624,12 +629,12 @@ static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface) SysFreeString(This->szQName[index]); } - HeapFree(GetProcessHeap(), 0, This->szLocalname); - HeapFree(GetProcessHeap(), 0, This->szURI); - HeapFree(GetProcessHeap(), 0, This->szValue); - HeapFree(GetProcessHeap(), 0, This->szQName); + heap_free(This->szLocalname); + heap_free(This->szURI); + heap_free(This->szValue); + heap_free(This->szQName); - HeapFree(GetProcessHeap(), 0, This); + heap_free(This); } return ref; @@ -914,7 +919,7 @@ static HRESULT SAXAttributes_create(saxattributes **attr, int index; static const xmlChar xmlns[] = "xmlns"; - attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes)); + attributes = heap_alloc(sizeof(*attributes)); if(!attributes) return E_OUTOFMEMORY; @@ -924,23 +929,19 @@ static HRESULT SAXAttributes_create(saxattributes **attr, attributes->nb_attributes = nb_namespaces+nb_attributes; - attributes->szLocalname = - HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes); - attributes->szURI = - HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes); - attributes->szValue = - HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes); - attributes->szQName = - HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes); + attributes->szLocalname = heap_alloc(sizeof(BSTR)*attributes->nb_attributes); + attributes->szURI = heap_alloc(sizeof(BSTR)*attributes->nb_attributes); + attributes->szValue = heap_alloc(sizeof(BSTR)*attributes->nb_attributes); + attributes->szQName = heap_alloc(sizeof(BSTR)*attributes->nb_attributes); if(!attributes->szLocalname || !attributes->szURI || !attributes->szValue || !attributes->szQName) { - HeapFree(GetProcessHeap(), 0, attributes->szLocalname); - HeapFree(GetProcessHeap(), 0, attributes->szURI); - HeapFree(GetProcessHeap(), 0, attributes->szValue); - HeapFree(GetProcessHeap(), 0, attributes->szQName); - HeapFree(GetProcessHeap(), 0, attributes); + heap_free(attributes->szLocalname); + heap_free(attributes->szURI); + heap_free(attributes->szValue); + heap_free(attributes->szQName); + heap_free(attributes); return E_FAIL; } @@ -978,8 +979,7 @@ static void libxmlStartDocument(void *ctx) saxlocator *This = ctx; HRESULT hr; - if((This->vbInterface && This->saxreader->vbcontentHandler) - || (!This->vbInterface && This->saxreader->contentHandler)) + if(has_content_handler(This)) { if(This->vbInterface) hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler); @@ -1003,8 +1003,7 @@ static void libxmlEndDocument(void *ctx) if(This->ret != S_OK) return; - if((This->vbInterface && This->saxreader->vbcontentHandler) - || (!This->vbInterface && This->saxreader->contentHandler)) + if(has_content_handler(This)) { if(This->vbInterface) hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler); @@ -1039,8 +1038,7 @@ static void libxmlStartElementNS( update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1); hr = namespacePush(This, nb_namespaces); - if(hr==S_OK && ((This->vbInterface && This->saxreader->vbcontentHandler) - || (!This->vbInterface && This->saxreader->contentHandler))) + if(hr==S_OK && has_content_handler(This)) { for(index=0; indexvbInterface && This->saxreader->vbcontentHandler) - || (!This->vbInterface && This->saxreader->contentHandler)) + if(has_content_handler(This)) { NamespaceUri = bstr_from_xmlChar(URI); LocalName = bstr_from_xmlChar(localname); @@ -1186,9 +1183,7 @@ static void libxmlCharacters( xmlChar *end; BOOL lastEvent = FALSE; - if((This->vbInterface && !This->saxreader->vbcontentHandler) - || (!This->vbInterface && !This->saxreader->contentHandler)) - return; + if(!(has_content_handler(This))) return; cur = (xmlChar*)ch; if(*(ch-1)=='\r') cur--; @@ -1320,7 +1315,7 @@ static void libxmlFatalError(void *ctx, const char *msg, ...) va_end(args); len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0); - wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len); + wszError = heap_alloc(sizeof(WCHAR)*len); if(wszError) MultiByteToWideChar(CP_UNIXCP, 0, message, -1, wszError, len); @@ -1334,7 +1329,7 @@ static void libxmlFatalError(void *ctx, const char *msg, ...) ISAXErrorHandler_fatalError(This->saxreader->errorHandler, (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL); - HeapFree(GetProcessHeap(), 0, wszError); + heap_free(wszError); xmlStopParser(This->pParserCtxt); This->ret = E_FAIL; @@ -1384,8 +1379,7 @@ static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len) if(change) *end = '\n'; - if((This->vbInterface && This->saxreader->vbcontentHandler) || - (!This->vbInterface && This->saxreader->contentHandler)) + if(has_content_handler(This)) { Chars = bstr_from_xmlCharN(cur, end-cur+1); if(This->vbInterface) @@ -1645,10 +1639,10 @@ static ULONG WINAPI isaxlocator_Release( { SysFreeString(This->publicId); SysFreeString(This->systemId); - HeapFree(GetProcessHeap(), 0, This->nsStack); + heap_free(This->nsStack); ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -1734,7 +1728,7 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B { saxlocator *locator; - locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) ); + locator = heap_alloc( sizeof (*locator) ); if( !locator ) return E_OUTOFMEMORY; @@ -1755,11 +1749,11 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B locator->ret = S_OK; locator->nsStackSize = 8; locator->nsStackLast = 0; - locator->nsStack = HeapAlloc(GetProcessHeap(), 0, locator->nsStackSize); + locator->nsStack = heap_alloc(locator->nsStackSize); if(!locator->nsStack) { ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl); - HeapFree(GetProcessHeap(), 0, locator); + heap_free(locator); return E_OUTOFMEMORY; } @@ -1787,6 +1781,7 @@ static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int siz return E_FAIL; } + xmlFree(locator->pParserCtxt->sax); locator->pParserCtxt->sax = &locator->saxreader->sax; locator->pParserCtxt->userData = locator; @@ -1852,7 +1847,6 @@ static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInt } This->isParsing = FALSE; - locator->pParserCtxt->sax = NULL; xmlFreeParserCtxt(locator->pParserCtxt); locator->pParserCtxt = NULL; ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl); @@ -2045,6 +2039,7 @@ static HRESULT internal_parse( hr = internal_parseBuffer(This, (const char*)bstrData, SysStringByteLen(bstrData), vbInterface); IXMLDOMDocument_Release(xmlDoc); + SysFreeString(bstrData); break; } if(IUnknown_QueryInterface(V_UNKNOWN(&varInput), @@ -2315,7 +2310,7 @@ static ULONG WINAPI saxxmlreader_Release( if(This->vbdeclHandler) IVBSAXDeclHandler_Release(This->vbdeclHandler); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -2810,7 +2805,7 @@ HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj) TRACE("(%p,%p)\n", pUnkOuter, ppObj); - reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) ); + reader = heap_alloc( sizeof (*reader) ); if( !reader ) return E_OUTOFMEMORY; diff --git a/reactos/dll/win32/msxml3/schema.c b/reactos/dll/win32/msxml3/schema.c index e71586e421a..f0a616979a0 100644 --- a/reactos/dll/win32/msxml3/schema.c +++ b/reactos/dll/win32/msxml3/schema.c @@ -86,7 +86,7 @@ static ULONG WINAPI schema_cache_Release( IXMLDOMSchemaCollection *iface ) if ( ref == 0 ) { - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -233,7 +233,7 @@ static const struct IXMLDOMSchemaCollectionVtbl schema_vtbl = HRESULT SchemaCache_create(IUnknown *pUnkOuter, LPVOID *ppObj) { - schema_t *schema = HeapAlloc( GetProcessHeap(), 0, sizeof (*schema) ); + schema_t *schema = heap_alloc( sizeof (*schema) ); if( !schema ) return E_OUTOFMEMORY; diff --git a/reactos/dll/win32/msxml3/text.c b/reactos/dll/win32/msxml3/text.c index 6380a0e50ce..70ca3efee33 100644 --- a/reactos/dll/win32/msxml3/text.c +++ b/reactos/dll/win32/msxml3/text.c @@ -103,7 +103,7 @@ static ULONG WINAPI domtext_Release( if ( ref == 0 ) { destroy_xmlnode(&This->node); - HeapFree( GetProcessHeap(), 0, This ); + heap_free( This ); } return ref; @@ -605,7 +605,7 @@ static HRESULT WINAPI domtext_appendData( hr = S_OK; else hr = E_FAIL; - HeapFree( GetProcessHeap(), 0, pContent ); + heap_free( pContent ); } else hr = E_FAIL; @@ -669,7 +669,7 @@ static HRESULT WINAPI domtext_insertData( xmlNodeSetContent(This->node.node, str); hr = S_OK; } - HeapFree(GetProcessHeap(), 0, str); + heap_free(str); SysFreeString(sNewString); } @@ -686,8 +686,47 @@ static HRESULT WINAPI domtext_deleteData( IXMLDOMText *iface, LONG offset, LONG count) { - FIXME("\n"); - return E_NOTIMPL; + HRESULT hr; + LONG len = -1; + BSTR str; + + TRACE("%p %d %d\n", iface, offset, count); + + hr = IXMLDOMText_get_length(iface, &len); + if(hr != S_OK) return hr; + + if((offset < 0) || (offset > len) || (count < 0)) + return E_INVALIDARG; + + if(len == 0) return S_OK; + + /* cutting start or end */ + if((offset == 0) || ((count + offset) >= len)) + { + if(offset == 0) + IXMLDOMText_substringData(iface, count, len - count, &str); + else + IXMLDOMText_substringData(iface, 0, offset, &str); + hr = IXMLDOMText_put_data(iface, str); + } + else + /* cutting from the inside */ + { + BSTR str_end; + + IXMLDOMText_substringData(iface, 0, offset, &str); + IXMLDOMText_substringData(iface, offset + count, len - count, &str_end); + + hr = IXMLDOMText_put_data(iface, str); + if(hr == S_OK) + hr = IXMLDOMText_appendData(iface, str_end); + + SysFreeString(str_end); + } + + SysFreeString(str); + + return hr; } static HRESULT WINAPI domtext_replaceData( @@ -767,7 +806,7 @@ IUnknown* create_text( xmlNodePtr text ) { domtext *This; - This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + This = heap_alloc( sizeof *This ); if ( !This ) return NULL; diff --git a/reactos/dll/win32/msxml3/xmldoc.c b/reactos/dll/win32/msxml3/xmldoc.c index 1a8c89404c5..d1a010f6485 100644 --- a/reactos/dll/win32/msxml3/xmldoc.c +++ b/reactos/dll/win32/msxml3/xmldoc.c @@ -54,7 +54,6 @@ typedef struct _xmldoc HRESULT error; /* IXMLDocument */ - IXMLElement *root; xmlDocPtr xmldoc; /* IPersistStream */ @@ -118,7 +117,7 @@ static ULONG WINAPI xmldoc_Release(IXMLDocument *iface) { xmlFreeDoc(This->xmldoc); if (This->stream) IStream_Release(This->stream); - HeapFree(GetProcessHeap(), 0, This); + heap_free(This); } return ref; @@ -198,17 +197,19 @@ static HRESULT WINAPI xmldoc_Invoke(IXMLDocument *iface, DISPID dispIdMember, static HRESULT WINAPI xmldoc_get_root(IXMLDocument *iface, IXMLElement **p) { xmldoc *This = impl_from_IXMLDocument(iface); + xmlNodePtr root; TRACE("(%p, %p)\n", iface, p); if (!p) return E_INVALIDARG; - *p = This->root; - if (!*p) + *p = NULL; + + if (!(root = xmlDocGetRootElement(This->xmldoc))) return E_FAIL; - return S_OK; + return XMLElement_create((IUnknown *)This, root, (LPVOID *)p, FALSE); } static HRESULT WINAPI xmldoc_get_fileSize(IXMLDocument *iface, BSTR *p) @@ -439,14 +440,32 @@ static HRESULT WINAPI xmldoc_put_charset(IXMLDocument *iface, BSTR p) static HRESULT WINAPI xmldoc_get_version(IXMLDocument *iface, BSTR *p) { - FIXME("(%p, %p): stub\n", iface, p); - return E_NOTIMPL; + xmldoc *This = impl_from_IXMLDocument(iface); + + TRACE("(%p, %p)\n", This, p); + + if (!p) return E_INVALIDARG; + *p = bstr_from_xmlChar(This->xmldoc->version); + + return S_OK; } static HRESULT WINAPI xmldoc_get_doctype(IXMLDocument *iface, BSTR *p) { - FIXME("(%p, %p): stub\n", iface, p); - return E_NOTIMPL; + xmldoc *This = impl_from_IXMLDocument(iface); + xmlDtd *dtd; + + TRACE("(%p, %p)\n", This, p); + + if (!p) return E_INVALIDARG; + + dtd = xmlGetIntSubset(This->xmldoc); + if (!dtd) return S_FALSE; + + *p = bstr_from_xmlChar(dtd->name); + CharUpperBuffW(*p, SysStringLen(*p)); + + return S_OK; } static HRESULT WINAPI xmldoc_get_dtdURl(IXMLDocument *iface, BSTR *p) @@ -501,7 +520,7 @@ static HRESULT WINAPI xmldoc_createElement(IXMLDocument *iface, VARIANT vType, node->type = type_msxml_to_libxml(V_I4(&vType)); /* FIXME: create xmlNodePtr based on vType and var1 */ - return XMLElement_create((IUnknown *)iface, node, (LPVOID *)ppElem); + return XMLElement_create((IUnknown *)iface, node, (LPVOID *)ppElem, TRUE); } static const struct IXMLDocumentVtbl xmldoc_vtbl = @@ -556,8 +575,13 @@ static ULONG WINAPI xmldoc_IPersistStreamInit_Release( static HRESULT WINAPI xmldoc_IPersistStreamInit_GetClassID( IPersistStreamInit *iface, CLSID *classid) { - FIXME("(%p,%p): stub!\n", iface, classid); - return E_NOTIMPL; + xmldoc *this = impl_from_IPersistStreamInit(iface); + TRACE("(%p,%p)\n", this, classid); + + if (!classid) return E_POINTER; + + *classid = CLSID_XMLDocument; + return S_OK; } static HRESULT WINAPI xmldoc_IPersistStreamInit_IsDirty( @@ -581,7 +605,6 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load( IPersistStreamInit *iface, LPSTREAM pStm) { xmldoc *This = impl_from_IPersistStreamInit(iface); - xmlNodePtr xmlnode; HRESULT hr; HGLOBAL hglobal; DWORD read, written, len; @@ -593,6 +616,8 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load( if (!pStm) return E_INVALIDARG; + /* release previously allocated stream */ + if (This->stream) IStream_Release(This->stream); hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream); if (FAILED(hr)) return hr; @@ -616,7 +641,10 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load( len = GlobalSize(hglobal); ptr = GlobalLock(hglobal); if (len != 0) + { + xmlFreeDoc(This->xmldoc); This->xmldoc = parse_xml(ptr, len); + } GlobalUnlock(hglobal); if (!This->xmldoc) @@ -625,8 +653,7 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Load( return E_FAIL; } - xmlnode = xmlDocGetRootElement(This->xmldoc); - return XMLElement_create((IUnknown *)This, xmlnode, (LPVOID *)&This->root); + return S_OK; } static HRESULT WINAPI xmldoc_IPersistStreamInit_Save( @@ -639,15 +666,17 @@ static HRESULT WINAPI xmldoc_IPersistStreamInit_Save( static HRESULT WINAPI xmldoc_IPersistStreamInit_GetSizeMax( IPersistStreamInit *iface, ULARGE_INTEGER *pcbSize) { - FIXME("(%p, %p): stub!\n", iface, pcbSize); + xmldoc *This = impl_from_IPersistStreamInit(iface); + TRACE("(%p, %p)\n", This, pcbSize); return E_NOTIMPL; } static HRESULT WINAPI xmldoc_IPersistStreamInit_InitNew( IPersistStreamInit *iface) { - FIXME("(%p): stub!\n", iface); - return E_NOTIMPL; + xmldoc *This = impl_from_IPersistStreamInit(iface); + TRACE("(%p)\n", This); + return S_OK; } static const IPersistStreamInitVtbl xmldoc_IPersistStreamInit_VTable = @@ -669,7 +698,7 @@ HRESULT XMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) TRACE("(%p,%p)\n", pUnkOuter, ppObj); - doc = HeapAlloc(GetProcessHeap(), 0, sizeof (*doc)); + doc = heap_alloc(sizeof (*doc)); if(!doc) return E_OUTOFMEMORY; @@ -677,7 +706,6 @@ HRESULT XMLDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) doc->lpvtblIPersistStreamInit = &xmldoc_IPersistStreamInit_VTable; doc->ref = 1; doc->error = S_OK; - doc->root = NULL; doc->xmldoc = NULL; doc->stream = NULL; diff --git a/reactos/dll/win32/msxml3/xmlelem.c b/reactos/dll/win32/msxml3/xmlelem.c index 93cc53a2047..3ff307b3abe 100644 --- a/reactos/dll/win32/msxml3/xmlelem.c +++ b/reactos/dll/win32/msxml3/xmlelem.c @@ -48,6 +48,7 @@ typedef struct _xmlelem const IXMLElementVtbl *lpVtbl; LONG ref; xmlNodePtr node; + BOOL own; } xmlelem; static inline xmlelem *impl_from_IXMLElement(IXMLElement *iface) @@ -94,7 +95,8 @@ static ULONG WINAPI xmlelem_Release(IXMLElement *iface) ref = InterlockedDecrement(&This->ref); if (ref == 0) { - HeapFree(GetProcessHeap(), 0, This); + if (This->own) xmlFreeNode(This->node); + heap_free(This); } return ref; @@ -171,31 +173,17 @@ static HRESULT WINAPI xmlelem_Invoke(IXMLElement *iface, DISPID dispIdMember, return hr; } -static inline BSTR str_dup_upper(BSTR str) -{ - INT len = (lstrlenW(str) + 1) * sizeof(WCHAR); - BSTR p = SysAllocStringLen(NULL, len); - if (p) - { - memcpy(p, str, len); - CharUpperW(p); - } - return p; -} - static HRESULT WINAPI xmlelem_get_tagName(IXMLElement *iface, BSTR *p) { xmlelem *This = impl_from_IXMLElement(iface); - BSTR temp; TRACE("(%p, %p)\n", iface, p); if (!p) return E_INVALIDARG; - temp = bstr_from_xmlChar(This->node->name); - *p = str_dup_upper(temp); - SysFreeString(temp); + *p = bstr_from_xmlChar(This->node->name); + CharUpperBuffW(*p, SysStringLen(*p)); TRACE("returning %s\n", debugstr_w(*p)); @@ -226,7 +214,7 @@ static HRESULT WINAPI xmlelem_get_parent(IXMLElement *iface, IXMLElement **paren if (!This->node->parent) return S_FALSE; - return XMLElement_create((IUnknown *)iface, This->node->parent, (LPVOID *)parent); + return XMLElement_create((IUnknown *)iface, This->node->parent, (LPVOID *)parent, FALSE); } static HRESULT WINAPI xmlelem_setAttribute(IXMLElement *iface, BSTR strPropertyName, @@ -245,8 +233,8 @@ static HRESULT WINAPI xmlelem_setAttribute(IXMLElement *iface, BSTR strPropertyN value = xmlChar_from_wchar(V_BSTR(&PropertyValue)); attr = xmlSetProp(This->node, name, value); - HeapFree(GetProcessHeap(), 0, name); - HeapFree(GetProcessHeap(), 0, value); + heap_free(name); + heap_free(value); return (attr) ? S_OK : S_FALSE; } @@ -287,7 +275,7 @@ static HRESULT WINAPI xmlelem_getAttribute(IXMLElement *iface, BSTR strPropertyN V_BSTR(PropertyValue) = bstr_from_xmlChar(val); } - HeapFree(GetProcessHeap(), 0, name); + heap_free(name); xmlFree(val); TRACE("returning %s\n", debugstr_w(V_BSTR(PropertyValue))); return (val) ? S_OK : S_FALSE; @@ -317,7 +305,7 @@ static HRESULT WINAPI xmlelem_removeAttribute(IXMLElement *iface, BSTR strProper hr = S_OK; done: - HeapFree(GetProcessHeap(), 0, name); + heap_free(name); return hr; } @@ -330,7 +318,7 @@ static HRESULT WINAPI xmlelem_get_children(IXMLElement *iface, IXMLElementCollec if (!p) return E_INVALIDARG; - return XMLElementCollection_create((IUnknown *)iface, This->node->children, (LPVOID *)p); + return XMLElementCollection_create((IUnknown *)iface, This->node, (LPVOID *)p); } static LONG type_libxml_to_msxml(xmlElementType type) @@ -402,7 +390,7 @@ static HRESULT WINAPI xmlelem_put_text(IXMLElement *iface, BSTR p) content = xmlChar_from_wchar(p); xmlNodeSetContent(This->node, content); - HeapFree( GetProcessHeap(), 0, content); + heap_free(content); return S_OK; } @@ -421,13 +409,31 @@ static HRESULT WINAPI xmlelem_addChild(IXMLElement *iface, IXMLElement *pChildEl else child = xmlAddNextSibling(This->node, childElem->node->last); + /* parent is responsible for child data */ + if (child) childElem->own = FALSE; + return (child) ? S_OK : S_FALSE; } static HRESULT WINAPI xmlelem_removeChild(IXMLElement *iface, IXMLElement *pChildElem) { - FIXME("(%p, %p): stub\n", iface, pChildElem); - return E_NOTIMPL; + xmlelem *This = impl_from_IXMLElement(iface); + xmlelem *childElem = impl_from_IXMLElement(pChildElem); + + TRACE("(%p, %p)\n", This, childElem); + + if (!pChildElem) + return E_INVALIDARG; + + /* only supported for This is childElem parent case */ + if (This->node != childElem->node->parent) + return E_INVALIDARG; + + xmlUnlinkNode(childElem->node); + /* standalone element now */ + childElem->own = TRUE; + + return S_OK; } static const struct IXMLElementVtbl xmlelem_vtbl = @@ -453,7 +459,7 @@ static const struct IXMLElementVtbl xmlelem_vtbl = xmlelem_removeChild }; -HRESULT XMLElement_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj) +HRESULT XMLElement_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj, BOOL own) { xmlelem *elem; @@ -464,13 +470,14 @@ HRESULT XMLElement_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj) *ppObj = NULL; - elem = HeapAlloc(GetProcessHeap(), 0, sizeof (*elem)); + elem = heap_alloc(sizeof (*elem)); if(!elem) return E_OUTOFMEMORY; elem->lpVtbl = &xmlelem_vtbl; elem->ref = 1; elem->node = node; + elem->own = own; *ppObj = &elem->lpVtbl; @@ -493,6 +500,19 @@ typedef struct _xmlelem_collection xmlNodePtr current; } xmlelem_collection; +static inline LONG xmlelem_collection_updatelength(xmlelem_collection *collection) +{ + xmlNodePtr ptr = collection->node->children; + + collection->length = 0; + while (ptr) + { + collection->length++; + ptr = ptr->next; + } + return collection->length; +} + static inline xmlelem_collection *impl_from_IXMLElementCollection(IXMLElementCollection *iface) { return (xmlelem_collection *)((char*)iface - FIELD_OFFSET(xmlelem_collection, lpVtbl)); @@ -546,7 +566,7 @@ static ULONG WINAPI xmlelem_collection_Release(IXMLElementCollection *iface) ref = InterlockedDecrement(&This->ref); if (ref == 0) { - HeapFree(GetProcessHeap(), 0, This); + heap_free(This); } return ref; @@ -597,7 +617,7 @@ static HRESULT WINAPI xmlelem_collection_get_length(IXMLElementCollection *iface if (!p) return E_INVALIDARG; - *p = This->length; + *p = xmlelem_collection_updatelength(This); return S_OK; } @@ -619,7 +639,7 @@ static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARI VARIANT var2, IDispatch **ppDisp) { xmlelem_collection *This = impl_from_IXMLElementCollection(iface); - xmlNodePtr ptr = This->node; + xmlNodePtr ptr = This->node->children; int index, i; TRACE("(%p, %p)\n", iface, ppDisp); @@ -632,13 +652,15 @@ static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARI index = V_I4(&var1); if (index < 0) return E_INVALIDARG; + + xmlelem_collection_updatelength(This); if (index >= This->length) return E_FAIL; for (i = 0; i < index; i++) ptr = ptr->next; - return XMLElement_create((IUnknown *)iface, ptr, (LPVOID *)ppDisp); + return XMLElement_create((IUnknown *)iface, ptr, (LPVOID *)ppDisp, FALSE); } static const struct IXMLElementCollectionVtbl xmlelem_collection_vtbl = @@ -698,7 +720,7 @@ static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Next( This->current = This->current->next; V_VT(rgVar) = VT_DISPATCH; - return XMLElement_create((IUnknown *)iface, ptr, (LPVOID *)&V_DISPATCH(rgVar)); + return XMLElement_create((IUnknown *)iface, ptr, (LPVOID *)&V_DISPATCH(rgVar), FALSE); } static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Skip( @@ -712,7 +734,7 @@ static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Reset( IEnumVARIANT *iface) { xmlelem_collection *This = impl_from_IEnumVARIANT(iface); - This->current = This->node; + This->current = This->node->children; return S_OK; } @@ -737,16 +759,15 @@ static const struct IEnumVARIANTVtbl xmlelem_collection_IEnumVARIANTvtbl = static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj) { xmlelem_collection *collection; - xmlNodePtr ptr; TRACE("(%p,%p)\n", pUnkOuter, ppObj); *ppObj = NULL; - if (!node) + if (!node->children) return S_FALSE; - collection = HeapAlloc(GetProcessHeap(), 0, sizeof (*collection)); + collection = heap_alloc(sizeof (*collection)); if(!collection) return E_OUTOFMEMORY; @@ -755,14 +776,8 @@ static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node, collection->ref = 1; collection->length = 0; collection->node = node; - collection->current = node; - - ptr = node; - while (ptr) - { - collection->length++; - ptr = ptr->next; - } + collection->current = node->children; + xmlelem_collection_updatelength(collection); *ppObj = &collection->lpVtbl; diff --git a/reactos/include/psdk/msxml2.idl b/reactos/include/psdk/msxml2.idl index e6f07b3b8b4..b6303c9f001 100644 --- a/reactos/include/psdk/msxml2.idl +++ b/reactos/include/psdk/msxml2.idl @@ -1070,6 +1070,14 @@ coclass DOMDocument30 [default, source] dispinterface XMLDOMDocumentEvents; } +[ + uuid(88d969c0-f192-11d4-a65f-0040963251e5) +] +coclass DOMDocument40 +{ + [default] interface IXMLDOMDocument2; + [default, source] dispinterface XMLDOMDocumentEvents; +} [ uuid(F6D90F12-9C73-11D3-B32E-00C04F990BB4) From 1829c939ad1205e7e99784f44ebbbdc00b38f8ed Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 6 Feb 2010 21:35:37 +0000 Subject: [PATCH 04/97] [MSXML3_WINETEST] sync msxml3_winetest to wine 1.1.38 svn path=/trunk/; revision=45471 --- rostests/winetests/msxml3/domdoc.c | 217 ++++++++++++++++++++++- rostests/winetests/msxml3/saxreader.c | 5 + rostests/winetests/msxml3/xmldoc.c | 240 ++++++++++++++++++++++---- rostests/winetests/msxml3/xmlelem.c | 157 +++++++++++++++-- 4 files changed, 571 insertions(+), 48 deletions(-) diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index 87ad9b563d6..bc052bea53f 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -509,8 +509,8 @@ static char *list_to_string(IXMLDOMNodeList *list) return buf; } -#define expect_node(node, expstr) { char str[4096]; node_to_string(node, str); ok(strcmp(str, expstr)==0, "Invalid node: %s, exptected %s\n", str, expstr); } -#define expect_list_and_release(list, expstr) { char *str = list_to_string(list); ok(strcmp(str, expstr)==0, "Invalid node list: %s, exptected %s\n", str, expstr); if (list) IXMLDOMNodeList_Release(list); } +#define expect_node(node, expstr) { char str[4096]; node_to_string(node, str); ok(strcmp(str, expstr)==0, "Invalid node: %s, expected %s\n", str, expstr); } +#define expect_list_and_release(list, expstr) { char *str = list_to_string(list); ok(strcmp(str, expstr)==0, "Invalid node list: %s, expected %s\n", str, expstr); if (list) IXMLDOMNodeList_Release(list); } static void test_domdoc( void ) { @@ -868,6 +868,77 @@ static void test_domdoc( void ) ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); SysFreeString(str); + /* delete data */ + /* invalid arguments */ + r = IXMLDOMText_deleteData(nodetext, -1, 1); + ok(r == E_INVALIDARG, "ret %08x\n", r ); + + r = IXMLDOMText_deleteData(nodetext, 0, 0); + ok(r == S_OK, "ret %08x\n", r ); + + r = IXMLDOMText_deleteData(nodetext, 0, -1); + ok(r == E_INVALIDARG, "ret %08x\n", r ); + + r = IXMLDOMText_get_length(nodetext, &nLength); + ok(r == S_OK, "ret %08x\n", r ); + ok(nLength == 43, "expected 43 got %d\n", nLength); + + r = IXMLDOMText_deleteData(nodetext, nLength, 1); + ok(r == S_OK, "ret %08x\n", r ); + + r = IXMLDOMText_deleteData(nodetext, nLength+1, 1); + ok(r == E_INVALIDARG, "ret %08x\n", r ); + + /* delete from start */ + r = IXMLDOMText_deleteData(nodetext, 0, 5); + ok(r == S_OK, "ret %08x\n", r ); + + r = IXMLDOMText_get_length(nodetext, &nLength); + ok(r == S_OK, "ret %08x\n", r ); + ok(nLength == 38, "expected 38 got %d\n", nLength); + + r = IXMLDOMText_get_text(nodetext, &str); + ok(r == S_OK, "ret %08x\n", r ); + /* whitespace preserving needs to be handled here */ + todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete from end */ + r = IXMLDOMText_deleteData(nodetext, 35, 3); + ok(r == S_OK, "ret %08x\n", r ); + + r = IXMLDOMText_get_length(nodetext, &nLength); + ok(r == S_OK, "ret %08x\n", r ); + ok(nLength == 35, "expected 35 got %d\n", nLength); + + r = IXMLDOMText_get_text(nodetext, &str); + ok(r == S_OK, "ret %08x\n", r ); + todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete from inside */ + r = IXMLDOMText_deleteData(nodetext, 1, 33); + ok(r == S_OK, "ret %08x\n", r ); + + r = IXMLDOMText_get_length(nodetext, &nLength); + ok(r == S_OK, "ret %08x\n", r ); + ok(nLength == 2, "expected 2 got %d\n", nLength); + + r = IXMLDOMText_get_text(nodetext, &str); + ok(r == S_OK, "ret %08x\n", r ); + todo_wine ok( !lstrcmpW( str, _bstr_("") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete whole data ... */ + r = IXMLDOMText_get_length(nodetext, &nLength); + ok(r == S_OK, "ret %08x\n", r ); + + r = IXMLDOMText_deleteData(nodetext, 0, nLength); + ok(r == S_OK, "ret %08x\n", r ); + /* ... and try again with empty string */ + r = IXMLDOMText_deleteData(nodetext, 0, nLength); + ok(r == S_OK, "ret %08x\n", r ); + /* test put_data */ V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(szstr1); @@ -1071,6 +1142,7 @@ static void test_domnode( void ) r = IXMLDOMNode_get_ownerDocument( element, &owner ); ok( r == S_OK, "get_ownerDocument return code\n"); ok( owner != doc, "get_ownerDocument return\n"); + IXMLDOMDocument_Release(owner); type = NODE_INVALID; r = IXMLDOMNode_get_nodeType( element, &type); @@ -2926,6 +2998,76 @@ static void test_xmlTypes(void) ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); SysFreeString(str); + /* delete data */ + /* invalid arguments */ + hr = IXMLDOMComment_deleteData(pComment, -1, 1); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + hr = IXMLDOMComment_deleteData(pComment, 0, 0); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMComment_deleteData(pComment, 0, -1); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + hr = IXMLDOMComment_get_length(pComment, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 43, "expected 43 got %d\n", len); + + hr = IXMLDOMComment_deleteData(pComment, len, 1); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMComment_deleteData(pComment, len+1, 1); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + /* delete from start */ + hr = IXMLDOMComment_deleteData(pComment, 0, 5); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMComment_get_length(pComment, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 38, "expected 38 got %d\n", len); + + hr = IXMLDOMComment_get_text(pComment, &str); + ok(hr == S_OK, "ret %08x\n", hr ); + ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete from end */ + hr = IXMLDOMComment_deleteData(pComment, 35, 3); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMComment_get_length(pComment, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 35, "expected 35 got %d\n", len); + + hr = IXMLDOMComment_get_text(pComment, &str); + ok(hr == S_OK, "ret %08x\n", hr ); + ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append ") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete from inside */ + hr = IXMLDOMComment_deleteData(pComment, 1, 33); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMComment_get_length(pComment, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 2, "expected 2 got %d\n", len); + + hr = IXMLDOMComment_get_text(pComment, &str); + ok(hr == S_OK, "ret %08x\n", hr ); + ok( !lstrcmpW( str, _bstr_(" ") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete whole data ... */ + hr = IXMLDOMComment_get_length(pComment, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMComment_deleteData(pComment, 0, len); + ok(hr == S_OK, "ret %08x\n", hr ); + /* ... and try again with empty string */ + hr = IXMLDOMComment_deleteData(pComment, 0, len); + ok(hr == S_OK, "ret %08x\n", hr ); + IXMLDOMComment_Release(pComment); } @@ -3269,6 +3411,77 @@ static void test_xmlTypes(void) ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); SysFreeString(str); + /* delete data */ + /* invalid arguments */ + hr = IXMLDOMCDATASection_deleteData(pCDataSec, -1, 1); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 0); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, -1); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_get_length(pCDataSec, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 43, "expected 43 got %d\n", len); + + hr = IXMLDOMCDATASection_deleteData(pCDataSec, len, 1); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_deleteData(pCDataSec, len+1, 1); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + /* delete from start */ + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 5); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_get_length(pCDataSec, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 38, "expected 38 got %d\n", len); + + hr = IXMLDOMCDATASection_get_text(pCDataSec, &str); + ok(hr == S_OK, "ret %08x\n", hr ); + ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete from end */ + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 35, 3); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_get_length(pCDataSec, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 35, "expected 35 got %d\n", len); + + hr = IXMLDOMCDATASection_get_text(pCDataSec, &str); + ok(hr == S_OK, "ret %08x\n", hr ); + ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append ") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete from inside */ + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 1, 33); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_get_length(pCDataSec, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(len == 2, "expected 2 got %d\n", len); + + hr = IXMLDOMCDATASection_get_text(pCDataSec, &str); + ok(hr == S_OK, "ret %08x\n", hr ); + ok( !lstrcmpW( str, _bstr_(" ") ), "incorrect get_text string\n"); + SysFreeString(str); + + /* delete whole data ... */ + hr = IXMLDOMCDATASection_get_length(pCDataSec, &len); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len); + ok(hr == S_OK, "ret %08x\n", hr ); + + /* ... and try again with empty string */ + hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len); + ok(hr == S_OK, "ret %08x\n", hr ); + IXMLDOMCDATASection_Release(pCDataSec); } diff --git a/rostests/winetests/msxml3/saxreader.c b/rostests/winetests/msxml3/saxreader.c index dd0e42c282b..a932bf99354 100644 --- a/rostests/winetests/msxml3/saxreader.c +++ b/rostests/winetests/msxml3/saxreader.c @@ -520,6 +520,8 @@ static void test_saxreader(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); test_expect_call(CH_ENDTEST); + VariantClear(&var); + SADim[0].lLbound= 0; SADim[0].cElements= sizeof(szTestXML)-1; pSA = SafeArrayCreate(VT_UI1, 1, SADim); @@ -560,6 +562,8 @@ static void test_saxreader(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); test_expect_call(CH_ENDTEST); + VariantClear(&var); + file = CreateFileA(testXmlA, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); WriteFile(file, szTestXML, sizeof(szTestXML)-1, &bytesWritten, NULL); @@ -591,6 +595,7 @@ static void test_saxreader(void) IXMLDOMDocument_Release(domDocument); ISAXXMLReader_Release(reader); + SysFreeString(bstrData); } START_TEST(saxreader) diff --git a/rostests/winetests/msxml3/xmldoc.c b/rostests/winetests/msxml3/xmldoc.c index d2d99fc23f1..bc7422d2a10 100644 --- a/rostests/winetests/msxml3/xmldoc.c +++ b/rostests/winetests/msxml3/xmldoc.c @@ -39,6 +39,7 @@ static void create_xml_file(LPCSTR filename) static const char data[] = "\n" + "\n" "\n" " 1234\n" " Captain Ahab\n" @@ -48,39 +49,13 @@ static void create_xml_file(LPCSTR filename) CloseHandle(hf); } -static void test_xmldoc(void) +static void create_stream_on_file(IStream **stream, LPCSTR path) { - HRESULT hr; - IXMLDocument *doc = NULL; - IXMLElement *element = NULL, *child = NULL, *value = NULL; - IXMLElementCollection *collection = NULL, *inner = NULL; - IPersistStreamInit *psi = NULL; - IStream *stream = NULL; - HGLOBAL hglobal; HANDLE hfile; + HGLOBAL hglobal; LPVOID ptr; + HRESULT hr; DWORD file_size, read; - CHAR path[MAX_PATH]; - LONG type, num_child; - VARIANT vIndex, vName; - BSTR name = NULL; - - static const WCHAR szBankAccount[] = {'B','A','N','K','A','C','C','O','U','N','T',0}; - static const WCHAR szNumber[] = {'N','U','M','B','E','R',0}; - static const WCHAR szNumVal[] = {'1','2','3','4',0}; - static const WCHAR szName[] = {'N','A','M','E',0}; - static const WCHAR szNameVal[] = {'C','a','p','t','a','i','n',' ','A','h','a','b',0}; - - hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, - &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } - - create_xml_file("bank.xml"); - GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); hfile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -93,12 +68,41 @@ static void test_xmldoc(void) ReadFile(hfile, ptr, file_size, &read, NULL); ok(file_size == read, "Expected to read the whole file, read %d\n", read); - hr = CreateStreamOnHGlobal(hglobal, TRUE, &stream); + hr = CreateStreamOnHGlobal(hglobal, TRUE, stream); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(stream != NULL, "Expected non-NULL stream\n"); + ok(*stream != NULL, "Expected non-NULL stream\n"); CloseHandle(hfile); GlobalUnlock(hglobal); +} + +static void test_xmldoc(void) +{ + HRESULT hr; + IXMLDocument *doc = NULL; + IXMLElement *element = NULL, *child = NULL, *value = NULL; + IXMLElementCollection *collection = NULL, *inner = NULL; + IPersistStreamInit *psi = NULL; + IStream *stream = NULL; + CHAR path[MAX_PATH]; + LONG type, num_child; + VARIANT vIndex, vName; + BSTR name = NULL; + + static const WCHAR szBankAccount[] = {'B','A','N','K','A','C','C','O','U','N','T',0}; + static const WCHAR szNumber[] = {'N','U','M','B','E','R',0}; + static const WCHAR szNumVal[] = {'1','2','3','4',0}; + static const WCHAR szName[] = {'N','A','M','E',0}; + static const WCHAR szNameVal[] = {'C','a','p','t','a','i','n',' ','A','h','a','b',0}; + static const WCHAR szVersion[] = {'1','.','0',0}; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + create_xml_file("bank.xml"); + GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); + create_stream_on_file(&stream, path); hr = IXMLDocument_QueryInterface(doc, &IID_IPersistStreamInit, (LPVOID *)&psi); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -115,10 +119,35 @@ static void test_xmldoc(void) ok(stream != NULL, "Expected non-NULL stream\n"); + /* version field */ + hr = IXMLDocument_get_version(doc, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IXMLDocument_get_version(doc, &name); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!lstrcmpW(name, szVersion), "Expected 1.0, got %s\n", wine_dbgstr_w(name)); + SysFreeString(name); + + /* doctype */ + hr = IXMLDocument_get_doctype(doc, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IXMLDocument_get_doctype(doc, &name); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!lstrcmpW(name, szBankAccount), "Expected BANKACCOUNT, got %s\n", wine_dbgstr_w(name)); + SysFreeString(name); + hr = IXMLDocument_get_root(doc, &element); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(element != NULL, "Expected non-NULL element\n"); + /* ::root() returns new instance each time */ + hr = IXMLDocument_get_root(doc, &child); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child != NULL, "Expected non-NULL element\n"); + ok(child != element, "Expected new element instance\n"); + IXMLElement_Release(child); + hr = IXMLElement_get_type(element, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); @@ -251,11 +280,7 @@ static void test_createElement(void) hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); /* invalid vType type */ V_VT(&vType) = VT_NULL; @@ -334,6 +359,142 @@ static void test_createElement(void) IXMLDocument_Release(doc); } +static void test_persiststreaminit(void) +{ + IXMLDocument *doc = NULL; + IXMLElement *element = NULL; + IPersistStreamInit *psi = NULL; + IStream *stream = NULL; + STATSTG stat; + HRESULT hr; + ULARGE_INTEGER size; + CHAR path[MAX_PATH]; + CLSID id; + BSTR str; + static const WCHAR testW[] = {'t','e','s','t',0}; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLDocument_QueryInterface(doc, &IID_IPersistStreamInit, (LPVOID *)&psi); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(psi != NULL, "Expected non-NULL psi\n"); + + /* null arguments */ + hr = IPersistStreamInit_GetSizeMax(psi, NULL); + ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); + + hr = IPersistStreamInit_Load(psi, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IPersistStreamInit_Save(psi, NULL, FALSE); + todo_wine ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IPersistStreamInit_GetClassID(psi, NULL); + ok(hr == E_POINTER, "Expected E_POINTER, got %08x\n", hr); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + create_xml_file("bank.xml"); + GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); + create_stream_on_file(&stream, path); + + /* GetSizeMax not implemented */ + size.QuadPart = 0; + hr = IPersistStreamInit_GetSizeMax(psi, &size); + ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); + ok(size.QuadPart == 0, "Expected 0\n"); + + hr = IPersistStreamInit_Load(psi, stream); + IStream_Release(stream); + ok(hr == S_OK || hr == XML_E_INVALIDATROOTLEVEL, "Expected S_OK, got %08x\n", hr); + if(hr == XML_E_INVALIDATROOTLEVEL) + goto cleanup; + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + /* try to save document */ + stream = NULL; + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + hr = IPersistStreamInit_Save(psi, stream, FALSE); + todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + stat.cbSize.QuadPart = 0; + hr = IStream_Stat(stream, &stat, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + todo_wine ok(stat.cbSize.QuadPart > 0, "Expected >0\n"); + IStream_Release(stream); + + str = SysAllocString(testW); + hr = IXMLDocument_get_root(doc, &element); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + hr = IXMLElement_put_text(element, str); + IXMLElement_Release(element); + SysFreeString(str); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + create_stream_on_file(&stream, path); + hr = IPersistStreamInit_Load(psi, stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IStream_Release(stream); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + /* reset internal stream */ + hr = IPersistStreamInit_InitNew(psi); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + stream = NULL; + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IPersistStreamInit_Save(psi, stream, FALSE); + todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + stat.cbSize.QuadPart = 0; + hr = IStream_Stat(stream, &stat, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + todo_wine ok(stat.cbSize.QuadPart > 0, "Expected >0\n"); + IStream_Release(stream); + + memset(&id, 0, sizeof(id)); + hr = IPersistStreamInit_GetClassID(psi, &id); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(IsEqualCLSID(&id, &CLSID_XMLDocument), "Expected CLSID_XMLDocument\n"); + +cleanup: + IPersistStreamInit_Release(psi); + IXMLDocument_Release(doc); + DeleteFileA("bank.xml"); +} + +static BOOL test_try_xmldoc(void) +{ + IXMLDocument *doc = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + if (FAILED(hr)) + { + skip("Failed to create XMLDocument instance\n"); + return FALSE; + } + + IXMLDocument_Release(doc); + return TRUE; +} + START_TEST(xmldoc) { HRESULT hr; @@ -341,8 +502,15 @@ START_TEST(xmldoc) hr = CoInitialize(NULL); ok(hr == S_OK, "failed to init com\n"); + if (!test_try_xmldoc()) + { + CoUninitialize(); + return; + } + test_xmldoc(); test_createElement(); + test_persiststreaminit(); CoUninitialize(); } diff --git a/rostests/winetests/msxml3/xmlelem.c b/rostests/winetests/msxml3/xmlelem.c index 1738b2ce50b..3304d5a59bd 100644 --- a/rostests/winetests/msxml3/xmlelem.c +++ b/rostests/winetests/msxml3/xmlelem.c @@ -53,11 +53,7 @@ static void test_xmlelem(void) hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); V_VT(&vType) = VT_I4; V_I4(&vType) = XMLELEMTYPE_ELEMENT; @@ -265,11 +261,7 @@ static void test_xmlelem_collection(void) hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); create_xml_file(szBankXML); GetFullPathNameA(szBankXML, MAX_PATH, pathA, NULL); @@ -438,6 +430,144 @@ cleanup: DeleteFileA("bank.xml"); } +static void test_xmlelem_children(void) +{ + IXMLDocument *doc = NULL; + IXMLElement *element = NULL, *child = NULL, *child2 = NULL; + IXMLElementCollection *collection = NULL; + VARIANT vType, vName, vIndex; + LONG length; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + V_VT(&vType) = VT_I4; + V_I4(&vType) = XMLELEMTYPE_ELEMENT; + V_VT(&vName) = VT_NULL; + hr = IXMLDocument_createElement(doc, vType, vName, &element); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(element != NULL, "Expected non-NULL element\n"); + + V_VT(&vType) = VT_I4; + V_I4(&vType) = XMLELEMTYPE_TEXT; + V_VT(&vName) = VT_NULL; + hr = IXMLDocument_createElement(doc, vType, vName, &child); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child != NULL, "Expected non-NULL child\n"); + + V_VT(&vType) = VT_I4; + V_I4(&vType) = XMLELEMTYPE_TEXT; + V_VT(&vName) = VT_NULL; + hr = IXMLDocument_createElement(doc, vType, vName, &child2); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child2 != NULL, "Expected non-NULL child\n"); + + hr = IXMLElement_addChild(element, child, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLElement_get_children(element, &collection); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(collection != NULL, "Expected non-NULL collection\n"); + + length = 0; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 1, "Expected 1, got %08x\n", length); + + /* remove/add child and check what happens with collection */ + hr = IXMLElement_removeChild(element, child); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + length = -1; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 0, "Expected 0, got %08x\n", length); + IXMLElementCollection_Release(collection); + + hr = IXMLElement_AddRef(child); + ok(hr == 2, "Expected 2, got %08x\n", hr); + IXMLElement_Release(child); + hr = IXMLElement_addChild(element, child, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + hr = IXMLElement_AddRef(child); + ok(hr == 2, "Expected 2, got %08x\n", hr); + IXMLElement_Release(child); + hr = IXMLElement_addChild(element, child2, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLElement_get_children(element, &collection); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(collection != NULL, "Expected non-NULL collection\n"); + + hr = IXMLElement_AddRef(child); + ok(hr == 2, "Expected 2, got %08x\n", hr); + IXMLElement_Release(child); + + length = 0; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 2, "Expected 2, got %08x\n", length); + + IXMLElement_Release(child2); + + length = 0; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 2, "Expected 2, got %08x\n", length); + + V_VT(&vIndex) = VT_I4; + V_I4(&vIndex) = 1; + hr = IXMLElementCollection_item(collection, vIndex, vName, (IDispatch **)&child2); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child2 != NULL, "Expected not NULL child\n"); + IXMLElementCollection_Release(collection); + IXMLElement_Release(child2); + + /* add element->child->child2 structure, then remove child2 from node */ + V_VT(&vType) = VT_I4; + V_I4(&vType) = XMLELEMTYPE_TEXT; + V_VT(&vName) = VT_NULL; + hr = IXMLDocument_createElement(doc, vType, vName, &child2); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child2 != NULL, "Expected non-NULL child\n"); + + hr = IXMLElement_addChild(child, child2, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLElement_removeChild(element, child2); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IXMLElement_removeChild(child, child2); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLElement_removeChild(child, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + IXMLElement_Release(element); + IXMLElement_Release(child); + IXMLElement_Release(child2); + IXMLDocument_Release(doc); +} + +static BOOL test_try_xmldoc(void) +{ + IXMLDocument *doc = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + if (FAILED(hr)) + { + skip("Failed to create XMLDocument instance\n"); + return FALSE; + } + + IXMLDocument_Release(doc); + return TRUE; +} + START_TEST(xmlelem) { HRESULT hr; @@ -445,8 +575,15 @@ START_TEST(xmlelem) hr = CoInitialize(NULL); ok(hr == S_OK, "failed to init com\n"); + if (!test_try_xmldoc()) + { + CoUninitialize(); + return; + } + test_xmlelem(); test_xmlelem_collection(); + test_xmlelem_children(); CoUninitialize(); } From 28dd8797060c5788c9746b568acacda4a8d261fc Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 6 Feb 2010 21:46:26 +0000 Subject: [PATCH 05/97] [QEDIT] sync qedit to wine 1.1.38 svn path=/trunk/; revision=45472 --- reactos/dll/directx/qedit/main.c | 1 + reactos/dll/directx/qedit/mediadet.c | 30 +- reactos/dll/directx/qedit/qedit.rbuild | 1 + reactos/dll/directx/qedit/qedit_private.h | 1 + reactos/dll/directx/qedit/regsvr.c | 6 + reactos/dll/directx/qedit/samplegrabber.c | 453 ++++++++++++++++++++++ reactos/include/dxsdk/qedit.idl | 24 +- reactos/include/dxsdk/uuids.h | 1 + 8 files changed, 494 insertions(+), 23 deletions(-) create mode 100644 reactos/dll/directx/qedit/samplegrabber.c diff --git a/reactos/dll/directx/qedit/main.c b/reactos/dll/directx/qedit/main.c index df00137647b..ede377fb579 100644 --- a/reactos/dll/directx/qedit/main.c +++ b/reactos/dll/directx/qedit/main.c @@ -53,6 +53,7 @@ struct object_creation_info static const struct object_creation_info object_creation[] = { { &CLSID_MediaDet, MediaDet_create }, + { &CLSID_SampleGrabber, SampleGrabber_create }, }; static HRESULT WINAPI diff --git a/reactos/dll/directx/qedit/mediadet.c b/reactos/dll/directx/qedit/mediadet.c index 2cf37f96a88..3a13f717bf6 100644 --- a/reactos/dll/directx/qedit/mediadet.c +++ b/reactos/dll/directx/qedit/mediadet.c @@ -112,7 +112,7 @@ static HRESULT WINAPI MediaDet_put_Filter(IMediaDet* iface, IUnknown *newVal) return E_NOTIMPL; } -static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal) +static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, LONG *pVal) { MediaDetImpl *This = (MediaDetImpl *)iface; IEnumPins *pins; @@ -156,7 +156,7 @@ static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal) return S_OK; } -static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, long *pVal) +static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, LONG *pVal) { MediaDetImpl *This = (MediaDetImpl *)iface; TRACE("(%p)\n", This); @@ -209,16 +209,16 @@ static HRESULT SetCurPin(MediaDetImpl *This, long strm) return S_OK; } -static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal) +static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, LONG newVal) { MediaDetImpl *This = (MediaDetImpl *)iface; HRESULT hr; - TRACE("(%p)->(%ld)\n", This, newVal); + TRACE("(%p)->(%d)\n", This, newVal); if (This->num_streams == -1) { - long n; + LONG n; hr = MediaDet_get_OutputStreams(iface, &n); if (FAILED(hr)) return hr; @@ -310,7 +310,11 @@ static HRESULT GetFilterInfo(IMoniker *pMoniker, GUID *pclsid, VARIANT *pvar) hr = IPropertyBag_Read(pPropBagCat, wszClsidName, pvar, NULL); if (SUCCEEDED(hr)) + { hr = CLSIDFromString(V_UNION(pvar, bstrVal), pclsid); + VariantClear(pvar); + V_VT(pvar) = VT_BSTR; + } if (SUCCEEDED(hr)) hr = IPropertyBag_Read(pPropBagCat, wszFriendlyName, pvar, NULL); @@ -387,10 +391,14 @@ static HRESULT GetSplitter(MediaDetImpl *This) hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **) &splitter); if (FAILED(hr)) + { + VariantClear(&var); return hr; + } hr = IGraphBuilder_AddFilter(This->graph, splitter, V_UNION(&var, bstrVal)); + VariantClear(&var); if (FAILED(hr)) { IBaseFilter_Release(splitter); @@ -461,21 +469,21 @@ static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal) static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface, double StreamTime, - long *pBufferSize, char *pBuffer, - long Width, long Height) + LONG *pBufferSize, char *pBuffer, + LONG Width, LONG Height) { MediaDetImpl *This = (MediaDetImpl *)iface; - FIXME("(%p)->(%f %p %p %ld %ld): not implemented!\n", This, StreamTime, pBufferSize, pBuffer, + FIXME("(%p)->(%f %p %p %d %d): not implemented!\n", This, StreamTime, pBufferSize, pBuffer, Width, Height); return E_NOTIMPL; } static HRESULT WINAPI MediaDet_WriteBitmapBits(IMediaDet* iface, - double StreamTime, long Width, - long Height, BSTR Filename) + double StreamTime, LONG Width, + LONG Height, BSTR Filename) { MediaDetImpl *This = (MediaDetImpl *)iface; - FIXME("(%p)->(%f %ld %ld %p): not implemented!\n", This, StreamTime, Width, Height, Filename); + FIXME("(%p)->(%f %d %d %p): not implemented!\n", This, StreamTime, Width, Height, Filename); return E_NOTIMPL; } diff --git a/reactos/dll/directx/qedit/qedit.rbuild b/reactos/dll/directx/qedit/qedit.rbuild index 78f7a556612..f3285f4ef48 100644 --- a/reactos/dll/directx/qedit/qedit.rbuild +++ b/reactos/dll/directx/qedit/qedit.rbuild @@ -8,6 +8,7 @@ main.c mediadet.c regsvr.c + samplegrabber.c wine strmiids uuid diff --git a/reactos/dll/directx/qedit/qedit_private.h b/reactos/dll/directx/qedit/qedit_private.h index 87bcab012fe..cf4747f5f17 100644 --- a/reactos/dll/directx/qedit/qedit_private.h +++ b/reactos/dll/directx/qedit/qedit_private.h @@ -37,5 +37,6 @@ #include "qedit.h" HRESULT MediaDet_create(IUnknown *pUnkOuter, LPVOID *ppObj); +HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppObj); #endif /* __QEDIT_PRIVATE_INCLUDED__ */ diff --git a/reactos/dll/directx/qedit/regsvr.c b/reactos/dll/directx/qedit/regsvr.c index 9ff18528523..d70c8222ee8 100644 --- a/reactos/dll/directx/qedit/regsvr.c +++ b/reactos/dll/directx/qedit/regsvr.c @@ -294,6 +294,12 @@ static struct regsvr_coclass const coclass_list[] = { "qedit.dll", "Both" }, + { &CLSID_SampleGrabber, + "Sample Grabber", + NULL, + "qedit.dll", + "Both" + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/directx/qedit/samplegrabber.c b/reactos/dll/directx/qedit/samplegrabber.c new file mode 100644 index 00000000000..4e80f24f4d5 --- /dev/null +++ b/reactos/dll/directx/qedit/samplegrabber.c @@ -0,0 +1,453 @@ +/* DirectShow Sample Grabber object (QEDIT.DLL) + * + * Copyright 2009 Paul Chitescu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "qedit_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(qedit); + +static WCHAR const vendor_name[] = { 'W', 'i', 'n', 'e', 0 }; + +/* Sample Grabber filter implementation */ +typedef struct _SG_Impl { + const IBaseFilterVtbl* IBaseFilter_Vtbl; + const ISampleGrabberVtbl* ISampleGrabber_Vtbl; + /* TODO: IMediaPosition, IMediaSeeking, IQualityControl */ + LONG refCount; + FILTER_INFO info; + FILTER_STATE state; + IMemAllocator *allocator; + IReferenceClock *refClock; +} SG_Impl; + +/* Get the SampleGrabber implementation This pointer from various interface pointers */ +static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface) +{ + return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IBaseFilter_Vtbl)); +} + +static inline SG_Impl *impl_from_ISampleGrabber(ISampleGrabber *iface) +{ + return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, ISampleGrabber_Vtbl)); +} + + +/* Cleanup at end of life */ +static void SampleGrabber_cleanup(SG_Impl *This) +{ + TRACE("(%p)\n", This); + if (This->info.pGraph) + WARN("(%p) still joined to filter graph %p\n", This, This->info.pGraph); + if (This->allocator) + IMemAllocator_Release(This->allocator); + if (This->refClock) + IReferenceClock_Release(This->refClock); +} + +/* Common helper AddRef called from all interfaces */ +static ULONG SampleGrabber_addref(SG_Impl *This) +{ + ULONG refCount = InterlockedIncrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + return refCount; +} + +/* Common helper Release called from all interfaces */ +static ULONG SampleGrabber_release(SG_Impl *This) +{ + ULONG refCount = InterlockedDecrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + if (refCount == 0) + { + SampleGrabber_cleanup(This); + CoTaskMemFree(This); + return 0; + } + return refCount; +} + +/* Common helper QueryInterface called from all interfaces */ +static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject) +{ + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IPersist) || + IsEqualIID(riid, &IID_IMediaFilter) || + IsEqualIID(riid, &IID_IBaseFilter)) { + SampleGrabber_addref(This); + *ppvObject = &(This->IBaseFilter_Vtbl); + return S_OK; + } + else if (IsEqualIID(riid, &IID_ISampleGrabber)) { + SampleGrabber_addref(This); + *ppvObject = &(This->ISampleGrabber_Vtbl); + return S_OK; + } + else if (IsEqualIID(riid, &IID_IMemInputPin)) + FIXME("IMemInputPin not implemented\n"); + else if (IsEqualIID(riid, &IID_IMediaPosition)) + FIXME("IMediaPosition not implemented\n"); + else if (IsEqualIID(riid, &IID_IMediaSeeking)) + FIXME("IMediaSeeking not implemented\n"); + else if (IsEqualIID(riid, &IID_IQualityControl)) + FIXME("IQualityControl not implemented\n"); + *ppvObject = NULL; + WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject); + return E_NOINTERFACE; +} + + +/* SampleGrabber implementation of IBaseFilter interface */ + +/* IUnknown */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppvObject) +{ + return SampleGrabber_query(impl_from_IBaseFilter(iface), riid, ppvObject); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IBaseFilter_AddRef(IBaseFilter *iface) +{ + return SampleGrabber_addref(impl_from_IBaseFilter(iface)); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IBaseFilter_Release(IBaseFilter *iface) +{ + return SampleGrabber_release(impl_from_IBaseFilter(iface)); +} + +/* IPersist */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_GetClassID(IBaseFilter *iface, CLSID *pClassID) +{ + TRACE("(%p)\n", pClassID); + if (!pClassID) + return E_POINTER; + *pClassID = CLSID_SampleGrabber; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_Stop(IBaseFilter *iface) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)\n", This); + This->state = State_Stopped; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_Pause(IBaseFilter *iface) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)\n", This); + This->state = State_Paused; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)\n", This); + This->state = State_Running; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_GetState(IBaseFilter *iface, DWORD msTout, FILTER_STATE *state) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%u, %p)\n", This, msTout, state); + if (!state) + return E_POINTER; + *state = This->state; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_SetSyncSource(IBaseFilter *iface, IReferenceClock *clock) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p)\n", This, clock); + if (clock != This->refClock) + { + if (clock) + IReferenceClock_AddRef(clock); + if (This->refClock) + IReferenceClock_Release(This->refClock); + This->refClock = clock; + } + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_GetSyncSource(IBaseFilter *iface, IReferenceClock **clock) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p)\n", This, clock); + if (!clock) + return E_POINTER; + if (This->refClock) + IReferenceClock_AddRef(This->refClock); + *clock = This->refClock; + return S_OK; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + FIXME("(%p)->(%p): stub\n", This, pins); + if (!pins) + return E_POINTER; + return E_OUTOFMEMORY; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + FIXME("(%p)->(%s, %p): stub\n", This, debugstr_w(id), pin); + if (!id || !pin) + return E_POINTER; + *pin = NULL; + return VFW_E_NOT_FOUND; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *info) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p)\n", This, info); + if (!info) + return E_POINTER; + if (This->info.pGraph) + IFilterGraph_AddRef(This->info.pGraph); + *info = This->info; + return S_OK; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *graph, LPCWSTR name) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p, %s)\n", This, graph, debugstr_w(name)); + This->info.pGraph = graph; + if (name) + lstrcpynW(This->info.achName,name,MAX_FILTER_NAME); + return S_OK; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_QueryVendorInfo(IBaseFilter *iface, LPWSTR *vendor) +{ + TRACE("(%p)\n", vendor); + if (!vendor) + return E_POINTER; + *vendor = CoTaskMemAlloc(sizeof(vendor_name)); + CopyMemory(*vendor, vendor_name, sizeof(vendor_name)); + return S_OK; +} + + +/* SampleGrabber implementation of ISampleGrabber interface */ + +/* IUnknown */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppvObject) +{ + return SampleGrabber_query(impl_from_ISampleGrabber(iface), riid, ppvObject); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_ISampleGrabber_AddRef(ISampleGrabber *iface) +{ + return SampleGrabber_addref(impl_from_ISampleGrabber(iface)); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_ISampleGrabber_Release(ISampleGrabber *iface) +{ + return SampleGrabber_release(impl_from_ISampleGrabber(iface)); +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetOneShot(ISampleGrabber *iface, BOOL oneShot) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + FIXME("(%p)->(%u): stub\n", This, oneShot); + return E_NOTIMPL; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetMediaType(ISampleGrabber *iface, const AM_MEDIA_TYPE *type) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + FIXME("(%p)->(%p): stub\n", This, type); + if (!type) + return E_POINTER; + return E_NOTIMPL; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_GetConnectedMediaType(ISampleGrabber *iface, AM_MEDIA_TYPE *type) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + FIXME("(%p)->(%p): stub\n", This, type); + if (!type) + return E_POINTER; + return E_NOTIMPL; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL bufferEm) +{ + TRACE("(%u)\n", bufferEm); + if (bufferEm) { + FIXME("buffering not implemented\n"); + return E_NOTIMPL; + } + return S_OK; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSize, LONG *buffer) +{ + FIXME("(%p, %p): stub\n", bufSize, buffer); + if (!bufSize) + return E_POINTER; + return E_INVALIDARG; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_GetCurrentSample(ISampleGrabber *iface, IMediaSample **sample) +{ + /* MS doesn't implement it either, noone should call it */ + WARN("(%p): not implemented\n", sample); + return E_NOTIMPL; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetCallback(ISampleGrabber *iface, ISampleGrabberCB *cb, LONG whichMethod) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + FIXME("(%p)->(%p, %u): stub\n", This, cb, whichMethod); + return E_NOTIMPL; +} + + +/* SampleGrabber vtables and constructor */ + +static const IBaseFilterVtbl IBaseFilter_VTable = +{ + SampleGrabber_IBaseFilter_QueryInterface, + SampleGrabber_IBaseFilter_AddRef, + SampleGrabber_IBaseFilter_Release, + SampleGrabber_IBaseFilter_GetClassID, + SampleGrabber_IBaseFilter_Stop, + SampleGrabber_IBaseFilter_Pause, + SampleGrabber_IBaseFilter_Run, + SampleGrabber_IBaseFilter_GetState, + SampleGrabber_IBaseFilter_SetSyncSource, + SampleGrabber_IBaseFilter_GetSyncSource, + SampleGrabber_IBaseFilter_EnumPins, + SampleGrabber_IBaseFilter_FindPin, + SampleGrabber_IBaseFilter_QueryFilterInfo, + SampleGrabber_IBaseFilter_JoinFilterGraph, + SampleGrabber_IBaseFilter_QueryVendorInfo, +}; + +static const ISampleGrabberVtbl ISampleGrabber_VTable = +{ + SampleGrabber_ISampleGrabber_QueryInterface, + SampleGrabber_ISampleGrabber_AddRef, + SampleGrabber_ISampleGrabber_Release, + SampleGrabber_ISampleGrabber_SetOneShot, + SampleGrabber_ISampleGrabber_SetMediaType, + SampleGrabber_ISampleGrabber_GetConnectedMediaType, + SampleGrabber_ISampleGrabber_SetBufferSamples, + SampleGrabber_ISampleGrabber_GetCurrentBuffer, + SampleGrabber_ISampleGrabber_GetCurrentSample, + SampleGrabber_ISampleGrabber_SetCallback, +}; + +HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv) +{ + SG_Impl* obj = NULL; + + TRACE("(%p,%p)\n", ppv, pUnkOuter); + + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + obj = CoTaskMemAlloc(sizeof(SG_Impl)); + if (NULL == obj) { + *ppv = NULL; + return E_OUTOFMEMORY; + } + ZeroMemory(obj, sizeof(SG_Impl)); + + obj->refCount = 1; + obj->IBaseFilter_Vtbl = &IBaseFilter_VTable; + obj->ISampleGrabber_Vtbl = &ISampleGrabber_VTable; + obj->info.achName[0] = 0; + obj->info.pGraph = NULL; + obj->state = State_Stopped; + obj->allocator = NULL; + obj->refClock = NULL; + *ppv = obj; + + return S_OK; +} diff --git a/reactos/include/dxsdk/qedit.idl b/reactos/include/dxsdk/qedit.idl index 48764c11a72..ea1e593ad65 100644 --- a/reactos/include/dxsdk/qedit.idl +++ b/reactos/include/dxsdk/qedit.idl @@ -37,7 +37,7 @@ interface ISampleGrabberCB : IUnknown HRESULT BufferCB( double SampleTime, BYTE * pBuffer, - long BufferLen + LONG BufferLen ); } @@ -66,8 +66,8 @@ interface ISampleGrabber: IUnknown ); HRESULT GetCurrentBuffer( - [in,out] long * pBufferSize, - [out] long * pBuffer + [in,out] LONG * pBufferSize, + [out] LONG * pBuffer ); HRESULT GetCurrentSample( @@ -76,7 +76,7 @@ interface ISampleGrabber: IUnknown HRESULT SetCallback( ISampleGrabberCB * pCallback, - long WhichMethodToCallback + LONG WhichMethodToCallback ); }; @@ -96,15 +96,15 @@ interface IMediaDet : IUnknown ); HRESULT get_OutputStreams( - [out] long *pVal + [out] LONG *pVal ); HRESULT get_CurrentStream( - [out] long *pVal + [out] LONG *pVal ); HRESULT put_CurrentStream( - long newVal + LONG newVal ); HRESULT get_StreamType( @@ -129,16 +129,16 @@ interface IMediaDet : IUnknown HRESULT GetBitmapBits( double StreamTime, - long * pBufferSize, + LONG * pBufferSize, char * pBuffer, - long Width, - long Height + LONG Width, + LONG Height ); HRESULT WriteBitmapBits( double StreamTime, - long Width, - long Height, + LONG Width, + LONG Height, BSTR Filename ); diff --git a/reactos/include/dxsdk/uuids.h b/reactos/include/dxsdk/uuids.h index 54a30fc2de2..376cca748fc 100644 --- a/reactos/include/dxsdk/uuids.h +++ b/reactos/include/dxsdk/uuids.h @@ -135,6 +135,7 @@ OUR_GUID_ENTRY(CLSID_WAVEParser, 0xd51bd5a1, 0x7548, 0x11cf, OUR_GUID_ENTRY(CLSID_QTDec, 0xfdfe9681, 0x74a3, 0x11d0, 0xaf, 0xa7, 0x00, 0xaa, 0x00, 0xb6, 0x7a, 0x42) OUR_GUID_ENTRY(CLSID_AVIDoc, 0xd3588ab0, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) OUR_GUID_ENTRY(CLSID_AVIDocWriter, 0xd3588ab1, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +OUR_GUID_ENTRY(CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37) OUR_GUID_ENTRY(CLSID_NullRenderer, 0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37) OUR_GUID_ENTRY(CLSID_VideoRenderer, 0x70e102b0, 0x5556, 0x11ce, 0x97, 0xc0, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) OUR_GUID_ENTRY(CLSID_VideoRendererDefault, 0x6bc1cffa, 0x8fc1, 0x4261, 0xac, 0x22, 0xcf, 0xb4, 0xcc, 0x38, 0xdb, 0x50) From 534f9adf4578068d3d6168e199ab1d92e80c2e71 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 6 Feb 2010 23:06:57 +0000 Subject: [PATCH 06/97] Simplify the policy handle creation and destruction. This fixes two winetest failures. svn path=/trunk/; revision=45473 --- reactos/dll/win32/lsasrv/lsarpc.c | 127 +++++++++++++----------------- 1 file changed, 55 insertions(+), 72 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index f3641bf7500..d2a36444393 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -10,88 +10,76 @@ #include -#define POLICY_DELETE (RTL_HANDLE_VALID << 1) -typedef struct _LSAR_POLICY_HANDLE +typedef struct _LSA_DB_HANDLE { - ULONG Flags; + ULONG Signature; + ULONG Type; LONG RefCount; ACCESS_MASK AccessGranted; -} LSAR_POLICY_HANDLE, *PLSAR_POLICY_HANDLE; +} LSA_DB_HANDLE, *PLSA_DB_HANDLE; + +#define LSAP_DB_SIGNATURE 0x12345678 static RTL_CRITICAL_SECTION PolicyHandleTableLock; -static RTL_HANDLE_TABLE PolicyHandleTable; WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); + /* FUNCTIONS ***************************************************************/ -static NTSTATUS -ReferencePolicyHandle( - IN LSA_HANDLE ObjectHandle, - IN ACCESS_MASK DesiredAccess, - OUT PLSAR_POLICY_HANDLE *Policy) +static LSAPR_HANDLE +LsapCreateDbHandle(ULONG Type) { - PLSAR_POLICY_HANDLE ReferencedPolicy; - NTSTATUS Status = STATUS_SUCCESS; + PLSA_DB_HANDLE DbHandle; - RtlEnterCriticalSection(&PolicyHandleTableLock); +// RtlEnterCriticalSection(&PolicyHandleTableLock); - if (RtlIsValidIndexHandle(&PolicyHandleTable, - HandleToUlong(ObjectHandle), - (PRTL_HANDLE_TABLE_ENTRY*)&ReferencedPolicy) && - !(ReferencedPolicy->Flags & POLICY_DELETE)) + DbHandle = (PLSA_DB_HANDLE)RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(LSA_DB_HANDLE)); + if (DbHandle != NULL) { - if (RtlAreAllAccessesGranted(ReferencedPolicy->AccessGranted, - DesiredAccess)) - { - ReferencedPolicy->RefCount++; - *Policy = ReferencedPolicy; - } - else - Status = STATUS_ACCESS_DENIED; + DbHandle->Signature = LSAP_DB_SIGNATURE; + DbHandle->RefCount = 1; + DbHandle->Type = Type; } - else - Status = STATUS_INVALID_HANDLE; - RtlLeaveCriticalSection(&PolicyHandleTableLock); +// RtlLeaveCriticalSection(&PolicyHandleTableLock); - return Status; + return (LSAPR_HANDLE)DbHandle; } -static VOID -DereferencePolicyHandle( - IN OUT PLSAR_POLICY_HANDLE Policy, - IN BOOLEAN Delete) + +static BOOL +LsapValidateDbHandle(LSAPR_HANDLE Handle) { - RtlEnterCriticalSection(&PolicyHandleTableLock); + PLSA_DB_HANDLE DbHandle = (PLSA_DB_HANDLE)Handle; + BOOL bValid = FALSE; - if (Delete) + _SEH2_TRY { - Policy->Flags |= POLICY_DELETE; - Policy->RefCount--; - - ASSERT(Policy->RefCount != 0); + if (DbHandle->Signature == LSAP_DB_SIGNATURE) + bValid = TRUE; } - - if (--Policy->RefCount == 0) + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - ASSERT(Policy->Flags & POLICY_DELETE); - RtlFreeHandle(&PolicyHandleTable, - (PRTL_HANDLE_TABLE_ENTRY)Policy); + bValid = FALSE; } + _SEH2_END; - RtlLeaveCriticalSection(&PolicyHandleTableLock); + + return bValid; } + + + VOID LsarStartRpcServer(VOID) { RPC_STATUS Status; RtlInitializeCriticalSection(&PolicyHandleTableLock); - RtlInitializeHandleTable(0x1000, - sizeof(LSAR_POLICY_HANDLE), - &PolicyHandleTable); TRACE("LsarStartRpcServer() called"); @@ -135,29 +123,21 @@ void __RPC_USER LSAPR_HANDLE_rundown(LSAPR_HANDLE hHandle) NTSTATUS LsarClose( LSAPR_HANDLE *ObjectHandle) { - PLSAR_POLICY_HANDLE Policy = NULL; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; TRACE("0x%p\n", ObjectHandle); -#if 1 - /* This is our fake handle, don't go too much long way */ - if (*ObjectHandle == (LSA_HANDLE)0xcafe) - { - *ObjectHandle = NULL; - Status = STATUS_SUCCESS; - } -#endif +// RtlEnterCriticalSection(&PolicyHandleTableLock); - Status = ReferencePolicyHandle((LSA_HANDLE)*ObjectHandle, - 0, - &Policy); - if (NT_SUCCESS(Status)) + if (LsapValidateDbHandle(*ObjectHandle)) { - /* delete the handle */ - DereferencePolicyHandle(Policy, - TRUE); + RtlFreeHeap(RtlGetProcessHeap(), 0, *ObjectHandle); + *ObjectHandle = NULL; } + else + Status = STATUS_INVALID_HANDLE; + +// RtlLeaveCriticalSection(&PolicyHandleTableLock); return Status; } @@ -227,18 +207,21 @@ NTSTATUS LsarOpenPolicy( ACCESS_MASK DesiredAccess, LSAPR_HANDLE *PolicyHandle) { -#if 1 + NTSTATUS Status = STATUS_SUCCESS; + TRACE("LsarOpenPolicy called!\n"); - *PolicyHandle = (LSAPR_HANDLE)0xcafe; + RtlEnterCriticalSection(&PolicyHandleTableLock); + + *PolicyHandle = LsapCreateDbHandle(0); + if (*PolicyHandle == NULL) + Status = STATUS_INSUFFICIENT_RESOURCES; + + RtlLeaveCriticalSection(&PolicyHandleTableLock); TRACE("LsarOpenPolicy done!\n"); - return STATUS_SUCCESS; -#else - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -#endif + return Status; } From bd9978270aae1dafa36a963e6280391156e58374 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sun, 7 Feb 2010 00:06:04 +0000 Subject: [PATCH 07/97] [SHELL32] don't print the function name twice in ERR (merge from wine) svn path=/trunk/; revision=45475 --- reactos/dll/win32/shell32/classes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/classes.c b/reactos/dll/win32/shell32/classes.c index 00de533681a..edc1eacf5c9 100644 --- a/reactos/dll/win32/shell32/classes.c +++ b/reactos/dll/win32/shell32/classes.c @@ -460,7 +460,7 @@ BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes) TRACE("(pidlFolder=%p, pdwAttributes=%p)\n", pidlFolder, pdwAttributes); if (!_ILIsPidlSimple(pidlFolder)) { - ERR("HCR_GetFolderAttributes should be called for simple PIDL's only!\n"); + ERR("should be called for simple PIDL's only!\n"); return FALSE; } From 4225cee026fee8f25da65d37974ea466b17059f8 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sun, 7 Feb 2010 00:07:07 +0000 Subject: [PATCH 08/97] [SHELL32] fix debug channel (merge from wine) svn path=/trunk/; revision=45476 --- reactos/dll/win32/shell32/regsvr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/regsvr.c b/reactos/dll/win32/shell32/regsvr.c index e7490c8095d..7e230a1b8bb 100644 --- a/reactos/dll/win32/shell32/regsvr.c +++ b/reactos/dll/win32/shell32/regsvr.c @@ -30,7 +30,7 @@ const GUID SHELL32_AdvtShortcutProduct = {0x9db1186f, 0x40df, 0x11d1, {0xaa, 0 const GUID SHELL32_AdvtShortcutComponent = {0x9db1186e, 0x40df, 0x11d1, {0xaa, 0x8c, 0x00, 0xc0, 0x4f, 0xb6, 0x78, 0x63}}; -WINE_DEFAULT_DEBUG_CHANNEL(ole); +WINE_DEFAULT_DEBUG_CHANNEL(shell); /* * Near the bottom of this file are the exported DllRegisterServer and From 996267a6fff9ca5f3d90d516a6218eda346d2382 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sun, 7 Feb 2010 00:09:10 +0000 Subject: [PATCH 09/97] [FREELDR]: Start rewrite of eVb's messed up FreeLDR paging code. The new code is all dynamic and makes much better decisions as to the layout of the address space and how things will be implemented. Already, we are saving 16MB of VA. For now we still consume a large (1 MB) page for simplicity for the page directory, but that can go away later. I will post a diagram later if time permits. We get to MMU enabled and the PDE_BASE mapping works. [NTOS]: Start redefining ARMv6 paging structures. svn path=/trunk/; revision=45477 --- reactos/boot/freeldr/freeldr/arch/arm/boot.s | 16 - .../boot/freeldr/freeldr/arch/arm/loader.c | 411 ++++-------------- reactos/ntoskrnl/include/internal/arm/mm.h | 96 ++-- 3 files changed, 144 insertions(+), 379 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/arm/boot.s b/reactos/boot/freeldr/freeldr/arch/arm/boot.s index 64cf06a7035..cbe9e9b5217 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/boot.s +++ b/reactos/boot/freeldr/freeldr/arch/arm/boot.s @@ -19,19 +19,3 @@ L_ArmInit: .long ArmInit - -.global PageDirectoryStart, PageDirectoryEnd -.global startup_pagedirectory -.global kernel_pagetable - -.bss -PageDirectoryStart: -kernel_pagetable: - .fill 2*4096, 1, 0 - .space 4096 -startup_pagedirectory: - .fill 4*4096, 1, 0 - - -.global PageDirectoryEnd -PageDirectoryEnd: diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c index 80bb14f809e..b742a898b68 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/loader.c @@ -40,6 +40,7 @@ ULONG ArmSharedHeapSize; PCHAR ArmSharedHeap; extern PAGE_DIRECTORY_ARM startup_pagedirectory; +extern PAGE_TABLE_ARM kernel_pagetable; extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint; extern ULONG_PTR KernelBase; @@ -678,371 +679,134 @@ ArmBuildLoaderMemoryList(VOID) #define PFN_SHIFT 12 #define LARGE_PFN_SHIFT 20 -#define STARTUP_BASE 0xC0000000 +#define PTE_BASE 0xC0000000 +#define PDE_BASE 0xC0400000 #define HAL_BASE 0xFFC00000 #define MMIO_BASE 0x10000000 #define LowMemPageTableIndex 0 -#define StartupPageTableIndex (STARTUP_BASE >> PDE_SHIFT) +#define StartupPtePageTableIndex (PTE_BASE >> PDE_SHIFT) +#define StartupPdePageTableIndex (PDE_BASE >> PDE_SHIFT) #define MmioPageTableIndex (MMIO_BASE >> PDE_SHIFT) #define HalPageTableIndex (HAL_BASE >> PDE_SHIFT) /* Converts a Physical Address into a Page Frame Number */ #define PaToPfn(p) ((p) >> PFN_SHIFT) #define PaToLargePfn(p) ((p) >> LARGE_PFN_SHIFT) - -VOID +#define PaPtrToPfn(p) (((ULONG_PTR)(p)) >> PFN_SHIFT) + +/* Converts a Physical Address into a Coarse Page Table PFN */ +#define PaPtrToPdePfn(p) (((ULONG_PTR)(p)) >> CPT_SHIFT) + +HARDWARE_PTE_ARMV6 TempPte; +HARDWARE_LARGE_PTE_ARMV6 TempLargePte; +HARDWARE_PDE_ARMV6 TempPde; + +PVOID ArmSetupPageDirectory(VOID) { PPAGE_DIRECTORY_ARM PageDir; + PPAGE_TABLE_ARM PageTable, KernelPageTable; ULONG KernelPageTableIndex; - //ULONG i; + ULONG i; + PHARDWARE_PTE_ARMV6 PointerPte; + PHARDWARE_PDE_ARMV6 PointerPde; + PHARDWARE_LARGE_PTE_ARMV6 LargePte; + PFN_NUMBER Pfn; + /* Setup templates */ + TempPte.Accessed = TempPte.Valid = TempLargePte.LargePage = TempLargePte.Accessed = TempPde.Valid = 1; + /* Get the Kernel Table Index */ KernelPageTableIndex = KernelBase >> PDE_SHIFT; printf("Kernel Base: 0x%p (PDE Index: %lx)\n", KernelBase, KernelPageTableIndex); - /* Get the Startup Page Directory */ - PageDir = (PPAGE_DIRECTORY_ARM)&startup_pagedirectory; + /* Allocate 1MB PDE_BASE and HYPER_SPACE. This will be improved later. Must be 1MB aligned */ + PageDir = MmAllocateMemoryAtAddress(1 * 1024 * 1024, (PVOID)0x700000, LoaderMemoryData); + if (!PageDir) { printf("FATAL: No memory!\n"); while (TRUE); } printf("Initial Page Directory: 0x%p\n", PageDir); /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */ - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].LargePage = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].Accessed = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].PageFrameNumber = 0; + LargePte = &PageDir->Pte[LowMemPageTableIndex]; + *LargePte = TempLargePte; /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */ - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].LargePage = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].Accessed = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].PageFrameNumber = PaToLargePfn(0x10000000); - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].LargePage = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].Accessed = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].PageFrameNumber = PaToLargePfn(0x10100000); - printf("Paging init done\n"); - - #if 0 - ARM_PTE Pte; - ULONG i, j; - PARM_TRANSLATION_TABLE ArmTable; - PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable; - - // - // Get the PDEs that we will use - // - ArmTable = &ArmTranslationTable; - BootTable = &BootTranslationTable; - KernelTable = &KernelTranslationTable; - FlatMapTable = &FlatMapTranslationTable; - MasterTable = &MasterTranslationTable; - - // - // Set the master L1 PDE as the TTB - // - TtbRegister.AsUlong = (ULONG)ArmTable; - ASSERT(TtbRegister.Reserved == 0); - KeArmTranslationTableRegisterSet(TtbRegister); - - // - // Use Domain 0, enforce AP bits (client) - // - DomainRegister.AsUlong = 0; - DomainRegister.Domain0 = ClientDomain; - KeArmDomainRegisterSet(DomainRegister); - - // - // Set Fault PTEs everywhere - // - RtlZeroMemory(ArmTable, sizeof(ARM_TRANSLATION_TABLE)); - - // - // Identity map the first MB of memory - // - Pte.L1.Section.Type = SectionPte; - Pte.L1.Section.Buffered = FALSE; - Pte.L1.Section.Cached = FALSE; - Pte.L1.Section.Reserved = 1; // ARM926EJ-S manual recommends setting to 1 - Pte.L1.Section.Domain = Domain0; - Pte.L1.Section.Access = SupervisorAccess; - Pte.L1.Section.BaseAddress = 0; - Pte.L1.Section.Ignored = Pte.L1.Section.Ignored1 = 0; - ArmTable->Pte[0] = Pte; - - // - // Map the page in MMIO space that contains the serial port and timers - // - Pte.L1.Section.BaseAddress = ArmBoardBlock->UartRegisterBase >> PDE_SHIFT; - ArmTable->Pte[UART_VIRTUAL >> PDE_SHIFT] = Pte; - - // - // Create template PTE for the coarse page table which maps the PTE_BASE - // - Pte.L1.Coarse.Type = CoarsePte; - Pte.L1.Coarse.Domain = Domain0; - Pte.L1.Coarse.Reserved = 1; // ARM926EJ-S manual recommends setting to 1 - Pte.L1.Coarse.Ignored = Pte.L1.Coarse.Ignored1 = 0; - Pte.L1.Coarse.BaseAddress = (ULONG)FlatMapTable >> CPT_SHIFT; - - // - // On x86, there is 4MB of space, starting at 0xC0000000 to 0xC0400000 - // which contains the mappings for each PTE on the system. 4MB is needed - // since for 4GB, there will be 1 million PTEs, each of 4KB. - // - // To describe a 4MB region, on x86, only requires a page table, which can - // be linked from the page table directory. - // - // On the other hand, on ARM, we can only describe 1MB regions, so we need - // four times less PTE entries to represent a single mapping (an L2 coarse - // page table). This is problematic, because this would only take up 1KB of - // space, and we can't have a page that small. - // - // This means we must: - // - // - Allocate page tables (in physical memory) with 4KB granularity, instead - // of 1KB (the other 3KB is unused and invalid). - // - // - "Skip" the other 3KB in the region, because we can't point to another - // coarse page table after just 1KB. - // - // So 0xC0000000 will be mapped to the page table that maps the range of - // 0x00000000 to 0x01000000, while 0xC0001000 till be mapped to the page - // table that maps the area from 0x01000000 to 0x02000000, and so on. In - // total, this will require 4 million entries, and additionally, because of - // the padding, since each 256 entries will be 4KB (instead of 1KB), this - // means we'll need 16MB (0xC0000000 to 0xC1000000). - // - // We call this region the flat-map area - // - for (i = (PTE_BASE >> PDE_SHIFT); i < ((PTE_BASE + 0x1000000) >> PDE_SHIFT); i++) + LargePte = &PageDir->Pte[MmioPageTableIndex]; + Pfn = PaToLargePfn(0x10000000); + for (i = 0; i < 2; i++) { - // - // Write PTE and update the base address (next MB) for the next one - // - ArmTable->Pte[i] = Pte; - Pte.L1.Coarse.BaseAddress += 4; + TempLargePte.PageFrameNumber = Pfn++; + *LargePte++ = TempLargePte; } - // - // On x86, there is also the region of 0xC0300000 to 0xC03080000 which maps - // to the various PDEs on the system. Yes, this overlaps with the above, and - // works because of an insidious dark magic (self-mapping the PDE as a PTE). - // Unfortunately, this doesn't work on ARM, firstly because the size of a L1 - // page table is different than from an L2 page table, and secondly, which - // is even worse, the format for an L1 page table is different than the one - // for an L2 page table -- basically meaning we cannot self-map. - // - // However, we somewhat emulate this behavior on ARM. This will be expensive - // since we manually need to keep track of every page directory added and - // add an entry in our flat-map region. We also need to keep track of every - // change in the TTB, so that we can update the mappings in our PDE region. - // - // Note that for us, this region starts at 0xC1000000, after the flat-map - // area. - // - // Finally, to deal with different sizes (1KB page tables, 4KB page size!), - // we pad the ARM L2 page tables to make them 4KB, so that each page will - // therefore point to an L2 page table. - // - // This region is a lot easier than the first -- an L1 page table is only - // 16KB, so to access any index inside it, we just need 4 pages, since each - // page is 4KB... Clearly, there's also no need to pad in this case. - // - // We'll call this region the master translation area. - // - Pte.L1.Coarse.BaseAddress = (ULONG)MasterTable >> CPT_SHIFT; - ArmTable->Pte[PDE_BASE >> PDE_SHIFT] = Pte; - - // - // Now create the template for the coarse page tables which map the first 8MB - // - Pte.L1.Coarse.BaseAddress = (ULONG)BootTable >> CPT_SHIFT; - - // - // Map 0x00000000 - 0x007FFFFF to 0x80000000 - 0x807FFFFF. - // This is where the freeldr boot structures are located, and we need them. - // - for (i = (KSEG0_BASE >> PDE_SHIFT); i < ((KSEG0_BASE + 0x800000) >> PDE_SHIFT); i++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - ArmTable->Pte[i] = Pte; - Pte.L1.Coarse.BaseAddress += 4; - } + /* Allocate 8 page tables (8KB) to describe the 8MB initial kernel region */ + KernelPageTable = MmAllocateMemoryWithType(8192, LoaderMemoryData); + if (!KernelPageTable) { printf("FATAL: No memory!\n"); while (TRUE); } + printf("Kernel Page Tables: 0x%p\n", KernelPageTable); - // - // Now create the template PTE for the coarse page tables for the next 6MB - // - Pte.L1.Coarse.BaseAddress = (ULONG)KernelTable >> CPT_SHIFT; - - // - // Map 0x00800000 - 0x00DFFFFF to 0x80800000 - 0x80DFFFFF - // In this way, the KERNEL_PHYS_ADDR (0x800000) becomes 0x80800000 - // which is the kernel virtual base address, just like on x86. - // - ASSERT(KernelBase == 0x80800000); - for (i = (KernelBase >> PDE_SHIFT); i < ((KernelBase + 0x600000) >> PDE_SHIFT); i++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - ArmTable->Pte[i] = Pte; - Pte.L1.Coarse.BaseAddress += 4; - } - - // - // Now build the template PTE for the pages mapping the first 8MB - // - Pte.L2.Small.Type = SmallPte; - Pte.L2.Small.Buffered = Pte.L2.Small.Cached = 0; - Pte.L2.Small.Access0 = - Pte.L2.Small.Access1 = - Pte.L2.Small.Access2 = - Pte.L2.Small.Access3 = SupervisorAccess; - Pte.L2.Small.BaseAddress = 0; - - // - // Loop each boot coarse page table (i). - // Each PDE describes 1MB. We're mapping an area of 8MB, so 8 times. - // + /* Setup the Kernel PDEs */ + PointerPde = &PageDir->Pde[KernelPageTableIndex]; + Pfn = PaPtrToPdePfn(KernelPageTable); for (i = 0; i < 8; i++) { - // - // Loop and set each the PTE (j). - // Each PTE describes 4KB. We're mapping an area of 1MB, so 256 times. - // - for (j = 0; j < (PDE_SIZE / PAGE_SIZE); j++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - BootTable->Pte[j] = Pte; - Pte.L2.Small.BaseAddress++; - } + TempPde.PageFrameNumber = Pfn++; + *PointerPde++ = TempPde; + } + + /* Setup the Startup PDE */ + printf("PAGEDIR: %p IDX: %lx PPDE: %p PFN: %lx \n", PageDir, StartupPdePageTableIndex, &PageDir->Pte[StartupPdePageTableIndex], PaToLargePfn((ULONG_PTR)PageDir)); + LargePte = &PageDir->Pte[StartupPdePageTableIndex]; + TempLargePte.PageFrameNumber = PaToLargePfn((ULONG_PTR)PageDir); + printf("PAGEDIR: %p IDX: %lx PPDE: %p PFN: %lx \n", PageDir, StartupPdePageTableIndex, LargePte, TempLargePte.PageFrameNumber); + *LargePte = TempLargePte; + + /* After this point, any MiAddressToPde is guaranteed not to fault */ - // - // Next iteration - // - BootTable++; - } + /* Allocate 4 page tables (4KB) to describe the 4MB PTE_BASE region */ + PageTable = MmAllocateMemoryWithType(4096, LoaderMemoryData); + if (!PageTable) { printf("FATAL: No memory!\n"); while (TRUE); } + printf("Initial Page Tables: 0x%p\n", PageTable); - // - // Now create the template PTE for the pages mapping the next 6MB - // - Pte.L2.Small.BaseAddress = (ULONG)KERNEL_BASE_PHYS >> PTE_SHIFT; - - // - // Loop each kernel coarse page table (i). - // Each PDE describes 1MB. We're mapping an area of 6MB, so 6 times. - // - for (i = 0; i < 6; i++) - { - // - // Loop and set each the PTE (j). - // Each PTE describes 4KB. We're mapping an area of 1MB, so 256 times. - // - for (j = 0; j < (PDE_SIZE / PAGE_SIZE); j++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - KernelTable->Pte[j] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // Next iteration - // - KernelTable++; - } - - // - // Now we need to create the PTEs for the addresses which have been mapped - // already. - // - // We have allocated 4 page table directories: - // - // - One for the kernel, 6MB - // - One for low-memory FreeLDR, 8MB - // - One for identity-mapping below 1MB, 1MB - // - And finally, one for the flat-map itself, 16MB - // - // - Each MB mapped is a 1KB table, which we'll use a page to reference, so - // we will require 31 pages. - // - - // - // For the 0x80000000 region (8MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&BootTranslationTable >> PTE_SHIFT; - FlatMapTable = &(&FlatMapTranslationTable)[0x80000000 >> 28]; - for (i = 0; i < 8; i++) - { - // - // Point to the page table mapping the next MB - // - FlatMapTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // For the 0x80800000 region (6MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&KernelTranslationTable >> PTE_SHIFT; - for (i = 8; i < 14; i++) - { - // - // Point to the page table mapping the next MB - // - FlatMapTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // For the 0xC0000000 region (16MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&FlatMapTranslationTable >> PTE_SHIFT; - FlatMapTable = &(&FlatMapTranslationTable)[0xC0000000 >> 28]; - for (i = 0; i < 16; i++) - { - // - // Point to the page table mapping the next MB - // - FlatMapTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // For the 0xC1000000 region (1MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&MasterTranslationTable >> PTE_SHIFT; - FlatMapTable->Pte[16] = Pte; - - // - // Now we handle the master translation area for our PDEs. We'll just make - // the 4 page tables point to the ARM TTB. - // - Pte.L2.Small.BaseAddress = (ULONG)&ArmTranslationTable >> PTE_SHIFT; + /* + * Link them in the Startup PDE. + * Note these are the entries in the PD at (MiAddressToPde(PTE_BASE)). + */ + PointerPde = &PageDir->Pde[StartupPtePageTableIndex]; + Pfn = PaPtrToPdePfn(PageTable); for (i = 0; i < 4; i++) { - // - // Point to the page table mapping the next MB - // - MasterTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; + TempPde.PageFrameNumber = Pfn++; + *PointerPde++ = TempPde; } -#endif + + /* + * Now map these page tables in PTE space (MiAddressToPte(PTE_BASE)). + * Note that they all live on a single page, since each is 1KB. + */ + PointerPte = &PageTable->Pte[0x300]; + TempPte.PageFrameNumber = PaPtrToPfn(PageTable); + *PointerPte = TempPte; + + /* + * After this point, MiAddressToPte((PDE_BASE) to MiAddressToPte(PDE_TOP)) + * is guaranteed not to fault. + * Any subsequent page allocation will first need its page table created + * and mapped in the PTE_BASE first, then the page table itself will be + * editable through its flat PTE address. + */ + printf("Paging init done\n"); + return PageDir; } VOID -ArmSetupPagingAndJump(IN ULONG Magic) +ArmSetupPagingAndJump(IN PVOID PageDirectoryBaseAddress) { - ULONG_PTR PageDirectoryBaseAddress = (ULONG_PTR)&startup_pagedirectory; ARM_CONTROL_REGISTER ControlRegister; ARM_TTB_REGISTER TtbRegister; ARM_DOMAIN_REGISTER DomainRegister; /* Set the TTBR */ - TtbRegister.AsUlong = PageDirectoryBaseAddress; + TtbRegister.AsUlong = (ULONG_PTR)PageDirectoryBaseAddress; ASSERT(TtbRegister.Reserved == 0); KeArmTranslationTableRegisterSet(TtbRegister); @@ -1648,6 +1412,7 @@ ArmPrepareForReactOS(IN BOOLEAN Setup) VOID FrLdrStartup(IN ULONG Magic) { + PVOID PageDir; // // Disable interrupts (already done) // @@ -1659,10 +1424,10 @@ FrLdrStartup(IN ULONG Magic) // // Initialize the page directory // - ArmSetupPageDirectory(); + PageDir = ArmSetupPageDirectory(); // // Initialize paging and load NTOSKRNL // - ArmSetupPagingAndJump(Magic); + ArmSetupPagingAndJump(PageDir); } diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index 4457d197d9a..8acf17a59fe 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -1,6 +1,32 @@ #ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H #define __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H +// +// Number of bits corresponding to the area that a PDE entry represents (1MB) +// +#define PDE_SHIFT 20 +#define PDE_SIZE (1 << PDE_SHIFT) + +// +// Number of bits corresponding to the area that a coarse page table entry represents (4KB) +// +#define PTE_SHIFT 12 +#define PTE_SIZE (1 << PTE_SHIFT) + +// +// Number of bits corresponding to the area that a coarse page table occupies (1KB) +// +#define CPT_SHIFT 10 +#define CPT_SIZE (1 << CPT_SHIFT) + +// +// Base Addresses +// +#define PTE_BASE 0xC0000000 +#define PTE_TOP 0xC03FFFFF +#define PDE_BASE 0xC0400000 +#define HYPER_SPACE 0xC0404000 + typedef struct _HARDWARE_PDE_ARMV6 { ULONG Valid:1; // Only for small pages @@ -33,10 +59,6 @@ typedef struct _HARDWARE_LARGE_PTE_ARMV6 ULONG PageFrameNumber:12; } HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6; -C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); -C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); - - typedef struct _HARDWARE_PTE_ARMV6 { ULONG NoExecute:1; @@ -52,36 +74,35 @@ typedef struct _HARDWARE_PTE_ARMV6 ULONG PageFrameNumber:20; } HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6; +C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG)); + /* For FreeLDR */ +typedef struct _PAGE_TABLE_ARM +{ + HARDWARE_PTE_ARMV6 Pte[1024]; +} PAGE_TABLE_ARM, *PPAGE_TABLE_ARM; + typedef struct _PAGE_DIRECTORY_ARM { - HARDWARE_PDE_ARMV6 Pde[4096]; + union + { + HARDWARE_PDE_ARMV6 Pde[4096]; + HARDWARE_LARGE_PTE_ARMV6 Pte[4096]; + }; } PAGE_DIRECTORY_ARM, *PPAGE_DIRECTORY_ARM; -// -// Number of bits corresponding to the area that a PDE entry represents (1MB) -// -#define PDE_SHIFT 20 -#define PDE_SIZE (1 << PDE_SHIFT) - -// -// FIXFIX: This is all wrong now!!! -// - - -// -// Number of bits corresponding to the area that a coarse page table entry represents (4KB) -// -#define PTE_SHIFT 12 -//#define PAGE_SIZE (1 << PTE_SHIFT) // FIXME: This conflicts with ndk/arm/mmtypes.h which does #define PAGE_SIZE 0x1000 -- use PTE_SIZE here instead? - -// -// Number of bits corresponding to the area that a coarse page table occupies (1KB) -// -#define CPT_SHIFT 10 -#define CPT_SIZE (1 << CPT_SHIFT) - +C_ASSERT(sizeof(PAGE_TABLE_ARM) == PAGE_SIZE); +C_ASSERT(sizeof(PAGE_DIRECTORY_ARM) == (4 * PAGE_SIZE)); +typedef enum _ARM_DOMAIN +{ + FaultDomain, + ClientDomain, + InvalidDomain, + ManagerDomain +} ARM_DOMAIN; // // FIXFIX: This is all wrong now!!! @@ -202,14 +223,7 @@ typedef enum _ARM_PTE_ACCESS UserAccess } ARM_PTE_ACCESS; -typedef enum _ARM_DOMAIN -{ - FaultDomain, - ClientDomain, - InvalidDomain, - ManagerDomain -} ARM_DOMAIN; - +#if 0 // // FIXFIX: This is all wrong now!!! @@ -235,10 +249,6 @@ typedef enum _ARM_DOMAIN #define PDE_BASE 0xC1000000 #define HYPER_SPACE 0xC1100000 -struct _EPROCESS; -PULONG MmGetPageDirectory(VOID); - - // // FIXME: THESE ARE WRONG ATM. // @@ -249,6 +259,7 @@ PULONG MmGetPageDirectory(VOID); #define MiAddressToPteOffset(x) \ ((((ULONG)(x)) << 10) >> 22) + // // Convert a PTE into a corresponding address // @@ -258,6 +269,11 @@ PULONG MmGetPageDirectory(VOID); #define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) #define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) +#endif + +struct _EPROCESS; +PULONG MmGetPageDirectory(VOID); + #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1) #define MI_MAKE_DIRTY_PAGE(x) #define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Access = 1) // FIXFIX From 345b28b73a2497bcb89e9cf64ee1a8e7b84fd184 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sun, 7 Feb 2010 00:13:49 +0000 Subject: [PATCH 10/97] [MSVCRT_WINETEST] sync msvcrt_winetest to wine 1.1.38 svn path=/trunk/; revision=45478 --- rostests/winetests/msvcrt/cpp.c | 4 ++ rostests/winetests/msvcrt/file.c | 74 ++++++++++++++++++++++++- rostests/winetests/msvcrt/misc.c | 58 +++++++++++++++++++ rostests/winetests/msvcrt/msvcrt.rbuild | 1 + rostests/winetests/msvcrt/testlist.c | 2 + 5 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 rostests/winetests/msvcrt/misc.c diff --git a/rostests/winetests/msvcrt/cpp.c b/rostests/winetests/msvcrt/cpp.c index 106ef73ce27..40e11e17f4f 100644 --- a/rostests/winetests/msvcrt/cpp.c +++ b/rostests/winetests/msvcrt/cpp.c @@ -1034,6 +1034,10 @@ static void test_demangle(void) /* 113 */ {"?f@T@@QAEHQAY1BE@BO@$$CBD@Z", "public: int __thiscall T::f(char const (* const)[20][30])"}, /* 114 */ {"??0?$Foo@U?$vector_c@H$00$01$0?1$0A@$0A@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@$0HPPPPPPP@@mpl@boost@@@@QAE@XZ", "public: __thiscall Foo >::Foo >(void)"}, +/* 115 */ {"?swprintf@@YAHPAGIPBGZZ", "int __cdecl swprintf(unsigned short *,unsigned int,unsigned short const *,...)"}, +/* 116 */ {"?vswprintf@@YAHPAGIPBGPAD@Z", "int __cdecl vswprintf(unsigned short *,unsigned int,unsigned short const *,char *)"}, +/* 117 */ {"?vswprintf@@YAHPA_WIPB_WPAD@Z", "int __cdecl vswprintf(wchar_t *,unsigned int,wchar_t const *,char *)"}, +/* 118 */ {"?swprintf@@YAHPA_WIPB_WZZ", "int __cdecl swprintf(wchar_t *,unsigned int,wchar_t const *,...)"}, }; int i, num_test = (sizeof(test)/sizeof(test[0])); diff --git a/rostests/winetests/msvcrt/file.c b/rostests/winetests/msvcrt/file.c index e164555af57..5afdfcbabec 100644 --- a/rostests/winetests/msvcrt/file.c +++ b/rostests/winetests/msvcrt/file.c @@ -422,6 +422,35 @@ static WCHAR* AtoW( const char* p ) return buffer; } +/* Test reading in text mode when the 512'th character read is \r*/ +static void test_readboundary(void) +{ + FILE *fp; + char buf[513], rbuf[513]; + int i, j; + for (i = 0; i < 511; i++) + { + j = (i%('~' - ' ')+ ' '); + buf[i] = j; + } + buf[511] = '\n'; + buf[512] =0; + fp = fopen("boundary.tst", "wt"); + fwrite(buf, 512,1,fp); + fclose(fp); + fp = fopen("boundary.tst", "rt"); + for(i=0; i<512; i++) + { + fseek(fp,0 , SEEK_CUR); + rbuf[i] = fgetc(fp); + } + rbuf[512] =0; + fclose(fp); + unlink("boundary.tst"); + + ok(strcmp(buf, rbuf) == 0,"CRLF on buffer boundary failure\n"); + } + static void test_fgetc( void ) { char* tempf; @@ -438,6 +467,14 @@ static void test_fgetc( void ) ret = fgetc(tempfh); ok(ich == ret, "Second fgetc expected %x got %x\n", ich, ret); fclose(tempfh); + tempfh = fopen(tempf,"wt"); + fputc('\n', tempfh); + fclose(tempfh); + tempfh = fopen(tempf,"wt"); + setbuf(tempfh, NULL); + ret = fgetc(tempfh); + ok(ret == -1, "Unbuffered fgetc in text mode must failed on \\r\\n\n"); + fclose(tempfh); unlink(tempf); free(tempf); } @@ -800,15 +837,23 @@ static void test_file_write_read( void ) tempfd = _open(tempf,_O_RDONLY|_O_TEXT); /* open in TEXT mode */ _lseek(tempfd, -1, FILE_END); ret = _read(tempfd,btext,LLEN); - ok(ret == 1, "_read expected 1 got bad length: %d\n", ret); + ok(ret == 1 && *btext == '\n', "_read expected 1 got bad length: %d\n", ret); _lseek(tempfd, -2, FILE_END); ret = _read(tempfd,btext,LLEN); ok(ret == 1 && *btext == '\n', "_read expected '\\n' got bad length: %d\n", ret); _lseek(tempfd, -3, FILE_END); + ret = _read(tempfd,btext,1); + ok(ret == 1 && *btext == 'e', "_read expected 'e' got \"%.*s\" bad length: %d\n", ret, btext, ret); + ok(tell(tempfd) == 41, "bad position %u expecting 41\n", tell(tempfd)); + _lseek(tempfd, -3, FILE_END); ret = _read(tempfd,btext,2); ok(ret == 1 && *btext == 'e', "_read expected 'e' got \"%.*s\" bad length: %d\n", ret, btext, ret); ok(tell(tempfd) == 42, "bad position %u expecting 42\n", tell(tempfd)); - _close(tempfd); + _lseek(tempfd, -3, FILE_END); + ret = _read(tempfd,btext,3); + ok(ret == 2 && *btext == 'e', "_read expected 'e' got \"%.*s\" bad length: %d\n", ret, btext, ret); + ok(tell(tempfd) == 43, "bad position %u expecting 43\n", tell(tempfd)); + _close(tempfd); ret = unlink(tempf); ok( ret == 0 ,"Can't unlink '%s': %d\n", tempf, errno); @@ -835,7 +880,23 @@ static void test_file_write_read( void ) "problems with _O_BINARY _write / _O_TEXT _read\n"); _close(tempfd); - ret =_chmod (tempf, _S_IREAD | _S_IWRITE); + /* test _read with single bytes. CR should be skipped and LF pulled in */ + tempfd = _open(tempf,_O_RDONLY|_O_TEXT); /* open in TEXT mode */ + for (i=0; i + +static int (__cdecl *prand_s)(unsigned int *); + +static void init(void) +{ + HMODULE hmod = GetModuleHandleA("msvcrt.dll"); + + prand_s = (void *)GetProcAddress(hmod, "rand_s"); +} + +static void test_rand_s(void) +{ + int ret; + unsigned int rand; + + if (!prand_s) + { + win_skip("rand_s is not available\n"); + return; + } + + errno = EBADF; + ret = prand_s(NULL); + ok(ret == EINVAL, "Expected rand_s to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to return EINVAL, got %d\n", errno); + + ret = prand_s(&rand); + ok(ret == 0, "Expected rand_s to return 0, got %d\n", ret); +} + +START_TEST(misc) +{ + init(); + + test_rand_s(); +} diff --git a/rostests/winetests/msvcrt/msvcrt.rbuild b/rostests/winetests/msvcrt/msvcrt.rbuild index 1657252b945..12c4a534fdb 100644 --- a/rostests/winetests/msvcrt/msvcrt.rbuild +++ b/rostests/winetests/msvcrt/msvcrt.rbuild @@ -27,6 +27,7 @@ file.c headers.c heap.c + misc.c printf.c scanf.c signal.c diff --git a/rostests/winetests/msvcrt/testlist.c b/rostests/winetests/msvcrt/testlist.c index 4bd436d9dea..80259dff799 100644 --- a/rostests/winetests/msvcrt/testlist.c +++ b/rostests/winetests/msvcrt/testlist.c @@ -13,6 +13,7 @@ extern void func_environ(void); extern void func_file(void); extern void func_headers(void); extern void func_heap(void); +extern void func_misc(void); extern void func_printf(void); extern void func_scanf(void); extern void func_signal(void); @@ -28,6 +29,7 @@ const struct test winetest_testlist[] = { "file", func_file }, { "headers", func_headers }, { "heap", func_heap }, + { "misc", func_misc }, { "printf", func_printf }, { "scanf", func_scanf }, { "signal", func_signal }, From f39b10c917feda0c4c8640eaf8622b05c2eef410 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sun, 7 Feb 2010 00:28:22 +0000 Subject: [PATCH 11/97] [AVIFIL32] sync avifil32 to wine 1.1.38 svn path=/trunk/; revision=45479 --- reactos/dll/win32/avifil32/api.c | 9 ++- reactos/dll/win32/avifil32/avifile.c | 96 ++++++++++++++++-------- reactos/dll/win32/avifil32/avifile_Cs.rc | 2 + reactos/dll/win32/avifil32/avifile_Da.rc | 2 + reactos/dll/win32/avifil32/avifile_De.rc | 11 ++- reactos/dll/win32/avifil32/avifile_En.rc | 4 +- reactos/dll/win32/avifil32/avifile_Es.rc | 2 + reactos/dll/win32/avifil32/avifile_Fr.rc | 30 +++++--- reactos/dll/win32/avifil32/avifile_Hu.rc | 2 + reactos/dll/win32/avifil32/avifile_It.rc | 2 + reactos/dll/win32/avifil32/avifile_Ja.rc | 2 + reactos/dll/win32/avifil32/avifile_Ko.rc | 2 + reactos/dll/win32/avifil32/avifile_Nl.rc | 2 + reactos/dll/win32/avifil32/avifile_No.rc | 2 + reactos/dll/win32/avifil32/avifile_Pl.rc | 2 + reactos/dll/win32/avifil32/avifile_Pt.rc | 2 + reactos/dll/win32/avifil32/avifile_Ru.rc | 38 ++++++---- reactos/dll/win32/avifil32/avifile_Si.rc | 2 + reactos/dll/win32/avifil32/avifile_Sv.rc | 2 + 19 files changed, 145 insertions(+), 69 deletions(-) diff --git a/reactos/dll/win32/avifil32/api.c b/reactos/dll/win32/avifil32/api.c index 8107b478fb5..dd1c2e23488 100644 --- a/reactos/dll/win32/avifil32/api.c +++ b/reactos/dll/win32/avifil32/api.c @@ -244,7 +244,7 @@ HRESULT WINAPI AVIFileOpenW(PAVIFILE *ppfile, LPCWSTR szFile, UINT uMode, /* if no handler then try guessing it by extension */ if (lpHandler == NULL) { if (! AVIFILE_GetFileHandlerByExtension(szFile, &clsidHandler)) - return AVIERR_UNSUPPORTED; + clsidHandler = CLSID_AVIFile; } else clsidHandler = *lpHandler; @@ -1225,13 +1225,14 @@ static BOOL AVISaveOptionsFmtChoose(HWND hWnd) acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &size); if ((pOptions->cbFormat == 0 || pOptions->lpFormat == NULL) && size != 0) { pOptions->lpFormat = HeapAlloc(GetProcessHeap(), 0, size); + if (!pOptions->lpFormat) return FALSE; pOptions->cbFormat = size; } else if (pOptions->cbFormat < (DWORD)size) { - pOptions->lpFormat = HeapReAlloc(GetProcessHeap(), 0, pOptions->lpFormat, size); + void *new_buffer = HeapReAlloc(GetProcessHeap(), 0, pOptions->lpFormat, size); + if (!new_buffer) return FALSE; + pOptions->lpFormat = new_buffer; pOptions->cbFormat = size; } - if (pOptions->lpFormat == NULL) - return FALSE; afmtc.pwfx = pOptions->lpFormat; afmtc.cbwfx = pOptions->cbFormat; diff --git a/reactos/dll/win32/avifil32/avifile.c b/reactos/dll/win32/avifil32/avifile.c index 49e141ff389..702ba1cc321 100644 --- a/reactos/dll/win32/avifil32/avifile.c +++ b/reactos/dll/win32/avifil32/avifile.c @@ -1087,6 +1087,15 @@ static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start, LONG block = start; LONG offset = 0; + if (!buffer) + { + if (bytesread) + *bytesread = samples*This->sInfo.dwSampleSize; + if (samplesread) + *samplesread = samples; + return AVIERR_OK; + } + /* convert start sample to block,offset pair */ AVIFILE_SamplesToBlock(This, &block, &offset); @@ -1094,6 +1103,7 @@ static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start, samples *= This->sInfo.dwSampleSize; while (samples > 0 && buffersize > 0) { + LONG blocksize; if (block != This->dwCurrentFrame) { hr = AVIFILE_ReadBlock(This, block, NULL, 0); if (FAILED(hr)) @@ -1101,7 +1111,9 @@ static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start, } size = min((DWORD)samples, (DWORD)buffersize); - size = min(size, This->cbBuffer - offset); + blocksize = This->lpBuffer[1]; + TRACE("blocksize = %u\n",blocksize); + size = min(size, blocksize - offset); memcpy(buffer, ((BYTE*)&This->lpBuffer[2]) + offset, size); block++; @@ -1362,6 +1374,8 @@ static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream *iface, static HRESULT AVIFILE_AddFrame(IAVIStreamImpl *This, DWORD ckid, DWORD size, DWORD offset, DWORD flags) { + UINT n; + /* pre-conditions */ assert(This != NULL); @@ -1379,31 +1393,32 @@ static HRESULT AVIFILE_AddFrame(IAVIStreamImpl *This, DWORD ckid, DWORD size, DW ERR(": found palette change in non-video stream!\n"); return AVIERR_BADFORMAT; } - This->sInfo.dwFlags |= AVISTREAMINFO_FORMATCHANGES; - This->sInfo.dwFormatChangeCount++; - if (This->idxFmtChanges == NULL || This->sInfo.dwFormatChangeCount < This->nIdxFmtChanges) { - UINT n = This->sInfo.dwFormatChangeCount; + if (This->idxFmtChanges == NULL || This->nIdxFmtChanges <= This->sInfo.dwFormatChangeCount) { + DWORD new_count = This->nIdxFmtChanges + 16; + void *new_buffer; - This->nIdxFmtChanges += 16; - if (This->idxFmtChanges == NULL) + if (This->idxFmtChanges == NULL) { This->idxFmtChanges = - HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->nIdxFmtChanges * sizeof(AVIINDEXENTRY)); - else - This->idxFmtChanges = - HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->idxFmtChanges, - This->nIdxFmtChanges * sizeof(AVIINDEXENTRY)); - if (This->idxFmtChanges == NULL) - return AVIERR_MEMORY; - - This->idxFmtChanges[n].ckid = This->lLastFrame; - This->idxFmtChanges[n].dwFlags = 0; - This->idxFmtChanges[n].dwChunkOffset = offset; - This->idxFmtChanges[n].dwChunkLength = size; - - return AVIERR_OK; + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * sizeof(AVIINDEXENTRY)); + if (!This->idxFmtChanges) return AVIERR_MEMORY; + } else { + new_buffer = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->idxFmtChanges, + new_count * sizeof(AVIINDEXENTRY)); + if (!new_buffer) return AVIERR_MEMORY; + This->idxFmtChanges = new_buffer; + } + This->nIdxFmtChanges = new_count; } - break; + + This->sInfo.dwFlags |= AVISTREAMINFO_FORMATCHANGES; + n = ++This->sInfo.dwFormatChangeCount; + This->idxFmtChanges[n].ckid = This->lLastFrame; + This->idxFmtChanges[n].dwFlags = 0; + This->idxFmtChanges[n].dwChunkOffset = offset; + This->idxFmtChanges[n].dwChunkLength = size; + + return AVIERR_OK; case cktypeWAVEbytes: if (This->paf->fInfo.dwFlags & AVIFILEINFO_TRUSTCKTYPE) flags |= AVIIF_KEYFRAME; @@ -1652,7 +1667,7 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This) This->fInfo.dwCaps = AVIFILECAPS_CANREAD|AVIFILECAPS_CANWRITE; This->fInfo.dwLength = MainAVIHdr.dwTotalFrames; This->fInfo.dwStreams = MainAVIHdr.dwStreams; - This->fInfo.dwSuggestedBufferSize = MainAVIHdr.dwSuggestedBufferSize; + This->fInfo.dwSuggestedBufferSize = 0; This->fInfo.dwWidth = MainAVIHdr.dwWidth; This->fInfo.dwHeight = MainAVIHdr.dwHeight; LoadStringW(AVIFILE_hModule, IDS_AVIFILETYPE, This->fInfo.szFileType, @@ -1754,8 +1769,7 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This) pStream->sInfo.dwRate = streamHdr.dwRate; pStream->sInfo.dwStart = streamHdr.dwStart; pStream->sInfo.dwLength = streamHdr.dwLength; - pStream->sInfo.dwSuggestedBufferSize = - streamHdr.dwSuggestedBufferSize; + pStream->sInfo.dwSuggestedBufferSize = 0; pStream->sInfo.dwQuality = streamHdr.dwQuality; pStream->sInfo.dwSampleSize = streamHdr.dwSampleSize; pStream->sInfo.rcFrame.left = streamHdr.rcFrame.left; @@ -1816,7 +1830,14 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This) if (FAILED(hr)) return hr; }; - + if (pStream->lpFormat != NULL && pStream->sInfo.fccType == streamtypeAUDIO) + { + WAVEFORMATEX *wfx = pStream->lpFormat; /* wfx->nBlockAlign = wfx->nChannels * wfx->wBitsPerSample / 8; could be added */ + pStream->sInfo.dwSampleSize = wfx->nBlockAlign; /* to deal with corrupt wfx->nBlockAlign but Windows doesn't do this */ + TRACE("Block size reset to %u, chan=%u bpp=%u\n", wfx->nBlockAlign, wfx->nChannels, wfx->wBitsPerSample); + pStream->sInfo.dwScale = 1; + pStream->sInfo.dwRate = wfx->nSamplesPerSec; + } if (mmioAscend(This->hmmio, &ck, 0) != S_OK) return AVIERR_FILEREAD; } @@ -1897,6 +1918,13 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This) } } + for (nStream = 0; nStream < This->fInfo.dwStreams; nStream++) + { + DWORD sugbuf = This->ppStreams[nStream]->sInfo.dwSuggestedBufferSize; + if (This->fInfo.dwSuggestedBufferSize < sugbuf) + This->fInfo.dwSuggestedBufferSize = sugbuf; + } + /* find other chunks */ FindChunkAndKeepExtras(&This->fileextra, This->hmmio, &ck, &ckRIFF, 0); @@ -2027,16 +2055,18 @@ static HRESULT AVIFILE_ReadBlock(IAVIStreamImpl *This, DWORD pos, size += 2 * sizeof(DWORD); /* check that buffer is big enough -- don't trust dwSuggestedBufferSize */ - if (This->lpBuffer == NULL || size < This->cbBuffer) { + if (This->lpBuffer == NULL || This->cbBuffer < size) { DWORD maxSize = max(size, This->sInfo.dwSuggestedBufferSize); - if (This->lpBuffer == NULL) + if (This->lpBuffer == NULL) { This->lpBuffer = HeapAlloc(GetProcessHeap(), 0, maxSize); - else - This->lpBuffer = HeapReAlloc(GetProcessHeap(), 0, This->lpBuffer, maxSize); - if (This->lpBuffer == NULL) - return AVIERR_MEMORY; - This->cbBuffer = max(size, This->sInfo.dwSuggestedBufferSize); + if (!This->lpBuffer) return AVIERR_MEMORY; + } else { + void *new_buffer = HeapReAlloc(GetProcessHeap(), 0, This->lpBuffer, maxSize); + if (!new_buffer) return AVIERR_MEMORY; + This->lpBuffer = new_buffer; + } + This->cbBuffer = maxSize; } /* now read the complete chunk into our buffer */ diff --git a/reactos/dll/win32/avifil32/avifile_Cs.rc b/reactos/dll/win32/avifil32/avifile_Cs.rc index 86dac3fdf85..180ac73838f 100644 --- a/reactos/dll/win32/avifil32/avifile_Cs.rc +++ b/reactos/dll/win32/avifil32/avifile_Cs.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_CZECH, SUBLANG_DEFAULT /* Czech strings in CP1250 */ diff --git a/reactos/dll/win32/avifil32/avifile_Da.rc b/reactos/dll/win32/avifil32/avifile_Da.rc index 669e9185906..22f4576eb1f 100644 --- a/reactos/dll/win32/avifil32/avifile_Da.rc +++ b/reactos/dll/win32/avifil32/avifile_Da.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_DANISH, SUBLANG_DEFAULT IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_De.rc b/reactos/dll/win32/avifil32/avifile_De.rc index 9e3e5f284d0..7b40709b9a6 100644 --- a/reactos/dll/win32/avifil32/avifile_De.rc +++ b/reactos/dll/win32/avifil32/avifile_De.rc @@ -1,5 +1,5 @@ /* - * Copyright 2002 Michael Günnewig + * Copyright 2002 Michael Günnewig * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + +#pragma code_page(65001) + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 @@ -23,7 +27,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Komprimierungsoptionen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Wählen Sie die Eingangsdaten aus:",-1,2,5,154,10 + LTEXT "&Wählen Sie die Eingangsdaten aus:",-1,2,5,154,10 COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Optionen...",IDC_OPTIONS,170,17,50,14 @@ -31,7 +35,7 @@ BEGIN EDITTEXT IDC_INTERLEAVEEVERY,81,41,32,12,ES_AUTOHSCROLL LTEXT "Einzelbilder",-1,119,43,36,9 LTEXT "Aktuelles Format:",-1,3,56,73,9 - LTEXT "This space for rent",IDC_FORMATTEXT,75,56,90,26 + LTEXT "Platzhalter",IDC_FORMATTEXT,75,56,90,26 DEFPUSHBUTTON "OK",IDOK,170,42,50,14 PUSHBUTTON "Abbrechen",IDCANCEL,170,61,50,14 END @@ -48,3 +52,4 @@ STRINGTABLE DISCARDABLE IDS_AVIFILETYPE "Wine AVI-Standard-Dateibehandlungsroutine" IDS_UNCOMPRESSED "Unkomprimiert" } +#pragma code_page(default) diff --git a/reactos/dll/win32/avifil32/avifile_En.rc b/reactos/dll/win32/avifil32/avifile_En.rc index 0947cbd47d0..e136569e044 100644 --- a/reactos/dll/win32/avifil32/avifile_En.rc +++ b/reactos/dll/win32/avifil32/avifile_En.rc @@ -1,5 +1,5 @@ /* - * Copyright 2002 Michael Günnewig + * Copyright 2002 Michael Günnewig * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Es.rc b/reactos/dll/win32/avifil32/avifile_Es.rc index 45d7003fb7d..ddeee99f610 100644 --- a/reactos/dll/win32/avifil32/avifile_Es.rc +++ b/reactos/dll/win32/avifil32/avifile_Es.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Fr.rc b/reactos/dll/win32/avifil32/avifile_Fr.rc index 6a38721d58f..45adafe8f02 100644 --- a/reactos/dll/win32/avifil32/avifile_Fr.rc +++ b/reactos/dll/win32/avifil32/avifile_Fr.rc @@ -2,8 +2,8 @@ * Avifil32 * French language support * - * Copyright 2002 Michael Günnewig - * Copyright 2003 Vincent Béron + * Copyright 2002 Michael Günnewig + * Copyright 2003 Vincent Béron * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,6 +20,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + +/* UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 @@ -27,28 +32,29 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Options de compression" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Sélectionnez un flux :",-1,2,5,154,10 + LTEXT "&Sélectionnez un flux :",-1,2,5,154,10 COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Options...",IDC_OPTIONS,170,17,50,14 - AUTOCHECKBOX "&Imbriquer à chaque",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP + AUTOCHECKBOX "&Imbriquer toutes les",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL LTEXT "images",-1,129,43,36,9 - LTEXT "Format actuel:",-1,3,56,73,9 - LTEXT "Cet espace est à louer",IDC_FORMATTEXT,75,56,90,26 + LTEXT "Format actuel :",-1,3,56,73,9 + LTEXT "Cet espace est à louer",IDC_FORMATTEXT,75,56,90,26 DEFPUSHBUTTON "OK",IDOK,170,42,50,14 PUSHBUTTON "Annuler",IDCANCEL,170,61,50,14 END STRINGTABLE DISCARDABLE { - IDS_WAVESTREAMFORMAT "Waveform : %s" + IDS_WAVESTREAMFORMAT "Waveform : %s" IDS_WAVEFILETYPE "Waveform" - IDS_ALLMULTIMEDIA "Tous les fichiers multimédias" - IDS_ALLFILES "Tous les fichier (*.*)@*.*" - IDS_VIDEO "vidéo" + IDS_ALLMULTIMEDIA "Tous les fichiers multimédia" + IDS_ALLFILES "Tous les fichiers (*.*)@*.*" + IDS_VIDEO "vidéo" IDS_AUDIO "audio" IDS_AVISTREAMFORMAT "%s %s #%d" - IDS_AVIFILETYPE "Wine AVI-default-filehandler" - IDS_UNCOMPRESSED "non compressé" + IDS_AVIFILETYPE "Gestionnaire de fichiers AVI par défaut de Wine" + IDS_UNCOMPRESSED "non compressé" } +#pragma code_page(default) diff --git a/reactos/dll/win32/avifil32/avifile_Hu.rc b/reactos/dll/win32/avifil32/avifile_Hu.rc index e9bdce9997a..6c3e9c256ff 100644 --- a/reactos/dll/win32/avifil32/avifile_Hu.rc +++ b/reactos/dll/win32/avifil32/avifile_Hu.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_It.rc b/reactos/dll/win32/avifil32/avifile_It.rc index 6f06ec538a8..314d34dc70b 100644 --- a/reactos/dll/win32/avifil32/avifile_It.rc +++ b/reactos/dll/win32/avifil32/avifile_It.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Ja.rc b/reactos/dll/win32/avifil32/avifile_Ja.rc index ab5bdfe6a7f..4ac229c21fe 100644 --- a/reactos/dll/win32/avifil32/avifile_Ja.rc +++ b/reactos/dll/win32/avifil32/avifile_Ja.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + /* UTF-8 */ #pragma code_page(65001) diff --git a/reactos/dll/win32/avifil32/avifile_Ko.rc b/reactos/dll/win32/avifil32/avifile_Ko.rc index 46c482122ed..622880cb01b 100644 --- a/reactos/dll/win32/avifil32/avifile_Ko.rc +++ b/reactos/dll/win32/avifil32/avifile_Ko.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Nl.rc b/reactos/dll/win32/avifil32/avifile_Nl.rc index b1205721871..b2546a0aaee 100644 --- a/reactos/dll/win32/avifil32/avifile_Nl.rc +++ b/reactos/dll/win32/avifil32/avifile_Nl.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_No.rc b/reactos/dll/win32/avifil32/avifile_No.rc index 8483ab25b14..84198511762 100644 --- a/reactos/dll/win32/avifil32/avifile_No.rc +++ b/reactos/dll/win32/avifil32/avifile_No.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Pl.rc b/reactos/dll/win32/avifil32/avifile_Pl.rc index 49abdb0c5b8..f5e8edadc50 100644 --- a/reactos/dll/win32/avifil32/avifile_Pl.rc +++ b/reactos/dll/win32/avifil32/avifile_Pl.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_POLISH, SUBLANG_DEFAULT IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Pt.rc b/reactos/dll/win32/avifil32/avifile_Pt.rc index 37bb941673b..ce3d032eb91 100644 --- a/reactos/dll/win32/avifil32/avifile_Pt.rc +++ b/reactos/dll/win32/avifil32/avifile_Pt.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 diff --git a/reactos/dll/win32/avifil32/avifile_Ru.rc b/reactos/dll/win32/avifil32/avifile_Ru.rc index fa8206d3824..4a75a6721b6 100644 --- a/reactos/dll/win32/avifil32/avifile_Ru.rc +++ b/reactos/dll/win32/avifil32/avifile_Ru.rc @@ -18,35 +18,41 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + +/* UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Íàñòðîéêè ñæàòèÿ" +CAPTION "ÐаÑтройки ÑжатиÑ" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Âûáåðèòå ïîòîê:",-1,2,5,154,10 + LTEXT "&Выберите поток:",-1,2,5,154,10 COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Îïöèè...",IDC_OPTIONS,170,17,50,14 - AUTOCHECKBOX "&Ïðîñëàèâàòü êàæäûå",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP + PUSHBUTTON "&Опции...",IDC_OPTIONS,170,17,50,14 + AUTOCHECKBOX "&ПроÑлаивать каждые",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL - LTEXT "ôðåéìà",-1,129,43,36,9 - LTEXT "Òåêóùèé ôîðìàò:",-1,3,56,73,9 - LTEXT "Ýòî ìåñòî ñäà¸òñÿ â àðåíäó",IDC_FORMATTEXT,75,56,90,26 + LTEXT "фрейма",-1,129,43,36,9 + LTEXT "Текущий формат:",-1,3,56,73,9 + LTEXT "Это меÑто ÑдаётÑÑ Ð² аренду",IDC_FORMATTEXT,75,56,90,26 DEFPUSHBUTTON "OK",IDOK,170,42,50,14 - PUSHBUTTON "Îòìåíà",IDCANCEL,170,61,50,14 + PUSHBUTTON "Отмена",IDCANCEL,170,61,50,14 END STRINGTABLE DISCARDABLE { - IDS_WAVESTREAMFORMAT "Çâóêîâîé ïîòîê: %s" - IDS_WAVEFILETYPE "Çâóêîâîé ïîòîê" - IDS_ALLMULTIMEDIA "Âñå ôàéëû ìóëüòèìåäèà" - IDS_ALLFILES "Âñå ôàéëû (*.*)@*.*" - IDS_VIDEO "âèäåî" - IDS_AUDIO "àóäèî" + IDS_WAVESTREAMFORMAT "Звуковой поток: %s" + IDS_WAVEFILETYPE "Звуковой поток" + IDS_ALLMULTIMEDIA "Ð’Ñе файлы мультимедиа" + IDS_ALLFILES "Ð’Ñе файлы (*.*)@*.*" + IDS_VIDEO "видео" + IDS_AUDIO "аудио" IDS_AVISTREAMFORMAT "%s %s #%d" - IDS_AVIFILETYPE "Îáðàáîò÷èê ïî óìîë÷àíèþ avi-ôàéëîâ â Wine" - IDS_UNCOMPRESSED "áåç ñæàòèÿ" + IDS_AVIFILETYPE "Обработчик по умолчанию avi-файлов в Wine" + IDS_UNCOMPRESSED "без ÑжатиÑ" } +#pragma code_page(default) diff --git a/reactos/dll/win32/avifil32/avifile_Si.rc b/reactos/dll/win32/avifil32/avifile_Si.rc index 579be48d02d..e7d90f65893 100644 --- a/reactos/dll/win32/avifil32/avifile_Si.rc +++ b/reactos/dll/win32/avifil32/avifile_Si.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT diff --git a/reactos/dll/win32/avifil32/avifile_Sv.rc b/reactos/dll/win32/avifil32/avifile_Sv.rc index f65e4d216cc..126bca6e6a1 100644 --- a/reactos/dll/win32/avifil32/avifile_Sv.rc +++ b/reactos/dll/win32/avifil32/avifile_Sv.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "avifile_private.h" + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 From 5786bc7b81f1c9ce07d879f369092b42ed034800 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sun, 7 Feb 2010 03:01:19 +0000 Subject: [PATCH 12/97] [NTOS]: Add a branch-to-self to start testing kernel code. [ARMLLB]: Fix incorrect frame buffer size calculation. [FREELDR]: Finish paging setup. Now we're able to boot to the kernel entrypoint at 0x808D3000, but I'm not happy with the memory descriptors. svn path=/trunk/; revision=45480 --- reactos/boot/armllb/hw/versatile/hwinfo.c | 8 +- .../boot/freeldr/freeldr/arch/arm/loader.c | 30 ++--- reactos/ntoskrnl/include/internal/arm/mm.h | 124 +++++++++--------- reactos/ntoskrnl/ke/arm/boot.s | 1 + 4 files changed, 79 insertions(+), 84 deletions(-) diff --git a/reactos/boot/armllb/hw/versatile/hwinfo.c b/reactos/boot/armllb/hw/versatile/hwinfo.c index c312e125552..c1dd350f884 100755 --- a/reactos/boot/armllb/hw/versatile/hwinfo.c +++ b/reactos/boot/armllb/hw/versatile/hwinfo.c @@ -47,8 +47,8 @@ LlbHwGetSerialUart(VOID) // 0x00000200 - 0x0000FFFF ARM STACK [ 62 KB] // 0x00010000 - 0x0001FFFF ARM LLB [ 64 KB] // 0x00020000 - 0x0009FFFF ARM OS LOADER [512 KB] -// 0x000A0000 - 0x000FFFFF ARM FRAMEBUFFER [384 KB] -// 0x00100000 - 0x007FFFFF OS LOADER FREE/UNUSED [ 7 MB] +// 0x000A0000 - 0x0013FFFF ARM FRAMEBUFFER [640 KB] +// 0x00140000 - 0x007FFFFF OS LOADER FREE/UNUSED [ 6 MB] // 0x00800000 - 0x017FFFFF KERNEL, HAL, INITIAL DRIVER LOAD ADDR [ 16 MB] // 0x01800000 - 0x037FFFFF RAM DISK [ 32 MB] // 0x03800000 - 0x07FFFFFF FREE RAM [ 72 MB] @@ -61,8 +61,8 @@ BIOS_MEMORY_MAP LlbHwVersaMemoryMap[] = {0x00000200, 0x0000FE00, BiosMemoryBootStrap, 0}, {0x00010000, 0x00010000, BiosMemoryBootStrap, 0}, {0x00020000, 0x00080000, BiosMemoryBootLoader, 0}, - {0x000A0000, 0x00060000, BiosMemoryBootLoader, 0}, - {0x00100000, 0x01700000, BiosMemoryUsable, 0}, + {0x000A0000, 0x000A0000, BiosMemoryBootLoader, 0}, + {0x00140000, 0x016C0000, BiosMemoryUsable, 0}, {0x01800000, 0x02000000, BiosMemoryReserved, 0}, {0x10000000, 0x10000000, BiosMemoryReserved, 0}, {0, 0, 0, 0} diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c index b742a898b68..fadce699c6b 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/loader.c @@ -719,12 +719,9 @@ ArmSetupPageDirectory(VOID) /* Get the Kernel Table Index */ KernelPageTableIndex = KernelBase >> PDE_SHIFT; - printf("Kernel Base: 0x%p (PDE Index: %lx)\n", KernelBase, KernelPageTableIndex); - - /* Allocate 1MB PDE_BASE and HYPER_SPACE. This will be improved later. Must be 1MB aligned */ + + /* Allocate 1MB PDE_BASE and HYPER_SPACE. This will be improved later. Must be 1MB aligned */ PageDir = MmAllocateMemoryAtAddress(1 * 1024 * 1024, (PVOID)0x700000, LoaderMemoryData); - if (!PageDir) { printf("FATAL: No memory!\n"); while (TRUE); } - printf("Initial Page Directory: 0x%p\n", PageDir); /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */ LargePte = &PageDir->Pte[LowMemPageTableIndex]; @@ -741,31 +738,35 @@ ArmSetupPageDirectory(VOID) /* Allocate 8 page tables (8KB) to describe the 8MB initial kernel region */ KernelPageTable = MmAllocateMemoryWithType(8192, LoaderMemoryData); - if (!KernelPageTable) { printf("FATAL: No memory!\n"); while (TRUE); } - printf("Kernel Page Tables: 0x%p\n", KernelPageTable); /* Setup the Kernel PDEs */ PointerPde = &PageDir->Pde[KernelPageTableIndex]; Pfn = PaPtrToPdePfn(KernelPageTable); for (i = 0; i < 8; i++) { - TempPde.PageFrameNumber = Pfn++; + TempPde.PageFrameNumber = Pfn; *PointerPde++ = TempPde; + Pfn++; } - + + /* Setup the Kernel PTEs */ + PointerPte = KernelPageTable->Pte; + Pfn = PaPtrToPfn(KERNEL_BASE_PHYS); + for (i = 0; i < 1536; i++) + { + TempPte.PageFrameNumber = Pfn++; + *PointerPte++ = TempPte; + } + /* Setup the Startup PDE */ - printf("PAGEDIR: %p IDX: %lx PPDE: %p PFN: %lx \n", PageDir, StartupPdePageTableIndex, &PageDir->Pte[StartupPdePageTableIndex], PaToLargePfn((ULONG_PTR)PageDir)); LargePte = &PageDir->Pte[StartupPdePageTableIndex]; TempLargePte.PageFrameNumber = PaToLargePfn((ULONG_PTR)PageDir); - printf("PAGEDIR: %p IDX: %lx PPDE: %p PFN: %lx \n", PageDir, StartupPdePageTableIndex, LargePte, TempLargePte.PageFrameNumber); *LargePte = TempLargePte; /* After this point, any MiAddressToPde is guaranteed not to fault */ /* Allocate 4 page tables (4KB) to describe the 4MB PTE_BASE region */ PageTable = MmAllocateMemoryWithType(4096, LoaderMemoryData); - if (!PageTable) { printf("FATAL: No memory!\n"); while (TRUE); } - printf("Initial Page Tables: 0x%p\n", PageTable); /* * Link them in the Startup PDE. @@ -794,7 +795,6 @@ ArmSetupPageDirectory(VOID) * and mapped in the PTE_BASE first, then the page table itself will be * editable through its flat PTE address. */ - printf("Paging init done\n"); return PageDir; } @@ -825,8 +825,6 @@ ArmSetupPagingAndJump(IN PVOID PageDirectoryBaseAddress) KeArmControlRegisterSet(ControlRegister); /* Jump to Kernel */ - TuiPrintf("Hello from MMU Enabled!\n"); - while (TRUE); (*KernelEntryPoint)((PVOID)((ULONG_PTR)ArmLoaderBlock | KSEG0_BASE)); } diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index 8acf17a59fe..f318d9a0fd9 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -65,8 +65,8 @@ typedef struct _HARDWARE_PTE_ARMV6 ULONG Valid:1; ULONG Buffered:1; ULONG Cached:1; - ULONG Owner:1; ULONG Accessed:1; + ULONG Owner:1; ULONG CacheAttributes:3; ULONG ReadOnly:1; ULONG Shared:1; @@ -104,6 +104,65 @@ typedef enum _ARM_DOMAIN ManagerDomain } ARM_DOMAIN; +struct _EPROCESS; +PULONG MmGetPageDirectory(VOID); + +#define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1) +#define MI_MAKE_DIRTY_PAGE(x) +#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Access = 1) // FIXFIX +#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.ExtendedAccess = 1) // FIXFIX +#define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.Cached = 0) +#define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.Buffered = 0) +#define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.Buffered = 1) +#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ExtendedAccess == 0) +#define MI_IS_PAGE_COPY_ON_WRITE(x)FALSE +#define MI_IS_PAGE_DIRTY(x) TRUE + +/* Easy accessing PFN in PTE */ +#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) + + +#if 1 + +// +// FIXFIX: This is all wrong now!!! +// + +// +// Take 0x80812345 and extract: +// PTE_BASE[0x808][0x12] +// +#define MiGetPteAddress(x) \ + (PMMPTE)(PTE_BASE + \ + (((ULONG)(x) >> 20) << 12) + \ + ((((ULONG)(x) >> 12) & 0xFF) << 2)) + +#define MiGetPdeAddress(x) \ + (PMMPDE_HARDWARE)(PDE_BASE + \ + (((ULONG)(x) >> 20) << 2)) + +#define MiGetPdeOffset(x) (((ULONG)(x)) >> 22) + +// +// FIXME: THESE ARE WRONG ATM. +// +#define MiAddressToPde(x) \ +((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PDE_BASE)) +#define MiAddressToPte(x) \ +((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE)) +#define MiAddressToPteOffset(x) \ +((((ULONG)(x)) << 10) >> 22) + + +// +// Convert a PTE into a corresponding address +// +#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10)) + +#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) +#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) +#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) + // // FIXFIX: This is all wrong now!!! // @@ -223,69 +282,6 @@ typedef enum _ARM_PTE_ACCESS UserAccess } ARM_PTE_ACCESS; -#if 0 - -// -// FIXFIX: This is all wrong now!!! -// - -// -// Take 0x80812345 and extract: -// PTE_BASE[0x808][0x12] -// -#define MiGetPteAddress(x) \ - (PMMPTE)(PTE_BASE + \ - (((ULONG)(x) >> 20) << 12) + \ - ((((ULONG)(x) >> 12) & 0xFF) << 2)) - -#define MiGetPdeAddress(x) \ - (PMMPDE_HARDWARE)(PDE_BASE + \ - (((ULONG)(x) >> 20) << 2)) - -#define MiGetPdeOffset(x) (((ULONG)(x)) >> 22) - -#define PTE_BASE 0xC0000000 -#define PTE_TOP 0xC03FFFFF -#define PDE_BASE 0xC1000000 -#define HYPER_SPACE 0xC1100000 - -// -// FIXME: THESE ARE WRONG ATM. -// -#define MiAddressToPde(x) \ -((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PDE_BASE)) -#define MiAddressToPte(x) \ -((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE)) -#define MiAddressToPteOffset(x) \ -((((ULONG)(x)) << 10) >> 22) - - -// -// Convert a PTE into a corresponding address -// -#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10)) - -#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) -#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) -#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) - #endif -struct _EPROCESS; -PULONG MmGetPageDirectory(VOID); - -#define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1) -#define MI_MAKE_DIRTY_PAGE(x) -#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Access = 1) // FIXFIX -#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.ExtendedAccess = 1) // FIXFIX -#define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.Cached = 0) -#define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.Buffered = 0) -#define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.Buffered = 1) -#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ExtendedAccess == 0) -#define MI_IS_PAGE_COPY_ON_WRITE(x)FALSE -#define MI_IS_PAGE_DIRTY(x) TRUE - -/* Easy accessing PFN in PTE */ -#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) - #endif diff --git a/reactos/ntoskrnl/ke/arm/boot.s b/reactos/ntoskrnl/ke/arm/boot.s index d2188b62872..48fd667bf9a 100644 --- a/reactos/ntoskrnl/ke/arm/boot.s +++ b/reactos/ntoskrnl/ke/arm/boot.s @@ -17,6 +17,7 @@ // // Put us in FIQ mode // + b . mrs r3, cpsr orr r3, r1, #CPSR_FIQ_MODE msr cpsr, r3 From e2214c16efe1112cb986f3939c8d1bffc768966b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 7 Feb 2010 13:51:25 +0000 Subject: [PATCH 13/97] Implement LsaEnumerateAccountRights. svn path=/trunk/; revision=45484 --- reactos/dll/win32/advapi32/sec/lsa.c | 38 +++++++++++++++++++++++----- reactos/dll/win32/lsasrv/lsarpc.c | 10 ++++++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/lsa.c b/reactos/dll/win32/advapi32/sec/lsa.c index f792f8c7d29..6cc870147fd 100644 --- a/reactos/dll/win32/advapi32/sec/lsa.c +++ b/reactos/dll/win32/advapi32/sec/lsa.c @@ -217,7 +217,7 @@ LsaDeleteTrustedDomain( } /* - * @unimplemented + * @implemented */ NTSTATUS WINAPI @@ -227,10 +227,35 @@ LsaEnumerateAccountRights( PLSA_UNICODE_STRING *UserRights, PULONG CountOfRights) { - FIXME("(%p,%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights, CountOfRights); - *UserRights = 0; - *CountOfRights = 0; - return STATUS_OBJECT_NAME_NOT_FOUND; + LSAPR_USER_RIGHT_SET UserRightsSet; + NTSTATUS Status; + + TRACE("(%p,%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights, CountOfRights); + + UserRightsSet.Entries = 0; + UserRightsSet.UserRights = NULL; + + RpcTryExcept + { + Status = LsarEnmuerateAccountRights((LSAPR_HANDLE)PolicyHandle, + AccountSid, + &UserRightsSet); + + *CountOfRights = UserRightsSet.Entries; + *UserRights = (PUNICODE_STRING)UserRightsSet.UserRights; + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + + if (UserRightsSet.UserRights != NULL) + { + MIDL_user_free(UserRightsSet.UserRights); + } + } + RpcEndExcept; + + return Status; } /* @@ -288,7 +313,8 @@ LsaEnumerateTrustedDomainsEx( /* * @implemented */ -NTSTATUS WINAPI +NTSTATUS +WINAPI LsaFreeMemory(PVOID Buffer) { TRACE("(%p)\n", Buffer); diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index d2a36444393..eb9852f1176 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -560,8 +560,14 @@ NTSTATUS LsarEnmuerateAccountRights( PRPC_SID AccountSid, PLSAPR_USER_RIGHT_SET UserRights) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + FIXME("(%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights); + + if (!LsapValidateDbHandle(PolicyHandle)) + return STATUS_INVALID_HANDLE; + + UserRights->Entries = 0; + UserRights->UserRights = NULL; + return STATUS_OBJECT_NAME_NOT_FOUND; } From f326fb3cb30a34d42b4196b70108b3ee49856477 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 7 Feb 2010 15:35:00 +0000 Subject: [PATCH 14/97] [PORTCLS] - Reset number of mappings and available data when a reset request arrives - Handle case where a get position request appears before an audio buffer arrives which results in divide by zero exception svn path=/trunk/; revision=45487 --- .../wdm/audio/backpln/portcls/irpstream.cpp | 5 +++++ .../wdm/audio/backpln/portcls/pin_wavecyclic.cpp | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp index aaa707bb425..7d82ae7660d 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp @@ -466,6 +466,11 @@ CIrpQueue::CancelBuffers() KsCancelIo(&m_IrpList, &m_IrpListLock); // reset stream start flag m_StartStream = FALSE; + // reset number of mappings + m_NumMappings = 0; + // reset number of data available + m_NumDataAvailable = 0; + // done return TRUE; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index 14be43fd9e3..1162b94646b 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -693,8 +693,11 @@ CPortPinWaveCyclic::UpdateCommonBuffer( if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING) { - // normalize position - m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + if (m_Position.WriteOffset) + { + // normalize position + m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + } } } } @@ -742,8 +745,11 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap( if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING) { - // normalize position - m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + if (m_Position.WriteOffset) + { + // normalize position + m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + } } } From 11c549d5269f2e293e57e86a1517fecf473224a5 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 7 Feb 2010 15:57:25 +0000 Subject: [PATCH 15/97] [DSOUND] - Fix broken assert - Fix calculation of length for the first locked audio buffer svn path=/trunk/; revision=45488 --- reactos/dll/directx/dsound_new/secondary.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/dll/directx/dsound_new/secondary.c b/reactos/dll/directx/dsound_new/secondary.c index a3fe2b17a62..4474c2665ea 100644 --- a/reactos/dll/directx/dsound_new/secondary.c +++ b/reactos/dll/directx/dsound_new/secondary.c @@ -263,8 +263,9 @@ SecondaryDirectSoundBuffer8Impl_fnLock( else { ASSERT(dwOffset < This->BufferSize); - ASSERT(dwBytes < This->BufferSize); - ASSERT(dwBytes + dwOffset <= This->BufferSize); + ASSERT(dwBytes <= This->BufferSize); + + dwBytes = min(This->BufferSize - dwOffset, dwBytes); *ppvAudioPtr1 = This->Buffer + dwOffset; *pdwAudioBytes1 = dwBytes; @@ -316,7 +317,7 @@ SecondaryDirectSoundBuffer8Impl_fnPlay( /* release primary buffer */ PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer); - DPRINT1("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer); + DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer); return DS_OK; } From 3b550eb81b8e7b1df74b25f10251b5b7a6591d27 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 7 Feb 2010 17:01:57 +0000 Subject: [PATCH 16/97] Fix LSAPR_POLICY_INFORMATION and associated types. svn path=/trunk/; revision=45489 --- reactos/dll/win32/lsasrv/lsarpc.c | 4 ++-- reactos/include/reactos/idl/lsa.idl | 30 +++++++++++++---------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index eb9852f1176..b94615ebcd9 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -229,7 +229,7 @@ NTSTATUS LsarOpenPolicy( NTSTATUS LsarQueryInformationPolicy( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, - unsigned long PolicyInformation) + PLSAPR_POLICY_INFORMATION *PolicyInformation) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; @@ -240,7 +240,7 @@ NTSTATUS LsarQueryInformationPolicy( NTSTATUS LsarSetInformationPolicy( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, - unsigned long *PolicyInformation) + PLSAPR_POLICY_INFORMATION PolicyInformation) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; diff --git a/reactos/include/reactos/idl/lsa.idl b/reactos/include/reactos/idl/lsa.idl index b0f038692f1..706554a0717 100644 --- a/reactos/include/reactos/idl/lsa.idl +++ b/reactos/include/reactos/idl/lsa.idl @@ -302,13 +302,11 @@ typedef struct _POLICY_MODIFICATION_INFO { LARGE_INTEGER ModifiedId; LARGE_INTEGER DatabaseCreationTime; } POLICY_MODIFICATION_INFO, *PPOLICY_MODIFICATION_INFO; -cpp_quote("#endif") -typedef struct _POLICY_FULL_SET_INFO { +typedef struct _POLICY_AUDIT_FULL_SET_INFO { BOOL ShutDownOnFull; -} POLICY_FULL_SET_INFO, *PPOLICY_FULL_SET_INFO; +} POLICY_AUDIT_FULL_SET_INFO, *PPOLICY_AUDIT_FULL_SET_INFO; -cpp_quote("#ifndef _NTSECAPI_H") typedef struct _POLICY_AUDIT_FULL_QUERY_INFO { BOOL ShutDownOnFull; BOOL LogIsFull; @@ -323,23 +321,23 @@ typedef struct _LSAPR_POLICY_DNS_DOMAIN_INFO { PRPC_SID Sid; } LSAPR_POLICY_DNS_DOMAIN_INFO, *PLSAPR_POLICY_DNS_DOMAIN_INFO; -/*typedef +typedef [switch_type(POLICY_INFORMATION_CLASS)] union _LSAPR_POLICY_INFORMATION { [case(PolicyAuditLogInformation)] POLICY_AUDIT_LOG_INFO PolicyAuditLogInfo; - [case(PolicyAuditEventsInformation)] POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo; - [case(PolicyPrimaryDomainInformation)] POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo; - [case(PolicyPdAccountInformation)] POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo; - [case(PolicyAccountDomainInformation)] POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo; + [case(PolicyAuditEventsInformation)] LSAPR_POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo; + [case(PolicyPrimaryDomainInformation)] LSAPR_POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo; + [case(PolicyPdAccountInformation)] LSAPR_POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo; + [case(PolicyAccountDomainInformation)] LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo; [case(PolicyLsaServerRoleInformation)] POLICY_LSA_SERVER_ROLE_INFO PolicyServerRoleInfo; - [case(PolicyReplicaSourceInformation)] POLICY_REPLICA_SRCE_INFO PolicyReplicaSourceInfo; + [case(PolicyReplicaSourceInformation)] POLICY_LSA_REPLICA_SRCE_INFO PolicyReplicaSourceInfo; [case(PolicyDefaultQuotaInformation)] POLICY_DEFAULT_QUOTA_INFO PolicyDefaultQuotaInfo; [case(PolicyModificationInformation)] POLICY_MODIFICATION_INFO PolicyModificationInfo; [case(PolicyAuditFullSetInformation)] POLICY_AUDIT_FULL_SET_INFO PolicyAuditFullSetInfo; [case(PolicyAuditFullQueryInformation)] POLICY_AUDIT_FULL_QUERY_INFO PolicyAuditFullQueryInfo; - [case(PolicyDnsDomainInformation)] LSAPR_DNS_DOMAIN_INFO PolicyDnsDomainInfo; - [case(PolicyDnsDomainInformationInt)] LSAPR_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt; + [case(PolicyDnsDomainInformation)] LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfo; + [case(PolicyDnsDomainInformationInt)] LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt; [case(PolicyLocalAccountDomainInformation)] LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyLocalAccountDomainInfo; -} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION;*/ +} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION; typedef struct _LSAPR_TRUSTED_ENUM_BUFFER { DWORD EntriesRead; @@ -639,15 +637,13 @@ interface lsarpc NTSTATUS LsarQueryInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, - [in] unsigned long PolicyInformation); - /* FIXME: should be [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); */ + [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); /* Function 8 */ NTSTATUS LsarSetInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, - [out] unsigned long *PolicyInformation); - /* FIXME: should be [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); */ + [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); /* Function 9 */ NTSTATUS LsarClearAuditLog( From 33a4dde3d168fc086b417578769a193cbb9662d9 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 7 Feb 2010 19:52:10 +0000 Subject: [PATCH 17/97] Fix formatting. svn path=/trunk/; revision=45490 --- reactos/base/setup/usetup/cabinet.c | 1544 ++++++++++++++------------- 1 file changed, 798 insertions(+), 746 deletions(-) diff --git a/reactos/base/setup/usetup/cabinet.c b/reactos/base/setup/usetup/cabinet.c index c44521a541a..508b5c4a81d 100644 --- a/reactos/base/setup/usetup/cabinet.c +++ b/reactos/base/setup/usetup/cabinet.c @@ -20,19 +20,19 @@ #define SEEK_END 2 #endif -typedef struct __DOSTIME +typedef struct _DOSTIME { - WORD Second:5; - WORD Minute:6; - WORD Hour:5; + WORD Second:5; + WORD Minute:6; + WORD Hour:5; } DOSTIME, *PDOSTIME; -typedef struct __DOSDATE +typedef struct _DOSDATE { - WORD Day:5; - WORD Month:4; - WORD Year:5; + WORD Day:5; + WORD Month:4; + WORD Year:5; } DOSDATE, *PDOSDATE; static WCHAR CabinetName[256]; // Filename of current cabinet @@ -57,7 +57,7 @@ static ULONG DataReserved = 0; static ULONG CodecId; static PCABINET_CODEC_UNCOMPRESS CodecUncompress = NULL; static BOOL CodecSelected = FALSE; -static ULONG LastFileOffset = 0; // Uncompressed offset of last extracted file +static ULONG LastFileOffset = 0; // Uncompressed offset of last extracted file static PCABINET_OVERWRITE OverwriteHandler = NULL; static PCABINET_EXTRACT ExtractHandler = NULL; static PCABINET_DISK_CHANGE DiskChangeHandler = NULL; @@ -80,7 +80,6 @@ void* __cdecl malloc(size_t _size) return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nSize); } - void __cdecl free(void* _ptr) { RtlFreeHeap(ProcessHeap, 0, _ptr); @@ -93,11 +92,6 @@ void* __cdecl calloc(size_t _nmemb, size_t _size) /* RAW codec */ -ULONG -RawCodecUncompress(PVOID OutputBuffer, - PVOID InputBuffer, - PLONG InputLength, - PLONG OutputLength) /* * FUNCTION: Uncompresses data in a buffer * ARGUMENTS: @@ -108,21 +102,20 @@ RawCodecUncompress(PVOID OutputBuffer, * OutputLength = Length of output buffer before, amount filled after * Negative to indicate that this is not the end of the block */ +ULONG +RawCodecUncompress(PVOID OutputBuffer, + PVOID InputBuffer, + PLONG InputLength, + PLONG OutputLength) { - LONG In = abs(*InputLength), Out = abs(*OutputLength); - memcpy(OutputBuffer, InputBuffer, In < Out ? In : Out); - *InputLength = *OutputLength = In < Out ? In : Out; - return CS_SUCCESS; + LONG In = abs(*InputLength), Out = abs(*OutputLength); + memcpy(OutputBuffer, InputBuffer, In < Out ? In : Out); + *InputLength = *OutputLength = In < Out ? In : Out; + return CS_SUCCESS; } - /* MSZIP codec */ -ULONG -MSZipCodecUncompress(PVOID OutputBuffer, - PVOID InputBuffer, - PLONG InputLength, - PLONG OutputLength) /* * FUNCTION: Uncompresses data in a buffer * ARGUMENTS: @@ -133,140 +126,146 @@ MSZipCodecUncompress(PVOID OutputBuffer, * OutputLength = Length of output buffer before, amount filled after * Negative to indicate that this is not the end of the block */ +ULONG +MSZipCodecUncompress(PVOID OutputBuffer, + PVOID InputBuffer, + PLONG InputLength, + PLONG OutputLength) { - USHORT Magic; - INT Status; + USHORT Magic; + INT Status; - DPRINT("MSZipCodecUncompress( OutputBuffer = %x, InputBuffer = %x, InputLength = %d, OutputLength = %d.\n", OutputBuffer, InputBuffer, *InputLength, *OutputLength); - if( *InputLength > 0 ) - { - Magic = *((PUSHORT)InputBuffer); + DPRINT("MSZipCodecUncompress(OutputBuffer = %x, InputBuffer = %x, " + "InputLength = %d, OutputLength = %d)\n", OutputBuffer, + InputBuffer, *InputLength, *OutputLength); + if (*InputLength > 0) + { + Magic = *(PUSHORT)InputBuffer; - if (Magic != MSZIP_MAGIC) - { - DPRINT("Bad MSZIP block header magic (0x%X)\n", Magic); - return CS_BADSTREAM; - } + if (Magic != MSZIP_MAGIC) + { + DPRINT("Bad MSZIP block header magic (0x%X)\n", Magic); + return CS_BADSTREAM; + } - ZStream.next_in = ((PUCHAR)InputBuffer )+ 2; - ZStream.avail_in = *InputLength - 2; - ZStream.next_out = (PUCHAR)OutputBuffer; - ZStream.avail_out = abs(*OutputLength); + ZStream.next_in = (PUCHAR)InputBuffer + 2; + ZStream.avail_in = *InputLength - 2; + ZStream.next_out = (PUCHAR)OutputBuffer; + ZStream.avail_out = abs(*OutputLength); - /* WindowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - */ - Status = inflateInit2(&ZStream, -MAX_WBITS); - if (Status != Z_OK) - { - DPRINT("inflateInit2() returned (%d).\n", Status); - return CS_BADSTREAM; - } - ZStream.total_in = 2; - } - else { - ZStream.avail_in = -*InputLength; - ZStream.next_in = (PUCHAR)InputBuffer; - ZStream.next_out = (PUCHAR)OutputBuffer; - ZStream.avail_out = abs(*OutputLength); - ZStream.total_in = 0; - } - ZStream.total_out = 0; - Status = inflate(&ZStream, Z_SYNC_FLUSH ); - if (Status != Z_OK && Status != Z_STREAM_END) - { - DPRINT("inflate() returned (%d) (%s).\n", Status, ZStream.msg); - if (Status == Z_MEM_ERROR) - return CS_NOMEMORY; - return CS_BADSTREAM; - } + /* WindowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + */ + Status = inflateInit2(&ZStream, -MAX_WBITS); + if (Status != Z_OK) + { + DPRINT("inflateInit2() returned (%d)\n", Status); + return CS_BADSTREAM; + } + ZStream.total_in = 2; + } + else + { + ZStream.avail_in = -*InputLength; + ZStream.next_in = (PUCHAR)InputBuffer; + ZStream.next_out = (PUCHAR)OutputBuffer; + ZStream.avail_out = abs(*OutputLength); + ZStream.total_in = 0; + } - if( *OutputLength > 0 ) - { - Status = inflateEnd(&ZStream); - if (Status != Z_OK) - { - DPRINT("inflateEnd() returned (%d).\n", Status); - return CS_BADSTREAM; - } - } - *OutputLength = ZStream.total_out; - *InputLength = ZStream.total_in; - return CS_SUCCESS; + ZStream.total_out = 0; + Status = inflate(&ZStream, Z_SYNC_FLUSH); + if (Status != Z_OK && Status != Z_STREAM_END) + { + DPRINT("inflate() returned (%d) (%s)\n", Status, ZStream.msg); + if (Status == Z_MEM_ERROR) + return CS_NOMEMORY; + return CS_BADSTREAM; + } + + if (*OutputLength > 0) + { + Status = inflateEnd(&ZStream); + if (Status != Z_OK) + { + DPRINT("inflateEnd() returned (%d)\n", Status); + return CS_BADSTREAM; + } + } + + *OutputLength = ZStream.total_out; + *InputLength = ZStream.total_in; + + return CS_SUCCESS; } - - /* Memory functions */ -voidpf MSZipAlloc(voidpf opaque, uInt items, uInt size) +voidpf +MSZipAlloc(voidpf opaque, uInt items, uInt size) { - return (voidpf)RtlAllocateHeap (ProcessHeap, 0, items * size); + return (voidpf)RtlAllocateHeap(ProcessHeap, 0, items * size); } -void MSZipFree (voidpf opaque, voidpf address) +void +MSZipFree(voidpf opaque, voidpf address) { - RtlFreeHeap(ProcessHeap, 0, address); + RtlFreeHeap(ProcessHeap, 0, address); } static BOOL -ConvertSystemTimeToFileTime( - CONST SYSTEMTIME * lpSystemTime, - LPFILETIME lpFileTime) +ConvertSystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, + LPFILETIME lpFileTime) { - TIME_FIELDS TimeFields; - LARGE_INTEGER liTime; + TIME_FIELDS TimeFields; + LARGE_INTEGER liTime; - TimeFields.Year = lpSystemTime->wYear; - TimeFields.Month = lpSystemTime->wMonth; - TimeFields.Day = lpSystemTime->wDay; - TimeFields.Hour = lpSystemTime->wHour; - TimeFields.Minute = lpSystemTime->wMinute; - TimeFields.Second = lpSystemTime->wSecond; - TimeFields.Milliseconds = lpSystemTime->wMilliseconds; + TimeFields.Year = lpSystemTime->wYear; + TimeFields.Month = lpSystemTime->wMonth; + TimeFields.Day = lpSystemTime->wDay; + TimeFields.Hour = lpSystemTime->wHour; + TimeFields.Minute = lpSystemTime->wMinute; + TimeFields.Second = lpSystemTime->wSecond; + TimeFields.Milliseconds = lpSystemTime->wMilliseconds; - if (RtlTimeFieldsToTime(&TimeFields, &liTime)) + if (RtlTimeFieldsToTime(&TimeFields, &liTime)) { - lpFileTime->dwLowDateTime = liTime.u.LowPart; - lpFileTime->dwHighDateTime = liTime.u.HighPart; - return TRUE; + lpFileTime->dwLowDateTime = liTime.u.LowPart; + lpFileTime->dwHighDateTime = liTime.u.HighPart; + return TRUE; } - return FALSE; -} + return FALSE; +} static BOOL -ConvertDosDateTimeToFileTime( - WORD wFatDate, - WORD wFatTime, - LPFILETIME lpFileTime) +ConvertDosDateTimeToFileTime(WORD wFatDate, + WORD wFatTime, + LPFILETIME lpFileTime) { - PDOSTIME pdtime = (PDOSTIME) &wFatTime; - PDOSDATE pddate = (PDOSDATE) &wFatDate; - SYSTEMTIME SystemTime; + PDOSTIME pdtime = (PDOSTIME)&wFatTime; + PDOSDATE pddate = (PDOSDATE)&wFatDate; + SYSTEMTIME SystemTime; - if (lpFileTime == NULL) - return FALSE; + if (lpFileTime == NULL) + return FALSE; - SystemTime.wMilliseconds = 0; - SystemTime.wSecond = pdtime->Second; - SystemTime.wMinute = pdtime->Minute; - SystemTime.wHour = pdtime->Hour; + SystemTime.wMilliseconds = 0; + SystemTime.wSecond = pdtime->Second; + SystemTime.wMinute = pdtime->Minute; + SystemTime.wHour = pdtime->Hour; - SystemTime.wDay = pddate->Day; - SystemTime.wMonth = pddate->Month; - SystemTime.wYear = 1980 + pddate->Year; + SystemTime.wDay = pddate->Day; + SystemTime.wMonth = pddate->Month; + SystemTime.wYear = 1980 + pddate->Year; - ConvertSystemTimeToFileTime(&SystemTime,lpFileTime); + ConvertSystemTimeToFileTime(&SystemTime, lpFileTime); - return TRUE; + return TRUE; } - -static PWCHAR -GetFileName(PWCHAR Path) /* * FUNCTION: Returns a pointer to file name * ARGUMENTS: @@ -274,43 +273,45 @@ GetFileName(PWCHAR Path) * RETURNS: * Pointer to filename */ +static PWCHAR +GetFileName(PWCHAR Path) { - ULONG i, j; + ULONG i, j; - j = i = 0; + j = i = 0; - while (Path [i++]) + while (Path[i++]) { - if (Path[i - 1] == L'\\') j = i; + if (Path[i - 1] == L'\\') + j = i; } - return Path + j; + + return Path + j; } - -static VOID -RemoveFileName(PWCHAR Path) /* * FUNCTION: Removes a file name from a path * ARGUMENTS: * Path = Pointer to string with path */ +static VOID +RemoveFileName(PWCHAR Path) { - PWCHAR FileName; - DWORD i; + PWCHAR FileName; + DWORD i; - i = 0; - FileName = GetFileName(Path + i); + i = 0; + FileName = GetFileName(Path + i); - if ((FileName != (Path + i)) && (FileName [-1] == L'\\')) - FileName--; - if ((FileName == (Path + i)) && (FileName [0] == L'\\')) - FileName++; - FileName[0] = 0; + if (FileName != Path + i && FileName[-1] == L'\\') + FileName--; + + if (FileName == Path + i && FileName[0] == L'\\') + FileName++; + + FileName[0] = 0; } - -static BOOL -SetAttributesOnFile(PCFFILE File, HANDLE hFile) /* * FUNCTION: Sets attributes on a file * ARGUMENTS: @@ -318,113 +319,110 @@ SetAttributesOnFile(PCFFILE File, HANDLE hFile) * RETURNS: * Status of operation */ +static BOOL +SetAttributesOnFile(PCFFILE File, + HANDLE hFile) { - FILE_BASIC_INFORMATION FileBasic; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS NtStatus; - ULONG Attributes = 0; + FILE_BASIC_INFORMATION FileBasic; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS NtStatus; + ULONG Attributes = 0; - if (File->Attributes & CAB_ATTRIB_READONLY) - Attributes |= FILE_ATTRIBUTE_READONLY; + if (File->Attributes & CAB_ATTRIB_READONLY) + Attributes |= FILE_ATTRIBUTE_READONLY; - if (File->Attributes & CAB_ATTRIB_HIDDEN) - Attributes |= FILE_ATTRIBUTE_HIDDEN; + if (File->Attributes & CAB_ATTRIB_HIDDEN) + Attributes |= FILE_ATTRIBUTE_HIDDEN; - if (File->Attributes & CAB_ATTRIB_SYSTEM) - Attributes |= FILE_ATTRIBUTE_SYSTEM; + if (File->Attributes & CAB_ATTRIB_SYSTEM) + Attributes |= FILE_ATTRIBUTE_SYSTEM; - if (File->Attributes & CAB_ATTRIB_DIRECTORY) - Attributes |= FILE_ATTRIBUTE_DIRECTORY; + if (File->Attributes & CAB_ATTRIB_DIRECTORY) + Attributes |= FILE_ATTRIBUTE_DIRECTORY; - if (File->Attributes & CAB_ATTRIB_ARCHIVE) - Attributes |= FILE_ATTRIBUTE_ARCHIVE; + if (File->Attributes & CAB_ATTRIB_ARCHIVE) + Attributes |= FILE_ATTRIBUTE_ARCHIVE; - NtStatus = NtQueryInformationFile(hFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) + NtStatus = NtQueryInformationFile(hFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) { - DPRINT("NtQueryInformationFile() failed (%x).\n", NtStatus); + DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus); } - else + else { - FileBasic.FileAttributes = Attributes; + FileBasic.FileAttributes = Attributes; - NtStatus = NtSetInformationFile(hFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) + NtStatus = NtSetInformationFile(hFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) { - DPRINT("NtSetInformationFile() failed (%x).\n", NtStatus); + DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus); } } - return NT_SUCCESS(NtStatus); + return NT_SUCCESS(NtStatus); } -static ULONG -CloseCabinet(VOID) /* * FUNCTION: Closes the current cabinet * RETURNS: * Status of operation */ +static ULONG +CloseCabinet(VOID) { - if (FileBuffer) + if (FileBuffer) { - NtUnmapViewOfSection( NtCurrentProcess(), FileBuffer ); - NtClose( FileSectionHandle ); - NtClose( FileHandle ); - FileBuffer = NULL; + NtUnmapViewOfSection(NtCurrentProcess(), FileBuffer); + NtClose(FileSectionHandle); + NtClose(FileHandle); + FileBuffer = NULL; } - return 0; + return 0; } - -VOID -CabinetInitialize(VOID) /* * FUNCTION: Initialize archiver */ +VOID +CabinetInitialize(VOID) { - ZStream.zalloc = MSZipAlloc; - ZStream.zfree = MSZipFree; - ZStream.opaque = (voidpf)0; + ZStream.zalloc = MSZipAlloc; + ZStream.zfree = MSZipFree; + ZStream.opaque = (voidpf)0; - FileOpen = FALSE; - wcscpy(DestPath, L""); + FileOpen = FALSE; + wcscpy(DestPath, L""); - CodecId = CAB_CODEC_RAW; - CodecSelected = TRUE; + CodecId = CAB_CODEC_RAW; + CodecSelected = TRUE; - FolderUncompSize = 0; - BytesLeftInBlock = 0; - CabinetReserved = 0; - FolderReserved = 0; - DataReserved = 0; - CabinetReservedArea = NULL; - LastFileOffset = 0; + FolderUncompSize = 0; + BytesLeftInBlock = 0; + CabinetReserved = 0; + FolderReserved = 0; + DataReserved = 0; + CabinetReservedArea = NULL; + LastFileOffset = 0; } - -VOID -CabinetCleanup(VOID) /* * FUNCTION: Cleanup archiver */ +VOID +CabinetCleanup(VOID) { - CabinetClose(); + CabinetClose(); } - -BOOL -CabinetNormalizePath(PWCHAR Path, - ULONG Length) /* * FUNCTION: Normalizes a path * ARGUMENTS: @@ -433,254 +431,256 @@ CabinetNormalizePath(PWCHAR Path, * RETURNS: * TRUE if there was enough room in Path, or FALSE */ +BOOL +CabinetNormalizePath(PWCHAR Path, + ULONG Length) { - ULONG n; - BOOL OK = TRUE; + ULONG n; + BOOL Ok; - if ((n = wcslen(Path)) && - (Path[n - 1] != L'\\') && - (OK = ((n + 1) < Length))) + n = wcslen(Path); + Ok = (n + 1) < Length; + + if (n != 0 && Path[n - 1] != L'\\' && Ok) { - Path[n] = L'\\'; - Path[n + 1] = 0; + Path[n] = L'\\'; + Path[n + 1] = 0; } - return OK; + + return Ok; } - -PWCHAR -CabinetGetCabinetName() /* * FUNCTION: Returns pointer to cabinet file name * RETURNS: * Pointer to string with name of cabinet */ +PWCHAR +CabinetGetCabinetName(VOID) { - return CabinetName; + return CabinetName; } - -VOID -CabinetSetCabinetName(PWCHAR FileName) /* * FUNCTION: Sets cabinet file name * ARGUMENTS: * FileName = Pointer to string with name of cabinet */ +VOID +CabinetSetCabinetName(PWCHAR FileName) { - wcscpy(CabinetName, FileName); + wcscpy(CabinetName, FileName); } - -VOID -CabinetSetDestinationPath(PWCHAR DestinationPath) /* * FUNCTION: Sets destination path * ARGUMENTS: * DestinationPath = Pointer to string with name of destination path */ +VOID +CabinetSetDestinationPath(PWCHAR DestinationPath) { - wcscpy(DestPath, DestinationPath); - if (wcslen(DestPath) > 0) - CabinetNormalizePath(DestPath, MAX_PATH); + wcscpy(DestPath, DestinationPath); + + if (wcslen(DestPath) > 0) + CabinetNormalizePath(DestPath, MAX_PATH); } - -PWCHAR -CabinetGetDestinationPath() /* * FUNCTION: Returns destination path * RETURNS: * Pointer to string with name of destination path */ +PWCHAR +CabinetGetDestinationPath(VOID) { - return DestPath; + return DestPath; } - -ULONG -CabinetOpen(VOID) /* * FUNCTION: Opens a cabinet file * RETURNS: * Status of operation */ +ULONG +CabinetOpen(VOID) { - PUCHAR Buffer; - UNICODE_STRING ustring; - ANSI_STRING astring; + PUCHAR Buffer; + UNICODE_STRING ustring; + ANSI_STRING astring; - if (!FileOpen) + if (!FileOpen) { - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - UNICODE_STRING FileName; - NTSTATUS NtStatus; - ULONG Size; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING FileName; + NTSTATUS NtStatus; + ULONG Size; - RtlInitUnicodeString(&FileName, - CabinetName); + RtlInitUnicodeString(&FileName, CabinetName); - InitializeObjectAttributes(&ObjectAttributes, - &FileName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + InitializeObjectAttributes(&ObjectAttributes, + &FileName, + OBJ_CASE_INSENSITIVE, + NULL, NULL); - NtStatus = NtOpenFile(&FileHandle, - GENERIC_READ | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS(NtStatus)) + NtStatus = NtOpenFile(&FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT); + + if (!NT_SUCCESS(NtStatus)) { - DPRINT("Cannot open file (%S) (%x).\n", CabinetName, NtStatus); - return CAB_STATUS_CANNOT_OPEN; + DPRINT("Cannot open file (%S) (%x)\n", CabinetName, NtStatus); + return CAB_STATUS_CANNOT_OPEN; } - FileOpen = TRUE; - NtStatus = NtCreateSection(&FileSectionHandle, - SECTION_ALL_ACCESS, - 0, - 0, - PAGE_READONLY, - SEC_COMMIT, - FileHandle); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtCreateSection failed: %x\n", NtStatus); - return CAB_STATUS_NOMEMORY; - } - FileBuffer = 0; - FileSize = 0; - NtStatus = NtMapViewOfSection(FileSectionHandle, - NtCurrentProcess(), - (PVOID *)&FileBuffer, - 0, - 0, - 0, - &FileSize, - ViewUnmap, - 0, - PAGE_READONLY); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); - return CAB_STATUS_NOMEMORY; - } - DPRINT( "Cabinet file %S opened and mapped to %x\n", CabinetName, FileBuffer ); - PCABHeader = (PCFHEADER)FileBuffer; + FileOpen = TRUE; - /* Check header */ - if(FileSize <= sizeof(CFHEADER) || - PCABHeader->Signature != CAB_SIGNATURE || - PCABHeader->Version != CAB_VERSION || - PCABHeader->FolderCount == 0 || - PCABHeader->FileCount == 0 || - PCABHeader->FileTableOffset < sizeof(CFHEADER)) - { - CloseCabinet(); - DPRINT("File has invalid header.\n"); - return CAB_STATUS_INVALID_CAB; - } + NtStatus = NtCreateSection(&FileSectionHandle, + SECTION_ALL_ACCESS, + 0, 0, + PAGE_READONLY, + SEC_COMMIT, + FileHandle); - Size = 0; - Buffer = (PUCHAR)(PCABHeader+1); - /* Read/skip any reserved bytes */ - if (PCABHeader->Flags & CAB_FLAG_RESERVE) + if (!NT_SUCCESS(NtStatus)) { - CabinetReserved = *(PUSHORT)Buffer; - Buffer += 2; - FolderReserved = *Buffer; - Buffer++; - DataReserved = *Buffer; - Buffer++; - if (CabinetReserved > 0) + DPRINT("NtCreateSection failed: %x\n", NtStatus); + return CAB_STATUS_NOMEMORY; + } + + FileBuffer = 0; + FileSize = 0; + + NtStatus = NtMapViewOfSection(FileSectionHandle, + NtCurrentProcess(), + (PVOID *)&FileBuffer, + 0, 0, 0, + &FileSize, + ViewUnmap, + 0, + PAGE_READONLY); + + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); + return CAB_STATUS_NOMEMORY; + } + + DPRINT("Cabinet file %S opened and mapped to %x\n", CabinetName, FileBuffer); + PCABHeader = (PCFHEADER) FileBuffer; + + /* Check header */ + if (FileSize <= sizeof(CFHEADER) || + PCABHeader->Signature != CAB_SIGNATURE || + PCABHeader->Version != CAB_VERSION || + PCABHeader->FolderCount == 0 || + PCABHeader->FileCount == 0 || + PCABHeader->FileTableOffset < sizeof(CFHEADER)) + { + CloseCabinet(); + DPRINT("File has invalid header\n"); + return CAB_STATUS_INVALID_CAB; + } + + Size = 0; + Buffer = (PUCHAR)(PCABHeader + 1); + + /* Read/skip any reserved bytes */ + if (PCABHeader->Flags & CAB_FLAG_RESERVE) + { + CabinetReserved = *(PUSHORT)Buffer; + Buffer += 2; + FolderReserved = *Buffer; + Buffer++; + DataReserved = *Buffer; + Buffer++; + + if (CabinetReserved > 0) { - CabinetReservedArea = Buffer; - Buffer += CabinetReserved; + CabinetReservedArea = Buffer; + Buffer += CabinetReserved; } } - if (PCABHeader->Flags & CAB_FLAG_HASPREV) + if (PCABHeader->Flags & CAB_FLAG_HASPREV) { - /* The previous cabinet file is in the same directory as the current */ - wcscpy(CabinetPrev, CabinetName); - RemoveFileName(CabinetPrev); - CabinetNormalizePath(CabinetPrev, 256); - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = wcslen( CabinetPrev ); - ustring.Buffer = CabinetPrev + ustring.Length; - ustring.MaximumLength = sizeof( CabinetPrev ) - ustring.Length; - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* The previous cabinet file is in + the same directory as the current */ + wcscpy(CabinetPrev, CabinetName); + RemoveFileName(CabinetPrev); + CabinetNormalizePath(CabinetPrev, 256); + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = wcslen(CabinetPrev); + ustring.Buffer = CabinetPrev + ustring.Length; + ustring.MaximumLength = sizeof(CabinetPrev) - ustring.Length; + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; - /* Read label of prev disk */ - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = 0; - ustring.Buffer = DiskPrev; - ustring.MaximumLength = sizeof( DiskPrev ); - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* Read label of prev disk */ + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = 0; + ustring.Buffer = DiskPrev; + ustring.MaximumLength = sizeof(DiskPrev); + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; } - else + else { - wcscpy(CabinetPrev, L""); - wcscpy(DiskPrev, L""); + wcscpy(CabinetPrev, L""); + wcscpy(DiskPrev, L""); } - if (PCABHeader->Flags & CAB_FLAG_HASNEXT) + if (PCABHeader->Flags & CAB_FLAG_HASNEXT) { - /* The next cabinet file is in the same directory as the previous */ - wcscpy(CabinetNext, CabinetName); - RemoveFileName(CabinetNext); - CabinetNormalizePath(CabinetNext, 256); - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = wcslen( CabinetNext ); - ustring.Buffer = CabinetNext + ustring.Length; - ustring.MaximumLength = sizeof( CabinetNext ) - ustring.Length; - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* The next cabinet file is in + the same directory as the previous */ + wcscpy(CabinetNext, CabinetName); + RemoveFileName(CabinetNext); + CabinetNormalizePath(CabinetNext, 256); + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = wcslen(CabinetNext); + ustring.Buffer = CabinetNext + ustring.Length; + ustring.MaximumLength = sizeof(CabinetNext) - ustring.Length; + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; - /* Read label of next disk */ - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = 0; - ustring.Buffer = DiskNext; - ustring.MaximumLength = sizeof( DiskNext ); - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* Read label of next disk */ + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = 0; + ustring.Buffer = DiskNext; + ustring.MaximumLength = sizeof(DiskNext); + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; } - else + else { - wcscpy(CabinetNext, L""); - wcscpy(DiskNext, L""); + wcscpy(CabinetNext, L""); + wcscpy(DiskNext, L""); } - CabinetFolders = (PCFFOLDER)Buffer; + CabinetFolders = (PCFFOLDER)Buffer; } - DPRINT( "CabinetOpen returning SUCCESS\n" ); - return CAB_STATUS_SUCCESS; + + DPRINT("CabinetOpen returning SUCCESS\n"); + return CAB_STATUS_SUCCESS; } - -VOID -CabinetClose(VOID) /* * FUNCTION: Closes the cabinet file */ +VOID +CabinetClose(VOID) { - if (FileOpen) + if (FileOpen) { - CloseCabinet(); - - FileOpen = FALSE; + CloseCabinet(); + FileOpen = FALSE; } } - -ULONG -CabinetFindFirst(PWCHAR FileName, - PCAB_SEARCH Search) /* * FUNCTION: Finds the first file in the cabinet that matches a search criteria * ARGUMENTS: @@ -689,17 +689,17 @@ CabinetFindFirst(PWCHAR FileName, * RETURNS: * Status of operation */ +ULONG +CabinetFindFirst(PWCHAR FileName, + PCAB_SEARCH Search) { - DPRINT( "CabinetFindFirst( FileName = %S )\n", FileName ); - wcsncpy(Search->Search, FileName, MAX_PATH); - wcsncpy(Search->Cabinet, CabinetName, MAX_PATH); - Search->File = 0; - return CabinetFindNext(Search); + DPRINT("CabinetFindFirst( FileName = %S )\n", FileName); + wcsncpy(Search->Search, FileName, MAX_PATH); + wcsncpy(Search->Cabinet, CabinetName, MAX_PATH); + Search->File = 0; + return CabinetFindNext(Search); } - -ULONG -CabinetFindNext(PCAB_SEARCH Search) /* * FUNCTION: Finds next file in the cabinet that matches a search criteria * ARGUMENTS: @@ -707,99 +707,116 @@ CabinetFindNext(PCAB_SEARCH Search) * RETURNS: * Status of operation */ +ULONG +CabinetFindNext(PCAB_SEARCH Search) { - ULONG Status; - PCFFILE Prev; - ANSI_STRING AnsiString; - UNICODE_STRING UnicodeString; - WCHAR FileName[MAX_PATH] = {L'\0'}; + ULONG Status; + PCFFILE Prev; + ANSI_STRING AnsiString; + UNICODE_STRING UnicodeString; + WCHAR FileName[MAX_PATH]; - if( wcscmp( Search->Cabinet, CabinetName ) != 0 ) - Search->File = 0; // restart search of cabinet has changed since last find - if( !Search->File ) - { - // starting new search or cabinet - Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); - Search->Index = 0; - Prev = 0; - } - else Prev = Search->File; - while(1) - { - // look at each file in the archive and see if we found a match - if( Search->File->FolderIndex == 0xFFFD || Search->File->FolderIndex == 0xFFFF ) - { - // skip files continued from previous cab - DPRINT("Skipping file (%s) FileOffset (0x%X) LastFileOffset (0x%X).\n", - (char *)(Search->File + 1), Search->File->FileOffset, LastFileOffset); - } - else { - // FIXME: check for match against search criteria - if( Search->File != Prev ) - { - // don't match the file we started with - if( wcscmp( Search->Search, L"*" ) == 0 ) - { - // take any file - break; - } - else { - // otherwise, try to match the exact file name - RtlInitAnsiString( &AnsiString, Search->File->FileName ); - UnicodeString.Buffer = FileName; - UnicodeString.Length = 0; - UnicodeString.MaximumLength = sizeof( FileName ); - RtlAnsiStringToUnicodeString( &UnicodeString, &AnsiString, FALSE ); - if( wcscmp( Search->Search, UnicodeString.Buffer ) == 0 ) - break; - } - } - } - // if we make it here we found no match, so move to the next file - Search->Index++; - if( Search->Index >= PCABHeader->FileCount ) - { - // we have reached the end of this cabinet, try to open the next - DPRINT( "End of cabinet reached\n" ); - if (wcslen(DiskNext) > 0) - { - CloseCabinet(); + if (wcscmp(Search->Cabinet, CabinetName) != 0) + { + /* restart search of cabinet has changed since last find */ + Search->File = 0; + } - CabinetSetCabinetName(CabinetNext); - wcscpy( Search->Cabinet, CabinetName ); + if (!Search->File) + { + /* starting new search or cabinet */ + Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); + Search->Index = 0; + Prev = 0; + } + else + Prev = Search->File; - if (DiskChangeHandler != NULL) - { - DiskChangeHandler(CabinetNext, DiskNext); - } + while (TRUE) + { + /* look at each file in the archive and see if we found a match */ + if (Search->File->FolderIndex == 0xFFFD || + Search->File->FolderIndex == 0xFFFF) + { + /* skip files continued from previous cab */ + DPRINT("Skipping file (%s): FileOffset (0x%X), " + "LastFileOffset (0x%X)\n", (char *)(Search->File + 1), + Search->File->FileOffset, LastFileOffset); + } + else + { + // FIXME: check for match against search criteria + if (Search->File != Prev) + { + /* don't match the file we started with */ + if (wcscmp(Search->Search, L"*") == 0) + { + /* take any file */ + break; + } + else + { + /* otherwise, try to match the exact file name */ + RtlInitAnsiString(&AnsiString, Search->File->FileName); + UnicodeString.Buffer = FileName; + UnicodeString.Buffer[0] = 0; + UnicodeString.Length = 0; + UnicodeString.MaximumLength = sizeof(FileName); + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE); + if (wcscmp(Search->Search, UnicodeString.Buffer) == 0) + break; + } + } + } - Status = CabinetOpen(); - if (Status != CAB_STATUS_SUCCESS) - return Status; + /* if we make it here we found no match, so move to the next file */ + Search->Index++; + if (Search->Index >= PCABHeader->FileCount) + { + /* we have reached the end of this cabinet, try to open the next */ + DPRINT("End of cabinet reached\n"); + if (wcslen(DiskNext) > 0) + { + CloseCabinet(); - } - else - { - return CAB_STATUS_NOFILE; - } - // starting new search or cabinet - Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); - Search->Index = 0; - Prev = 0; - } - else Search->File = (PCFFILE)(strchr( (char *)(Search->File + 1), 0 ) + 1); - } - DPRINT( "Found file %s\n", Search->File->FileName ); - return CAB_STATUS_SUCCESS; + CabinetSetCabinetName(CabinetNext); + wcscpy(Search->Cabinet, CabinetName); + + if (DiskChangeHandler != NULL) + { + DiskChangeHandler(CabinetNext, DiskNext); + } + + Status = CabinetOpen(); + if (Status != CAB_STATUS_SUCCESS) + return Status; + } + else + { + return CAB_STATUS_NOFILE; + } + + /* starting new search or cabinet */ + Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); + Search->Index = 0; + Prev = 0; + } + else + Search->File = (PCFFILE)(strchr((char *)(Search->File + 1), 0) + 1); + } + + DPRINT("Found file %s\n", Search->File->FileName); + return CAB_STATUS_SUCCESS; } - -int Validate() +#if 0 +int +Validate() { - return (int)RtlValidateHeap(ProcessHeap, 0, 0); + return (int)RtlValidateHeap(ProcessHeap, 0, 0); } +#endif -ULONG CabinetExtractFile( PCAB_SEARCH Search ) /* * FUNCTION: Extracts a file from the cabinet * ARGUMENTS: @@ -807,309 +824,339 @@ ULONG CabinetExtractFile( PCAB_SEARCH Search ) * RETURNS * Status of operation */ +ULONG +CabinetExtractFile(PCAB_SEARCH Search) { - ULONG Size; // remaining file bytes to decompress - ULONG CurrentOffset; // current uncompressed offset within the folder - PUCHAR CurrentBuffer; // current pointer to compressed data in the block - LONG RemainingBlock; // remaining comp data in the block - HANDLE DestFile; - HANDLE DestFileSection; - PVOID DestFileBuffer; // mapped view of dest file - PVOID CurrentDestBuffer; // pointer to the current position in the dest view - PCFDATA CFData; // current data block - ULONG Status; - FILETIME FileTime; - WCHAR DestName[MAX_PATH]; - NTSTATUS NtStatus; - UNICODE_STRING UnicodeString; - ANSI_STRING AnsiString; - IO_STATUS_BLOCK IoStatusBlock; - OBJECT_ATTRIBUTES ObjectAttributes; - FILE_BASIC_INFORMATION FileBasic; - PCFFOLDER CurrentFolder; - LARGE_INTEGER MaxDestFileSize; - LONG InputLength, OutputLength; - char Junk[512]; + ULONG Size; // remaining file bytes to decompress + ULONG CurrentOffset; // current uncompressed offset within the folder + PUCHAR CurrentBuffer; // current pointer to compressed data in the block + LONG RemainingBlock; // remaining comp data in the block + HANDLE DestFile; + HANDLE DestFileSection; + PVOID DestFileBuffer; // mapped view of dest file + PVOID CurrentDestBuffer; // pointer to the current position in the dest view + PCFDATA CFData; // current data block + ULONG Status; + FILETIME FileTime; + WCHAR DestName[MAX_PATH]; + NTSTATUS NtStatus; + UNICODE_STRING UnicodeString; + ANSI_STRING AnsiString; + IO_STATUS_BLOCK IoStatusBlock; + OBJECT_ATTRIBUTES ObjectAttributes; + FILE_BASIC_INFORMATION FileBasic; + PCFFOLDER CurrentFolder; + LARGE_INTEGER MaxDestFileSize; + LONG InputLength, OutputLength; + char Junk[512]; - if( wcscmp( Search->Cabinet, CabinetName ) != 0 ) - { - // the file is not in the current cabinet - DPRINT( "File is not in this cabinet ( %S != %S )\n", Search->Cabinet, CabinetName ); - return CAB_STATUS_NOFILE; - } - // look up the folder that the file specifies - if( Search->File->FolderIndex == 0xFFFD || Search->File->FolderIndex == 0xFFFF ) - { - // folder is continued from previous cabinet, that shouldn't happen here - return CAB_STATUS_NOFILE; - } - else if( Search->File->FolderIndex == 0xFFFE ) - { - // folder is the last in this cabinet and continues into next - CurrentFolder = &CabinetFolders[PCABHeader->FolderCount-1]; - } - else { - // folder is completely contained within this cabinet - CurrentFolder = &CabinetFolders[Search->File->FolderIndex]; - } - switch (CurrentFolder->CompressionType & CAB_COMP_MASK) + if (wcscmp(Search->Cabinet, CabinetName) != 0) { - case CAB_COMP_NONE: - CabinetSelectCodec(CAB_CODEC_RAW); - break; - case CAB_COMP_MSZIP: - CabinetSelectCodec(CAB_CODEC_MSZIP); - break; - default: - return CAB_STATUS_UNSUPPCOMP; + /* the file is not in the current cabinet */ + DPRINT("File is not in this cabinet (%S != %S)\n", + Search->Cabinet, CabinetName); + return CAB_STATUS_NOFILE; } - DPRINT("Extracting file at uncompressed offset (0x%X) Size (%d bytes)).\n", - (UINT)Search->File->FileOffset, - (UINT)Search->File->FileSize); - RtlInitAnsiString( &AnsiString, Search->File->FileName ); - wcscpy( DestName, DestPath ); - UnicodeString.MaximumLength = sizeof( DestName ) - wcslen( DestName ); - UnicodeString.Buffer = DestName + wcslen( DestName ); - UnicodeString.Length = 0; - RtlAnsiStringToUnicodeString( &UnicodeString, &AnsiString, FALSE ); - - /* Create destination file, fail if it already exists */ - RtlInitUnicodeString(&UnicodeString, - DestName); - - - InitializeObjectAttributes(&ObjectAttributes, - &UnicodeString, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - NtStatus = NtCreateFile(&DestFile, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - FILE_ATTRIBUTE_NORMAL, - 0, - FILE_CREATE, - FILE_SYNCHRONOUS_IO_NONALERT, - NULL, - 0); - if (!NT_SUCCESS(NtStatus)) + /* look up the folder that the file specifies */ + if (Search->File->FolderIndex == 0xFFFD || + Search->File->FolderIndex == 0xFFFF) { - DPRINT("NtCreateFile() failed (%S) (%x).\n", DestName, NtStatus); + /* folder is continued from previous cabinet, + that shouldn't happen here */ + return CAB_STATUS_NOFILE; + } + else if (Search->File->FolderIndex == 0xFFFE) + { + /* folder is the last in this cabinet and continues into next */ + CurrentFolder = &CabinetFolders[PCABHeader->FolderCount - 1]; + } + else + { + /* folder is completely contained within this cabinet */ + CurrentFolder = &CabinetFolders[Search->File->FolderIndex]; + } - /* If file exists, ask to overwrite file */ - if (OverwriteHandler == NULL || OverwriteHandler(Search->File, DestName)) + switch (CurrentFolder->CompressionType & CAB_COMP_MASK) + { + case CAB_COMP_NONE: + CabinetSelectCodec(CAB_CODEC_RAW); + break; + case CAB_COMP_MSZIP: + CabinetSelectCodec(CAB_CODEC_MSZIP); + break; + default: + return CAB_STATUS_UNSUPPCOMP; + } + + DPRINT("Extracting file at uncompressed offset (0x%X) Size (%d bytes)\n", + (UINT)Search->File->FileOffset, (UINT)Search->File->FileSize); + + RtlInitAnsiString(&AnsiString, Search->File->FileName); + wcscpy(DestName, DestPath); + UnicodeString.MaximumLength = sizeof(DestName) - wcslen(DestName); + UnicodeString.Buffer = DestName + wcslen(DestName); + UnicodeString.Length = 0; + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE); + + /* Create destination file, fail if it already exists */ + RtlInitUnicodeString(&UnicodeString, DestName); + + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + OBJ_CASE_INSENSITIVE, + NULL, NULL); + + NtStatus = NtCreateFile(&DestFile, + GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_CREATE, + FILE_SYNCHRONOUS_IO_NONALERT, + NULL, 0); + + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtCreateFile() failed (%S) (%x)\n", DestName, NtStatus); + + /* If file exists, ask to overwrite file */ + if (OverwriteHandler == NULL || OverwriteHandler(Search->File, DestName)) { - /* Create destination file, overwrite if it already exists */ - NtStatus = NtCreateFile(&DestFile, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - FILE_ATTRIBUTE_NORMAL, - 0, - FILE_OVERWRITE, - FILE_SYNCHRONOUS_IO_ALERT, - NULL, - 0); - if (!NT_SUCCESS(NtStatus)) + /* Create destination file, overwrite if it already exists */ + NtStatus = NtCreateFile(&DestFile, + GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_OVERWRITE, + FILE_SYNCHRONOUS_IO_ALERT, + NULL, 0); + + if (!NT_SUCCESS(NtStatus)) { - DPRINT("NtCreateFile() failed 2 (%S) (%x).\n", DestName, NtStatus); - return CAB_STATUS_CANNOT_CREATE; + DPRINT("NtCreateFile() failed (%S) (%x)\n", DestName, NtStatus); + return CAB_STATUS_CANNOT_CREATE; } } - else + else { - DPRINT("File (%S) exists.\n", DestName); - return CAB_STATUS_FILE_EXISTS; - } - } - MaxDestFileSize.QuadPart = Search->File->FileSize; - NtStatus = NtCreateSection(&DestFileSection, - SECTION_ALL_ACCESS, - 0, - &MaxDestFileSize, - PAGE_READWRITE, - SEC_COMMIT, - DestFile); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtCreateSection failed: %x\n", NtStatus); - Status = CAB_STATUS_NOMEMORY; - goto CloseDestFile; - } - DestFileBuffer = 0; - DestFileSize = 0; - NtStatus = NtMapViewOfSection(DestFileSection, - NtCurrentProcess(), - &DestFileBuffer, - 0, - 0, - 0, - &DestFileSize, - ViewUnmap, - 0, - PAGE_READWRITE); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); - Status = CAB_STATUS_NOMEMORY; - goto CloseDestFileSection; - } - CurrentDestBuffer = DestFileBuffer; - if (!ConvertDosDateTimeToFileTime(Search->File->FileDate, Search->File->FileTime, &FileTime)) - { - DPRINT("DosDateTimeToFileTime() failed.\n"); - Status = CAB_STATUS_CANNOT_WRITE; - goto UnmapDestFile; - } - - NtStatus = NtQueryInformationFile(DestFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) - { - DPRINT("NtQueryInformationFile() failed (%x).\n", NtStatus); - } - else - { - memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME)); - - NtStatus = NtSetInformationFile(DestFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) - { - DPRINT("NtSetInformationFile() failed (%x).\n", NtStatus); + DPRINT("File (%S) exists\n", DestName); + return CAB_STATUS_FILE_EXISTS; } } - SetAttributesOnFile(Search->File, DestFile); + MaxDestFileSize.QuadPart = Search->File->FileSize; + NtStatus = NtCreateSection(&DestFileSection, + SECTION_ALL_ACCESS, + 0, + &MaxDestFileSize, + PAGE_READWRITE, + SEC_COMMIT, + DestFile); - /* Call extract event handler */ - if (ExtractHandler != NULL) + if (!NT_SUCCESS(NtStatus)) { - ExtractHandler(Search->File, DestName); + DPRINT("NtCreateSection failed: %x\n", NtStatus); + Status = CAB_STATUS_NOMEMORY; + goto CloseDestFile; } - // find the starting block of the file - // start with the first data block of the folder - CFData = (PCFDATA)(CabinetFolders[Search->File->FolderIndex].DataOffset + FileBuffer); - CurrentOffset = 0; - while( CurrentOffset + CFData->UncompSize <= Search->File->FileOffset ) - { - // walk the data blocks until we reach the one containing the start of the file - CurrentOffset += CFData->UncompSize; - CFData = (PCFDATA)((char *)(CFData+1) + DataReserved + CFData->CompSize); - } - // now decompress and discard any data in the block before the start of the file - CurrentBuffer = ((unsigned char *)(CFData+1)) + DataReserved; // start of comp data - RemainingBlock = CFData->CompSize; - InputLength = RemainingBlock; - while( CurrentOffset < Search->File->FileOffset ) - { - // compute remaining uncomp bytes to start of file, bounded by sizeof junk - OutputLength = Search->File->FileOffset - CurrentOffset; - if( OutputLength > (LONG)sizeof( Junk ) ) - OutputLength = sizeof( Junk ); - OutputLength = -OutputLength; // negate to signal NOT end of block - CodecUncompress( Junk, - CurrentBuffer, - &InputLength, - &OutputLength ); - CurrentOffset += OutputLength; // add the uncomp bytes extracted to current folder offset - CurrentBuffer += InputLength; // add comp bytes consumed to CurrentBuffer - RemainingBlock -= InputLength; // subtract bytes consumed from bytes remaining in block - InputLength = -RemainingBlock; // neg for resume decompression of the same block - } - // now CurrentBuffer points to the first comp byte of the file, so we can begin decompressing - Size = Search->File->FileSize; // Size = remaining uncomp bytes of the file to decompress - while(Size > 0) + DestFileBuffer = 0; + DestFileSize = 0; + NtStatus = NtMapViewOfSection(DestFileSection, + NtCurrentProcess(), + &DestFileBuffer, + 0, 0, 0, + &DestFileSize, + ViewUnmap, + 0, + PAGE_READWRITE); + + if (!NT_SUCCESS(NtStatus)) { - OutputLength = Size; - DPRINT( "Decompressing block at %x with RemainingBlock = %d, Size = %d\n", CurrentBuffer, RemainingBlock, Size ); - Status = CodecUncompress(CurrentDestBuffer, - CurrentBuffer, - &InputLength, - &OutputLength); - if (Status != CS_SUCCESS) - { - DPRINT("Cannot uncompress block.\n"); - if(Status == CS_NOMEMORY) - Status = CAB_STATUS_NOMEMORY; - Status = CAB_STATUS_INVALID_CAB; - goto UnmapDestFile; - } - CurrentDestBuffer = (PVOID)((ULONG_PTR)CurrentDestBuffer + OutputLength); // advance dest buffer by bytes produced - CurrentBuffer += InputLength; // advance src buffer by bytes consumed - Size -= OutputLength; // reduce remaining file bytes by bytes produced - RemainingBlock -= InputLength; // reduce remaining block size by bytes consumed - if( RemainingBlock == 0 ) - { - // used up this block, move on to the next - DPRINT( "Out of block data\n" ); - CFData = (PCFDATA)CurrentBuffer; - RemainingBlock = CFData->CompSize; - CurrentBuffer = ((unsigned char *)(CFData+1) + DataReserved); - InputLength = RemainingBlock; - } - } - Status = CAB_STATUS_SUCCESS; - UnmapDestFile: - NtUnmapViewOfSection(NtCurrentProcess(), DestFileBuffer); - CloseDestFileSection: - NtClose(DestFileSection); - CloseDestFile: - NtClose(DestFile); + DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); + Status = CAB_STATUS_NOMEMORY; + goto CloseDestFileSection; + } - return Status; + CurrentDestBuffer = DestFileBuffer; + if (!ConvertDosDateTimeToFileTime(Search->File->FileDate, + Search->File->FileTime, + &FileTime)) + { + DPRINT("DosDateTimeToFileTime() failed\n"); + Status = CAB_STATUS_CANNOT_WRITE; + goto UnmapDestFile; + } + + NtStatus = NtQueryInformationFile(DestFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus); + } + else + { + memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME)); + + NtStatus = NtSetInformationFile(DestFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus); + } + } + + SetAttributesOnFile(Search->File, DestFile); + + /* Call extract event handler */ + if (ExtractHandler != NULL) + { + ExtractHandler(Search->File, DestName); + } + + /* find the starting block of the file + start with the first data block of the folder */ + CFData = (PCFDATA)(CabinetFolders[Search->File->FolderIndex].DataOffset + FileBuffer); + CurrentOffset = 0; + while (CurrentOffset + CFData->UncompSize <= Search->File->FileOffset) + { + /* walk the data blocks until we reach + the one containing the start of the file */ + CurrentOffset += CFData->UncompSize; + CFData = (PCFDATA)((char *)(CFData + 1) + DataReserved + CFData->CompSize); + } + + /* now decompress and discard any data in + the block before the start of the file */ + + /* start of comp data */ + CurrentBuffer = ((unsigned char *)(CFData + 1)) + DataReserved; + RemainingBlock = CFData->CompSize; + InputLength = RemainingBlock; + + while (CurrentOffset < Search->File->FileOffset) + { + /* compute remaining uncomp bytes to start + of file, bounded by sizeof junk */ + OutputLength = Search->File->FileOffset - CurrentOffset; + if (OutputLength > (LONG)sizeof(Junk)) + OutputLength = sizeof (Junk); + + /* negate to signal NOT end of block */ + OutputLength = -OutputLength; + CodecUncompress(Junk, CurrentBuffer, &InputLength, &OutputLength); + /* add the uncomp bytes extracted to current folder offset */ + CurrentOffset += OutputLength; + /* add comp bytes consumed to CurrentBuffer */ + CurrentBuffer += InputLength; + /* subtract bytes consumed from bytes remaining in block */ + RemainingBlock -= InputLength; + /* neg for resume decompression of the same block */ + InputLength = -RemainingBlock; + } + + /* now CurrentBuffer points to the first comp byte + of the file, so we can begin decompressing */ + + /* Size = remaining uncomp bytes of the file to decompress */ + Size = Search->File->FileSize; + while (Size > 0) + { + OutputLength = Size; + DPRINT("Decompressing block at %x with RemainingBlock = %d, Size = %d\n", + CurrentBuffer, RemainingBlock, Size); + + Status = CodecUncompress(CurrentDestBuffer, + CurrentBuffer, + &InputLength, + &OutputLength); + + if (Status != CS_SUCCESS) + { + DPRINT("Cannot uncompress block\n"); + if (Status == CS_NOMEMORY) + Status = CAB_STATUS_NOMEMORY; + Status = CAB_STATUS_INVALID_CAB; + goto UnmapDestFile; + } + + /* advance dest buffer by bytes produced */ + CurrentDestBuffer = (PVOID)((ULONG_PTR)CurrentDestBuffer + OutputLength); + /* advance src buffer by bytes consumed */ + CurrentBuffer += InputLength; + /* reduce remaining file bytes by bytes produced */ + Size -= OutputLength; + /* reduce remaining block size by bytes consumed */ + RemainingBlock -= InputLength; + if (RemainingBlock == 0) + { + /* used up this block, move on to the next */ + DPRINT("Out of block data\n"); + CFData = (PCFDATA)CurrentBuffer; + RemainingBlock = CFData->CompSize; + CurrentBuffer = (unsigned char *)(CFData + 1) + DataReserved; + InputLength = RemainingBlock; + } + } + + Status = CAB_STATUS_SUCCESS; + +UnmapDestFile: + NtUnmapViewOfSection(NtCurrentProcess(), DestFileBuffer); + +CloseDestFileSection: + NtClose(DestFileSection); + +CloseDestFile: + NtClose(DestFile); + + return Status; } - -VOID -CabinetSelectCodec(ULONG Id) /* * FUNCTION: Selects codec engine to use * ARGUMENTS: * Id = Codec identifier */ +VOID +CabinetSelectCodec(ULONG Id) { - if (CodecSelected) + if (CodecSelected) { - if (Id == CodecId) - return; + if (Id == CodecId) + return; - CodecSelected = FALSE; + CodecSelected = FALSE; } - switch (Id) + switch (Id) { - case CAB_CODEC_RAW: - CodecUncompress = RawCodecUncompress; - break; - case CAB_CODEC_MSZIP: - CodecUncompress = MSZipCodecUncompress; - break; - default: - return; + case CAB_CODEC_RAW: + CodecUncompress = RawCodecUncompress; + break; + case CAB_CODEC_MSZIP: + CodecUncompress = MSZipCodecUncompress; + break; + default: + return; } - CodecId = Id; - CodecSelected = TRUE; + CodecId = Id; + CodecSelected = TRUE; } - -VOID -CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, - PCABINET_EXTRACT Extract, - PCABINET_DISK_CHANGE DiskChange) /* * FUNCTION: Set event handlers * ARGUMENTS: @@ -1117,33 +1164,38 @@ CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, * Extract = Handler called when a file is to be extracted * DiskChange = Handler called when changing the disk */ +VOID +CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, + PCABINET_EXTRACT Extract, + PCABINET_DISK_CHANGE DiskChange) { - OverwriteHandler = Overwrite; - ExtractHandler = Extract; - DiskChangeHandler = DiskChange; + OverwriteHandler = Overwrite; + ExtractHandler = Extract; + DiskChangeHandler = DiskChange; } - -PVOID -CabinetGetCabinetReservedArea(PULONG Size) /* * FUNCTION: Get pointer to cabinet reserved area. NULL if none */ +PVOID +CabinetGetCabinetReservedArea(PULONG Size) { - if (CabinetReservedArea != NULL) + if (CabinetReservedArea != NULL) { - if (Size != NULL) + if (Size != NULL) { - *Size = CabinetReserved; + *Size = CabinetReserved; } - return CabinetReservedArea; + + return CabinetReservedArea; } - else + else { - if (Size != NULL) + if (Size != NULL) { - *Size = 0; + *Size = 0; } - return NULL; + + return NULL; } } From 6fe7914710a4568f605cb20d0f11a1a2beed4366 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 7 Feb 2010 19:56:06 +0000 Subject: [PATCH 18/97] Fix bug #5156. svn path=/trunk/; revision=45491 --- reactos/base/setup/usetup/interface/usetup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 0e0d2166a92..87df41628f9 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -1786,8 +1786,8 @@ CreatePartitionPage (PINPUT_RECORD Ir) else { /* Round-up by cylinder size */ - PartSize = ROUND_UP (PartSize * 1024 * 1024, - DiskEntry->CylinderSize); + PartSize = (PartSize * 1024 * 1024 + DiskEntry->CylinderSize - 1) / + DiskEntry->CylinderSize * DiskEntry->CylinderSize; /* But never get larger than the unpartitioned disk space */ if (PartSize > PartEntry->UnpartitionedLength) From 8dd5d145e527555d6ff0ab6474bab24747c2d138 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 7 Feb 2010 19:56:49 +0000 Subject: [PATCH 19/97] Simplify a bit, remove unused macros. svn path=/trunk/; revision=45492 --- reactos/base/setup/usetup/cabinet.c | 32 +++++++++++++---------------- reactos/base/setup/usetup/usetup.h | 6 ------ 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/reactos/base/setup/usetup/cabinet.c b/reactos/base/setup/usetup/cabinet.c index 508b5c4a81d..0f7b0ef7a64 100644 --- a/reactos/base/setup/usetup/cabinet.c +++ b/reactos/base/setup/usetup/cabinet.c @@ -66,28 +66,22 @@ static PVOID CabinetReservedArea = NULL; /* Needed by zlib, but we don't want the dependency on msvcrt.dll */ - -/* round to 16 bytes + alloc at minimum 16 bytes */ -#define ROUND_SIZE(size) (max(16, ROUND_UP(size, 16))) - -void* __cdecl malloc(size_t _size) +void *__cdecl +malloc(size_t size) { - size_t nSize = ROUND_SIZE(_size); - - if (nSize<_size) - return NULL; - - return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nSize); + return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, size); } -void __cdecl free(void* _ptr) +void __cdecl +free(void *ptr) { - RtlFreeHeap(ProcessHeap, 0, _ptr); + RtlFreeHeap(ProcessHeap, 0, ptr); } -void* __cdecl calloc(size_t _nmemb, size_t _size) +void *__cdecl +calloc(size_t nmemb, size_t size) { - return (void*)RtlAllocateHeap (ProcessHeap, HEAP_ZERO_MEMORY, _size); + return (void *)RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nmemb * size); } /* RAW codec */ @@ -108,9 +102,11 @@ RawCodecUncompress(PVOID OutputBuffer, PLONG InputLength, PLONG OutputLength) { - LONG In = abs(*InputLength), Out = abs(*OutputLength); - memcpy(OutputBuffer, InputBuffer, In < Out ? In : Out); - *InputLength = *OutputLength = In < Out ? In : Out; + LONG Len = min(abs(*InputLength), abs(*OutputLength)); + + memcpy(OutputBuffer, InputBuffer, Len); + *InputLength = *OutputLength = Len; + return CS_SUCCESS; } diff --git a/reactos/base/setup/usetup/usetup.h b/reactos/base/setup/usetup/usetup.h index 516c7eed6fa..2c2aa65d54a 100644 --- a/reactos/base/setup/usetup/usetup.h +++ b/reactos/base/setup/usetup/usetup.h @@ -122,12 +122,6 @@ typedef enum _PAGE_NUMBER #define POPUP_WAIT_ANY_KEY 1 #define POPUP_WAIT_ENTER 2 -#define ROUND_DOWN(n, align) \ - (((ULONG)n) & ~((align) - 1l)) - -#define ROUND_UP(n, align) \ - ROUND_DOWN(((ULONG)n) + (align) - 1, (align)) - #define LIST_FOR_EACH(elem, list, type, field) \ for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \ &(elem)->field != (list) || (elem == NULL); \ From 6c51c54b0984d593f7ce49d1d15f2c58e7fdd9a9 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Mon, 8 Feb 2010 10:49:03 +0000 Subject: [PATCH 20/97] Sync wordpad, write and xcopy to Wine 1.1.38 svn path=/trunk/; revision=45495 --- .../base/applications/cmdutils/xcopy/It.rc | 84 ++++ .../base/applications/cmdutils/xcopy/Uk.rc | 85 ++++ .../base/applications/cmdutils/xcopy/rsrc.rc | 2 + reactos/base/applications/wordpad/Da.rc | 4 +- reactos/base/applications/wordpad/En.rc | 4 +- reactos/base/applications/wordpad/Fr.rc | 4 +- reactos/base/applications/wordpad/Hu.rc | 4 +- reactos/base/applications/wordpad/It.rc | 241 ++++++++++ reactos/base/applications/wordpad/Ja.rc | 4 +- reactos/base/applications/wordpad/Ko.rc | 4 +- reactos/base/applications/wordpad/Lt.rc | 4 +- reactos/base/applications/wordpad/Nl.rc | 4 +- reactos/base/applications/wordpad/No.rc | 4 +- reactos/base/applications/wordpad/Pl.rc | 4 +- reactos/base/applications/wordpad/Pt.rc | 4 +- reactos/base/applications/wordpad/Ru.rc | 4 +- reactos/base/applications/wordpad/Si.rc | 4 +- reactos/base/applications/wordpad/Sv.rc | 4 +- reactos/base/applications/wordpad/Tr.rc | 4 +- reactos/base/applications/wordpad/Uk.rc | 253 ++++++++++ reactos/base/applications/wordpad/Zh.rc | 6 +- reactos/base/applications/wordpad/print.c | 437 +++++++++++++----- reactos/base/applications/wordpad/rsrc.rc | 4 +- reactos/base/applications/wordpad/wordpad.c | 66 +-- reactos/base/applications/wordpad/wordpad.h | 15 +- reactos/base/applications/write/It.rc | 32 ++ reactos/base/applications/write/Uk.rc | 34 ++ reactos/base/applications/write/rsrc.rc | 2 + 28 files changed, 1163 insertions(+), 158 deletions(-) create mode 100644 reactos/base/applications/cmdutils/xcopy/It.rc create mode 100644 reactos/base/applications/cmdutils/xcopy/Uk.rc create mode 100644 reactos/base/applications/wordpad/It.rc create mode 100644 reactos/base/applications/wordpad/Uk.rc create mode 100644 reactos/base/applications/write/It.rc create mode 100644 reactos/base/applications/write/Uk.rc diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc new file mode 100644 index 00000000000..806bcea53b5 --- /dev/null +++ b/reactos/base/applications/cmdutils/xcopy/It.rc @@ -0,0 +1,84 @@ +/* + * XCOPY - Wine-compatible xcopy program + * Italian language support + * + * Copyright (C) 2010 Luca Bennati + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "xcopy.h" + +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_INVPARMS, "Numero non valido di parametri - Digita xcopy /? per l'aiuto\n" + STRING_INVPARM, "Parametro '%s' non valido - Digita xcopy /? per l'aiuto\n" + STRING_PAUSE, "Premi Invio per iniziare a copiare\n" + STRING_SIMCOPY, "%d file(s) sarebbero copiati\n" + STRING_COPY, "%d file(s) copiati\n" + STRING_QISDIR, "'%s' è il nome di un file o una cartella\n" \ + "sull'obiettivo?\n" \ + "(F - File, C - Cartella)\n" + STRING_SRCPROMPT,"%s? (Sì|No)\n" + STRING_OVERWRITE,"Sovrascrivere %s? (Sì|No|Tutti)\n" + STRING_COPYFAIL, "La copia di '%s' in '%s' è fallita con r/c %d\n" + STRING_OPENFAIL, "Impossibile aprire '%s'\n" + STRING_READFAIL, "Errore durante la lettura di '%s'\n" + STRING_YES_CHAR, "S" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "T" + STRING_FILE_CHAR,"F" + STRING_DIR_CHAR, "C" + + STRING_HELP, +"XCOPY - Copia file(s) e alberi di cartelle sorgenti in una destinazione\n\ +\n\ +Sintassi:\n\ +XCOPY sorgente [destinazione] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Dove:\n\ +\n\ +[/I] Assumi una cartella se la destinazione non esiste e sono copiati 2 o\n\ +\tpiù files\n\ +[/S] Copia le cartelle e le sottocartelle\n\ +[/E] Copia le cartelle e le sottocartelle, includendo quelle vuote\n\ +[/Q] Non mostrare i nomi durante la copia, modalità silenziosa.\n\ +[/F] Mostra i nomi completi della sorgente e della destinazione durante la copia\n\ +[/L] Simula l'operazione, mostrando i nome che sarebbero copiati\n\ +[/W] Prompts before beginning the copy operation\n\ +[/T] Crea la struttura di cartelle vuote ma non copia i files\n\ +[/Y] Disabilita le conferme quando sono sovrascritti files\n\ +[/-Y] Abilita le conferme quando sono sovrascritti files\n\ +[/P] Chiede conferma per ogni file sorgente prima di copiare\n\ +[/N] Copia usando gli short names\n\ +[/U] Copia solo files che sono già presenti nella destinazione\n\ +[/R] Sovrascrivi ogni file che abbia l'attributo Sola Lettura\n\ +[/H] Includi files nascosti e di sistema nella copia\n\ +[/C] Continua anche se accade un errore durante la copia\n\ +[/A] Copia solo files che abbiano l'attributo Archivio\n\ +[/M] Copia solo files che abbiano l'attributo Archivio, rimuovendo\n\ +\tl'attributo\n\ +[/D | /D:m-g-a] Copia i nuovi files o quelli modificati dopo la data fornita.\n\ +\t\tSe nessuna data è stata fornita, copia solo se la destinazione è più vecchia\n\ +\t\tdella sorgente\n\n" + +} +#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Uk.rc b/reactos/base/applications/cmdutils/xcopy/Uk.rc new file mode 100644 index 00000000000..a618346374c --- /dev/null +++ b/reactos/base/applications/cmdutils/xcopy/Uk.rc @@ -0,0 +1,85 @@ +/* + * XCOPY - Wine-compatible xcopy program + * Ukrainian language support + * + * Copyright (C) 2007 J. Edmeades + * Copyright (C) 2010 I. Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "xcopy.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + STRING_INVPARMS, "Ðевірна кількіÑть параметрів - Введіть xcopy /? Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸\n" + STRING_INVPARM, "Ðевірний параметр '%s' - Введіть xcopy /? Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸\n" + STRING_PAUSE, "ÐатиÑніть щоб почати копіюваннÑ\n" + STRING_SIMCOPY, "%d файл(ів) буде Ñкопійовано\n" + STRING_COPY, "%d файл(ів) Ñкопійовано\n" + STRING_QISDIR, "'%s' Ñ” файлом чи директорією\n" \ + "on the target?\n" \ + "(F - Файл, D - ДиректоріÑ)\n" + STRING_SRCPROMPT,"%s? (Yes|No)\n" + STRING_OVERWRITE,"ПерепиÑати %s? (Yes|No|All)\n" + STRING_COPYFAIL, "Під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ '%s' в '%s' ÑталаÑÑŒ помилка r/c %d\n" + STRING_OPENFAIL, "Ðе вдалоÑÑŒ відкрити '%s'\n" + STRING_READFAIL, "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ '%s'\n" + STRING_YES_CHAR, "Y" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "A" + STRING_FILE_CHAR,"F" + STRING_DIR_CHAR, "D" + + STRING_HELP, +"XCOPY - Копіює файли та дерева директорій за призначеннÑм\n\ +\n\ +Syntax:\n\ +XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Where:\n\ +\n\ +[/I] Assume directory if destination does not exist and copying 2 or\n\ +\tmore files\n\ +[/S] Копіює директорії та піддиректорії\n\ +[/E] Копіює директорії та піддиректорії, включно з порожніми\n\ +[/Q] Do not list names during copy, ie quiet.\n\ +[/F] Під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ” повні імена початкових Ñ– кінцевих файлів\n\ +[/L] Simulate operation, showing names which would be copied\n\ +[/W] Питає Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ початком копіюваннÑ\n\ +[/T] Створює Ñтруктуру каталогів але не копіює файли\n\ +[/Y] Suppress prompting when overwriting files\n\ +[/-Y] Питає Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð° Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²\n\ +[/P] Prompts on each source file before copying\n\ +[/N] Копіює, викориÑтовуючи короткі імена\n\ +[/U] Copy only files which already exist in destination\n\ +[/R] ПерезапиÑує файли, доÑтупні лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\n\ +[/H] Include hidden and system files in the copy\n\ +[/C] Продовжує роботу, навіть Ñкщо при копіюванні виникла помилка\n\ +[/A] Копіює лише файли з влаÑтивіÑтю ÐРХІВÐИЙ\n\ +[/M] Копіює лише файли з влаÑтивіÑтю ÐРХІВÐИЙ, видалÑÑ”\n\ +\влаÑтивіÑть ÐРХІВÐИЙ\n\ +[/D | /D:m-d-y] Копіює лише нові файли або ті, Ñкі були змінені піÑÐ»Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ñ— дати.\n\ +\t\tЯкщо дата не вказана, only copy if destination is older\n\ +\t\tthan source\n\n" + +} +#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/rsrc.rc b/reactos/base/applications/cmdutils/xcopy/rsrc.rc index 13cd86fcd57..6d7817cf4cd 100644 --- a/reactos/base/applications/cmdutils/xcopy/rsrc.rc +++ b/reactos/base/applications/cmdutils/xcopy/rsrc.rc @@ -30,6 +30,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "De.rc" #include "En.rc" #include "Fr.rc" +#include "It.rc" #include "Ja.rc" #include "Ko.rc" #include "Lt.rc" @@ -39,3 +40,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Pt.rc" #include "Ru.rc" #include "Si.rc" +#include "Uk.rc" diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc index 34789469e5e..8d035955bd2 100644 --- a/reactos/base/applications/wordpad/Da.rc +++ b/reactos/base/applications/wordpad/Da.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Marker alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Søg efter...\tCrtl+F", ID_FIND + MENUITEM "&Søg efter...\tCtrl+F", ID_FIND MENUITEM "Søg efter &næste\tF3", ID_FIND_NEXT MENUITEM "E&rstat...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -218,6 +218,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Forrige side" STRING_PREVIEW_TWOPAGES, "To sider" STRING_PREVIEW_ONEPAGE, "Én side" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Luk" END diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index b6ade3aaf3d..7af40bda4b8 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/base/applications/wordpad/En.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM "&Clear\tDEL", ID_EDIT_CLEAR MENUITEM "&Select all\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCrtl+F", ID_FIND + MENUITEM "&Find...\tCtrl+F", ID_FIND MENUITEM "Find &next\tF3", ID_FIND_NEXT MENUITEM "&Replace...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -210,6 +210,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Previous page" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Close" STRING_UNITS_CM, "cm" END diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 3b518288639..b38daad137e 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/base/applications/wordpad/Fr.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "&Effacer\tDel", ID_EDIT_CLEAR MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Rechercher...\tCrtl+F", ID_FIND + MENUITEM "&Rechercher...\tCtrl+F", ID_FIND MENUITEM "Rechercher le &suivant\tF3", ID_FIND_NEXT MENUITEM "&Remplacer...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -221,6 +221,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Page précédente" STRING_PREVIEW_TWOPAGES, "Deux pages" STRING_PREVIEW_ONEPAGE, "Une page" + STRING_PREVIEW_ZOOMIN, "Zoom avant" + STRING_PREVIEW_ZOOMOUT, "Zoom arrière" STRING_PREVIEW_CLOSE, "Fermer" END diff --git a/reactos/base/applications/wordpad/Hu.rc b/reactos/base/applications/wordpad/Hu.rc index 74926e1e597..1eeede3c8aa 100644 --- a/reactos/base/applications/wordpad/Hu.rc +++ b/reactos/base/applications/wordpad/Hu.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM "Tör&lés\tDel", ID_EDIT_CLEAR MENUITEM "M&indet kijelöli\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCrtl+F", ID_FIND + MENUITEM "&Find...\tCtrl+F", ID_FIND MENUITEM "Find &next\tF3", ID_FIND_NEXT MENUITEM "&Replace...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -218,6 +218,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Previous page" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Close" END diff --git a/reactos/base/applications/wordpad/It.rc b/reactos/base/applications/wordpad/It.rc new file mode 100644 index 00000000000..fd7a09b8576 --- /dev/null +++ b/reactos/base/applications/wordpad/It.rc @@ -0,0 +1,241 @@ +/* Italian resource for Wine WordPad + * + * Copyright 2010 by Luca Bennati + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wordpad.h" + +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Nuovo...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Apri...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Salva\tCtrl+S", ID_FILE_SAVE + MENUITEM "Salva &come...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "&Stampa...\tCtrl+P", ID_PRINT + MENUITEM "An&teprima di stampa...", ID_PREVIEW + MENUITEM "&Impostazioni di stampa...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "E&sci", ID_FILE_EXIT + END + POPUP "&Modifica" + BEGIN + MENUITEM "&Annulla\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "&Rifai\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "&Taglia\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Copia\tCtrl+C", ID_EDIT_COPY + MENUITEM "&Incolla\tCtrl+V", ID_EDIT_PASTE + MENUITEM "Ca&ncella\tDEL", ID_EDIT_CLEAR + MENUITEM "&Seleziona tutto\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "T&rova...\tCtrl+F", ID_FIND + MENUITEM "Trova s&uccessivo\tF3", ID_FIND_NEXT + MENUITEM "S&ostituisci...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "Sola &Lettura", ID_EDIT_READONLY + MENUITEM "&Modificato", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "E&xtra" + BEGIN + MENUITEM "&Informazioni sulla selezione", ID_EDIT_SELECTIONINFO + MENUITEM "&Formato del carattere", ID_EDIT_CHARFORMAT + MENUITEM "Formato del &def. char", ID_EDIT_DEFCHARFORMAT + MENUITEM "Formato del ¶grafo", ID_EDIT_PARAFORMAT + MENUITEM "&Ricava il testo", ID_EDIT_GETTEXT + END + END + POPUP "&Visualizza" + BEGIN + MENUITEM "Barra degli &strumenti", ID_TOGGLE_TOOLBAR + MENUITEM "Barra del &formato", ID_TOGGLE_FORMATBAR + MENUITEM "&Righello", ID_TOGGLE_RULER + MENUITEM "Barra dello s&tato", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Opzioni...", ID_VIEWPROPERTIES + END + POPUP "&Inserisci" + BEGIN + MENUITEM "&Data e ora...", ID_DATETIME + END + POPUP "F&ormato" + BEGIN + MENUITEM "&Font...", ID_FONTSETTINGS + MENUITEM "&Elenco" ID_BULLET + MENUITEM "&Paragrafo..." ID_PARAFORMAT + MENUITEM "&Tabulazioni..." ID_TABSTOPS + POPUP "Sfon&do" + BEGIN + MENUITEM "Di &sistema\tCtrl+1", ID_BACK_1 + MENUITEM "&Giallo di PostThat\tCtrl+2", ID_BACK_2 + END + END + POPUP "&Aiuto" + BEGIN + MENUITEM "&Su Wine Wordpad" ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Taglia", ID_EDIT_CUT + MENUITEM "&Copia", ID_EDIT_COPY + MENUITEM "&Incolla", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "&Elenco" ID_BULLET + MENUITEM "&Paragrafo..." ID_PARAFORMAT + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Data e ora" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Formati disponibili",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&OK",IDOK,87,12,40,12 + PUSHBUTTON "&Annulla",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Nuovo" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Nuovo tipo di documento",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&OK",IDOK,97,12,40,12 + PUSHBUTTON "&Annulla",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Formato del paragrafo" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Indentazione", -1, 10, 10, 120, 68 + LTEXT "Sinistra", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "Destra", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "Prima riga", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "Allineamento", -1, 15, 87, 45, 13 + COMBOBOX IDC_PARA_ALIGN, 60, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Tabulazioni" +FONT 8, "MS SHell DLg" +BEGIN + GROUPBOX "Punti di fermata delle tabulazioni", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Aggiungi", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Rimuovi", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "Rimuovi &tutti", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 310, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Linea di margine", -1, 10, 10, 150, 85 + RADIOBUTTON "&Nessuna linea di margine", IDC_PAGEFMT_WN, 18, 25, 140, 15 + RADIOBUTTON "Confina il testo nel &bordo della finestra", IDC_PAGEFMT_WW, 18, 45, 140, 15 + RADIOBUTTON "Confina il testo nel &margine", IDC_PAGEFMT_WM, 18, 65, 140, 15 + GROUPBOX "Barre", -1, 170, 10, 120, 85 + CHECKBOX "Barra degli &strumenti", IDC_PAGEFMT_TB, 180, 20, 80, 15 + CHECKBOX "Barra del &formato", IDC_PAGEFMT_FB, 180, 38, 80, 15 + CHECKBOX "&Righello", IDC_PAGEFMT_RU, 180, 56, 80, 15 + CHECKBOX "Barra dello s&tato", IDC_PAGEFMT_SB, 180, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALL_FILES, "Tutti i files (*.*)" + STRING_TEXT_FILES_TXT, "Files di testo (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Files di testo Unicode (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Documento Rich text" + STRING_NEWFILE_TXT, "Documento di testo" + STRING_NEWFILE_TXT_UNICODE, "Documento di testo Unicode" + STRING_PRINTER_FILES_PRN, "File di stampa (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "Sinistra" + STRING_ALIGN_RIGHT, "Destra" + STRING_ALIGN_CENTER, "Centro" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "Opzioni" + STRING_VIEWPROPS_TEXT, "Testo" + STRING_VIEWPROPS_RICHTEXT, "Rich text" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "Stampa" + STRING_PREVIEW_NEXTPAGE, "Prossima pagina" + STRING_PREVIEW_PREVPAGE, "Pagina precedente" + STRING_PREVIEW_TWOPAGES, "Due pagine" + STRING_PREVIEW_ONEPAGE, "Una pagina" + STRING_PREVIEW_ZOOMIN, "Ingrandisci" + STRING_PREVIEW_ZOOMOUT, "Rimpicciolisci" + STRING_PREVIEW_CLOSE, "Chiudi" + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Documento" + STRING_PROMPT_SAVE_CHANGES, "Salva i cambiamenti su '%s'?" + STRING_SEARCH_FINISHED, "Finita la ricerca sul documento." + STRING_LOAD_RICHED_FAILED, "Impossibile caricare la libreria RichEdit." + STRING_SAVE_LOSEFORMATTING, "Hai scelto di salvare nel formato Testo semplice, " \ + "che causerà la perdita di tutta la formattazione. " \ + "Sei sicuro?" + STRING_INVALID_NUMBER, "Numero di formato non valido" + STRING_OLE_STORAGE_NOT_SUPPORTED, "I documenti di storage OLE non sono supportati" + STRING_WRITE_FAILED, "Impossibile salvare il file." + STRING_WRITE_ACCESS_DENIED, "Non hai i diritti di accesso per salvare il file." + STRING_OPEN_FAILED, "Impossibile aprire il file." + STRING_OPEN_ACCESS_DENIED, "Non hai i diritti di accesso per aprire il file." + STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata" + STRING_MAX_TAB_STOPS, "Non si possono aggiungere più di 32 punti di fermata delle tabulazioni." +END +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc index 6e08b569c60..89b4b0041e2 100644 --- a/reactos/base/applications/wordpad/Ja.rc +++ b/reactos/base/applications/wordpad/Ja.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "クリア(&C)\tDEL", ID_EDIT_CLEAR MENUITEM "ã™ã¹ã¦é¸æŠž(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "検索(&F)...\tCrtl+F", ID_FIND + MENUITEM "検索(&F)...\tCtrl+F", ID_FIND MENUITEM "次を検索(&N)\tF3", ID_FIND_NEXT MENUITEM "ç½®æ›(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -221,6 +221,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "å‰ã®ãƒšãƒ¼ã‚¸" STRING_PREVIEW_TWOPAGES, "2ページ" STRING_PREVIEW_ONEPAGE, "1ページ" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "é–‰ã˜ã‚‹" END diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc index 2e460afdae9..20928221c02 100644 --- a/reactos/base/applications/wordpad/Ko.rc +++ b/reactos/base/applications/wordpad/Ko.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "Áö¿ì±â(&C)\tDEL", ID_EDIT_CLEAR MENUITEM "¸ðµÎ ¼±ÅÃ(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "ã±â(&F)...\tCrtl+F", ID_FIND + MENUITEM "ã±â(&F)...\tCtrl+F", ID_FIND MENUITEM "´ÙÀ½ ã±â(&N)\tF3", ID_FIND_NEXT MENUITEM " ¹Ù²Ù±â(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -212,6 +212,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "ÀÌÀü ÆäÀÌÁö" STRING_PREVIEW_TWOPAGES, "µÎ ÆäÀÌÁö" STRING_PREVIEW_ONEPAGE, "ÇÑ ÆäÀÌÁö" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "´Ý±â" STRING_UNITS_CM, "cm" END diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc index e1781ebf90d..a1c73126b74 100644 --- a/reactos/base/applications/wordpad/Lt.rc +++ b/reactos/base/applications/wordpad/Lt.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "&Å alinti\tDEL", ID_EDIT_CLEAR MENUITEM "&PažymÄ—ti viskÄ…\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "I&eÅ¡koti...\tCrtl+F", ID_FIND + MENUITEM "I&eÅ¡koti...\tCtrl+F", ID_FIND MENUITEM "IeÅ¡k&oti kito\tF3", ID_FIND_NEXT MENUITEM "Pa&keisti...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -221,6 +221,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Ankstesnis puslapis" STRING_PREVIEW_TWOPAGES, "Du puslapiai" STRING_PREVIEW_ONEPAGE, "Vienas puslapis" + STRING_PREVIEW_ZOOMIN, "Didinti" + STRING_PREVIEW_ZOOMOUT, "Mažinti" STRING_PREVIEW_CLOSE, "Užverti" END diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc index 10729e41df5..581855eec98 100644 --- a/reactos/base/applications/wordpad/Nl.rc +++ b/reactos/base/applications/wordpad/Nl.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "&Verwijderen\tDel", ID_EDIT_CLEAR MENUITEM "&Alles selecteren\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Zoeken...\tCrtl+F", ID_FIND + MENUITEM "&Zoeken...\tCtrl+F", ID_FIND MENUITEM "Zoek vo&lgende\tF3", ID_FIND_NEXT MENUITEM "Ve&rvang...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -211,6 +211,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Vorige pagina" STRING_PREVIEW_TWOPAGES, "Twee pagina's" STRING_PREVIEW_ONEPAGE, "Een pagina" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Sluiten" END diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc index 4409c30e9c6..c8086582afe 100644 --- a/reactos/base/applications/wordpad/No.rc +++ b/reactos/base/applications/wordpad/No.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Merk alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Søk etter...\tCrtl+F", ID_FIND + MENUITEM "&Søk etter...\tCtrl+F", ID_FIND MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT MENUITEM "E&rstatt...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -220,6 +220,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Forrige side" STRING_PREVIEW_TWOPAGES, "To sider" STRING_PREVIEW_ONEPAGE, "Én side" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Lukk" END diff --git a/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc index ab72104e5d0..97d7288bc4c 100644 --- a/reactos/base/applications/wordpad/Pl.rc +++ b/reactos/base/applications/wordpad/Pl.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "&Usuñ\tDel", ID_EDIT_CLEAR MENUITEM "&Zaznacz wszystko\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "Znaj&dŸ...\tCrtl+F", ID_FIND + MENUITEM "Znaj&dŸ...\tCtrl+F", ID_FIND MENUITEM "Z&najdŸ nastêpny\tF3", ID_FIND_NEXT MENUITEM "Za&mieñ...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -219,6 +219,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Poprz. strona" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Zamknij" END diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc index b93237202e8..8b0114af22c 100644 --- a/reactos/base/applications/wordpad/Pt.rc +++ b/reactos/base/applications/wordpad/Pt.rc @@ -50,7 +50,7 @@ BEGIN MENUITEM "&Limpar\tDEL", ID_EDIT_CLEAR MENUITEM "&Seleccionar tudo\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "Local&izar...\tCrtl+F", ID_FIND + MENUITEM "Local&izar...\tCtrl+F", ID_FIND MENUITEM "&Encontrar Seguinte\tF3", ID_FIND_NEXT MENUITEM "&Substituir...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -222,6 +222,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Página anterior" STRING_PREVIEW_TWOPAGES, "Duas páginas" STRING_PREVIEW_ONEPAGE, "Uma página" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Fechar" END diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc index 3aeaf66a9d0..70d9b96e743 100644 --- a/reactos/base/applications/wordpad/Ru.rc +++ b/reactos/base/applications/wordpad/Ru.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "&Удалить\tDEL", ID_EDIT_CLEAR MENUITEM "Выделить в&Ñе\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Ðайти...\tCrtl+F", ID_FIND + MENUITEM "&Ðайти...\tCtrl+F", ID_FIND MENUITEM "Ðа&йти далее\tF3", ID_FIND_NEXT MENUITEM "&Заменить...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -221,6 +221,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница" STRING_PREVIEW_TWOPAGES, "Две Ñтраницы" STRING_PREVIEW_ONEPAGE, "Одна Ñтраница" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Закрыть" END diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index 4fa9cfe08c2..dc0c8d08c0d 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/base/applications/wordpad/Si.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "Po&briÅ¡i\tDEL", ID_EDIT_CLEAR MENUITEM "Izberi &vse\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "Na&jdi ...\tCrtl+F", ID_FIND + MENUITEM "Na&jdi ...\tCtrl+F", ID_FIND MENUITEM "Najdi n&aslednje\tF3", ID_FIND_NEXT MENUITEM "Za&menjaj ...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -220,6 +220,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "PrejÅ¡nja" STRING_PREVIEW_TWOPAGES, "Dve strani" STRING_PREVIEW_ONEPAGE, "Ena stran" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Zapri" END diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc index f8ac17f77c6..c954dc1a7a7 100644 --- a/reactos/base/applications/wordpad/Sv.rc +++ b/reactos/base/applications/wordpad/Sv.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "Ta &bort\tDEL", ID_EDIT_CLEAR MENUITEM "&Markera allt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Sök...\tCrtl+F", ID_FIND + MENUITEM "&Sök...\tCtrl+F", ID_FIND MENUITEM "Sök &nästa\tF3", ID_FIND_NEXT MENUITEM "&Ersätt...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -220,6 +220,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "FöregÃ¥ende sida" STRING_PREVIEW_TWOPAGES, "TvÃ¥ sidor" STRING_PREVIEW_ONEPAGE, "En sida" + STRING_PREVIEW_ZOOMIN, "Zooma in" + STRING_PREVIEW_ZOOMOUT, "Zooma ut" STRING_PREVIEW_CLOSE, "Stäng" END diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 92290371d37..e8d9f982ffb 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "&Sil\tDel", ID_EDIT_CLEAR MENUITEM "&Tümünü seç\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCrtl+F", ID_FIND + MENUITEM "&Find...\tCtrl+F", ID_FIND MENUITEM "Find &next\tF3", ID_FIND_NEXT MENUITEM "&Replace...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -220,6 +220,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Previous page" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Close" END diff --git a/reactos/base/applications/wordpad/Uk.rc b/reactos/base/applications/wordpad/Uk.rc new file mode 100644 index 00000000000..08ad375af2e --- /dev/null +++ b/reactos/base/applications/wordpad/Uk.rc @@ -0,0 +1,253 @@ +/* + * Copyright 2004 by Krzysztof Foltman + * + * Ukrainian language support + * + * Copyright (C) 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wordpad.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Ðовий...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Відкрити...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Зберегти\tCtrl+S", ID_FILE_SAVE + MENUITEM "Зберегти &Ñк...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "&Друк...\tCtrl+P", ID_PRINT + MENUITEM "Попередній перег&лÑд...", ID_PREVIEW + MENUITEM "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Ñторінки...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "Ð’&ихід", ID_FILE_EXIT + END + POPUP "&Правка" + BEGIN + MENUITEM "&Відмінити\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "Повт&орити\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "Виріза&ти\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Копіювати\tCtrl+C", ID_EDIT_COPY + MENUITEM "Ð’&Ñтавити\tCtrl+V", ID_EDIT_PASTE + MENUITEM "О&чиÑтити\tDEL", ID_EDIT_CLEAR + MENUITEM "Виб&рати вÑе\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "&Знайти...\tCtrl+F", ID_FIND + MENUITEM "Знайти д&алі\tF3", ID_FIND_NEXT + MENUITEM "За&мінтити...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "Лише д&Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ", ID_EDIT_READONLY + MENUITEM "Зм&інений", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "Д&одатково" + BEGIN + MENUITEM "&Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ виділеннÑ", ID_EDIT_SELECTIONINFO + MENUITEM "&Формат Ñимволів", ID_EDIT_CHARFORMAT + MENUITEM "Формат Ñимволів &по замовчуванні", ID_EDIT_DEFCHARFORMAT + MENUITEM "Paragrap&h format", ID_EDIT_PARAFORMAT + MENUITEM "&ВзÑти текÑÑ‚", ID_EDIT_GETTEXT + END + END + POPUP "&ВиглÑд" + BEGIN + MENUITEM "Панель інÑ&трументів", ID_TOGGLE_TOOLBAR + MENUITEM "Панель &форматуваннÑ", ID_TOGGLE_FORMATBAR + MENUITEM "&Лінійка", ID_TOGGLE_RULER + MENUITEM "&РÑдок Ñтану", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Параметри...", ID_VIEWPROPERTIES + END + POPUP "&Ð’Ñтавка" + BEGIN + MENUITEM "&Дата та чаÑ...", ID_DATETIME + END + POPUP "Ф&ормат" + BEGIN + MENUITEM "&Шрифт...", ID_FONTSETTINGS + MENUITEM "&Bullet points" ID_BULLET + MENUITEM "&Ðбзац..." ID_PARAFORMAT + MENUITEM "&ТабулÑціÑ..." ID_TABSTOPS + POPUP "&Фон" + BEGIN + MENUITEM "&СитÑемний\tCtrl+1", ID_BACK_1 + MENUITEM "&Жовтуватий PostThat\tCtrl+2", ID_BACK_2 + END + END + POPUP "&Довідка" + BEGIN + MENUITEM "&Про Wine Wordpad" ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Вир&ізати", ID_EDIT_CUT + MENUITEM "&Копіювати", ID_EDIT_COPY + MENUITEM "&Ð’Ñтавити", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "&Bullet points" ID_BULLET + MENUITEM "&Ðбзац..." ID_PARAFORMAT + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Дата та чаÑ" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ДоÑтупні формати",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&OK",IDOK,87,12,40,12 + PUSHBUTTON "&СкаÑувати",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Ðовий" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Тип нового документу",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&OK",IDOK,97,12,40,12 + PUSHBUTTON "&СкаÑувати",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Ðбзац" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "ВідÑтуп", -1, 10, 10, 120, 68 + LTEXT "Зліва", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "Справа", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "Перший Ñ€Ñдок", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "ВирівнюваннÑ", -1, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&СкаÑувати", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "ТабулÑціÑ" +FONT 8, "MS SHell DLg" +BEGIN + GROUPBOX "Tab stops", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Додати", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Видалити", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&СкаÑувати", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "Видалити в&Ñе", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Line wrapping", -1, 10, 10, 130, 85 + RADIOBUTTON "&No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "Wrap text by the &window border", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "Wrap text by the &margin", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Toolbars", -1, 150, 10, 120, 85 + CHECKBOX "&Toolbar", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "&Formatbar", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "&Лінійка", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "&РÑдоу Ñтану", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALL_FILES, "Ð’ÑÑ– документи (*.*)" + STRING_TEXT_FILES_TXT, "ТекÑтові документи (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "ТекÑтовий документ Unicode (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Rich text документ" + STRING_NEWFILE_TXT, "ТекÑтовий документ" + STRING_NEWFILE_TXT_UNICODE, "ТекÑтовий документ Unicode" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "По Лівому Краю" + STRING_ALIGN_RIGHT, "По Правому Краю" + STRING_ALIGN_CENTER, "По Центру" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "ÐалаштуваннÑ" + STRING_VIEWPROPS_TEXT, "ТекÑÑ‚" + STRING_VIEWPROPS_RICHTEXT, "Rich text" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "Друк" + STRING_PREVIEW_NEXTPAGE, "ÐаÑтупна Ñторінка" + STRING_PREVIEW_PREVPAGE, "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка" + STRING_PREVIEW_TWOPAGES, "Дві Ñторінки" + STRING_PREVIEW_ONEPAGE, "Одна Ñторінка" + STRING_PREVIEW_ZOOMIN, "Збільшити" + STRING_PREVIEW_ZOOMOUT, "Зменшити" + STRING_PREVIEW_CLOSE, "Закрити" + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Документ" + STRING_PROMPT_SAVE_CHANGES, "Зберегти зміни в '%s'?" + STRING_SEARCH_FINISHED, "Покуш документу завершено." + STRING_LOAD_RICHED_FAILED, "Ðе вдалоÑÑŒ завантажити бібліотеку RichEdit." + STRING_SAVE_LOSEFORMATTING, "Ви вибрали Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð² форматі проÑтого текÑту, " \ + "що призведе до втрати форматуваннÑ. " \ + "Ви Ñправді цього хочете?" + STRING_INVALID_NUMBER, "Ðевірний чиÑловий формат" + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage документи не підтримуютьÑÑ" + STRING_WRITE_FAILED, "Ðеможливо зберегти файл." + STRING_WRITE_ACCESS_DENIED, "ÐедоÑтатньо прав Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ." + STRING_OPEN_FAILED, "Ðе вдалоÑÑŒ відкрити файл." + STRING_OPEN_ACCESS_DENIED, "ÐедоÑтатньо прав Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ñƒ." + STRING_PRINTING_NOT_IMPLEMENTED, "Друк не впроваджено" + STRING_MAX_TAB_STOPS, "Ðеможливо додати більше 32 позицій табулÑції." +END + +LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "По Лівому Краю" + STRING_ALIGN_RIGHT, "По правому Краю" + STRING_ALIGN_CENTER, "По Центру" +END +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc index 69531055234..7fd7e120f3e 100644 --- a/reactos/base/applications/wordpad/Zh.rc +++ b/reactos/base/applications/wordpad/Zh.rc @@ -51,7 +51,7 @@ BEGIN MENUITEM "删除(&D)\tDEL", ID_EDIT_CLEAR MENUITEM "全选(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "查找(&F)...\tCrtl+F", ID_FIND + MENUITEM "查找(&F)...\tCtrl+F", ID_FIND MENUITEM "找下一个(&N)\tF3", ID_FIND_NEXT MENUITEM "替æ¢(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -223,6 +223,8 @@ BEGIN STRING_PREVIEW_PREVPAGE, "上一页" STRING_PREVIEW_TWOPAGES, "åŒé¡µ" STRING_PREVIEW_ONEPAGE, "å•页" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "关闭" END @@ -276,7 +278,7 @@ BEGIN MENUITEM "刪除(&D)\tDEL", ID_EDIT_CLEAR MENUITEM "å…¨é¸(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "查找(&F)...\tCrtl+F", ID_FIND + MENUITEM "查找(&F)...\tCtrl+F", ID_FIND MENUITEM "找下一個(&N)\tF3", ID_FIND_NEXT MENUITEM "替æ›(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR diff --git a/reactos/base/applications/wordpad/print.c b/reactos/base/applications/wordpad/print.c index 0a1343fbe05..79b43a6f494 100644 --- a/reactos/base/applications/wordpad/print.c +++ b/reactos/base/applications/wordpad/print.c @@ -33,6 +33,12 @@ typedef struct _previewinfo HDC hdcSized; HDC hdcSized2; RECT window; + RECT rcPage; + SIZE bmSize; + SIZE bmScaledSize; + SIZE spacing; + float zoomratio; + int zoomlevel; LPWSTR wszFileName; } previewinfo, *ppreviewinfo; @@ -42,6 +48,8 @@ static HGLOBAL devNames; static RECT margins; static previewinfo preview; +extern const WCHAR wszPreviewWndClass[]; + static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0}; static LPWSTR get_print_file_filter(HWND hMainWnd) @@ -50,7 +58,7 @@ static LPWSTR get_print_file_filter(HWND hMainWnd) const WCHAR files_prn[] = {'*','.','P','R','N',0}; const WCHAR files_all[] = {'*','.','*','\0'}; LPWSTR p; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); p = wszPrintFilter; LoadStringW(hInstance, STRING_PRINTER_FILES_PRN, p, MAX_STRING_LEN); @@ -88,7 +96,7 @@ void registry_read_pagemargins(HKEY hKey) static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id) { REBARBANDINFOW rb; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hRebarWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); WCHAR text[MAX_STRING_LEN]; HWND hButton; @@ -243,9 +251,11 @@ static int get_num_pages(HWND hEditorWnd, FORMATRANGE fr) do { + int bottom = fr.rc.bottom; page++; - fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, + fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, (LPARAM)&fr); + fr.rc.bottom = bottom; } while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax); @@ -260,7 +270,9 @@ static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page) for(i = 1; i < page; i++) { - fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)fr); + int bottom = fr->rc.bottom; + fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, (LPARAM)fr); + fr->rc.bottom = bottom; } } @@ -328,6 +340,7 @@ static void print(LPPRINTDLGW pd, LPWSTR wszFileName) StartDocW(fr.hdc, &di); do { + int bottom = fr.rc.bottom; if(StartPage(fr.hdc) <= 0) break; @@ -335,6 +348,7 @@ static void print(LPPRINTDLGW pd, LPWSTR wszFileName) if(EndPage(fr.hdc) <= 0) break; + bottom = fr.rc.bottom; printedPages++; if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage))) @@ -442,7 +456,9 @@ static void preview_bar_show(HWND hMainWnd, BOOL show) AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2); AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3); AddTextButton(hReBar, STRING_PREVIEW_TWOPAGES, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4); - AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN5); + AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5); + AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6); + AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7); hStatic = CreateWindowW(WC_STATICW, NULL, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, @@ -465,23 +481,220 @@ static void preview_bar_show(HWND hMainWnd, BOOL show) } } +static const int min_spacing = 10; + +static void update_preview_scrollbars(HWND hwndPreview, RECT *window) +{ + SCROLLINFO sbi; + sbi.cbSize = sizeof(sbi); + sbi.fMask = SIF_PAGE|SIF_RANGE; + sbi.nMin = 0; + if (preview.zoomlevel == 0) + { + /* Hide scrollbars when zoomed out. */ + sbi.nMax = 0; + sbi.nPage = window->right; + SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE); + sbi.nPage = window->bottom; + SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE); + } else { + if (!preview.hdc2) + sbi.nMax = preview.bmScaledSize.cx + min_spacing * 2; + else + sbi.nMax = preview.bmScaledSize.cx * 2 + min_spacing * 3; + sbi.nPage = window->right; + SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE); + /* Change in the horizontal scrollbar visibility affects the + * client rect, so update the client rect. */ + GetClientRect(hwndPreview, window); + sbi.nMax = preview.bmScaledSize.cy + min_spacing * 2; + sbi.nPage = window->bottom; + SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE); + } +} + +static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated) +{ + RECT window; + + GetClientRect(hwndPreview, &window); + + /* The zoom ratio isn't updated for partial zoom because of resizing the window. */ + if (zoomLevelUpdated || preview.zoomlevel != 1) + { + float ratio, ratioHeight, ratioWidth; + if (preview.zoomlevel == 2) + { + ratio = 1.0; + } else { + ratioHeight = (window.bottom - min_spacing * 2) / (float)preview.bmSize.cy; + + if(preview.hdc2) + ratioWidth = ((window.right - min_spacing * 3) / 2.0) / (float)preview.bmSize.cx; + else + ratioWidth = (window.right - min_spacing * 2) / (float)preview.bmSize.cx; + + if(ratioWidth > ratioHeight) + ratio = ratioHeight; + else + ratio = ratioWidth; + + if (preview.zoomlevel == 1) + ratio += (1.0 - ratio) / 2; + } + preview.zoomratio = ratio; + } + + preview.bmScaledSize.cx = preview.bmSize.cx * preview.zoomratio; + preview.bmScaledSize.cy = preview.bmSize.cy * preview.zoomratio; + + preview.spacing.cy = max(min_spacing, (window.bottom - preview.bmScaledSize.cy) / 2); + + if(!preview.hdc2) + preview.spacing.cx = (window.right - preview.bmScaledSize.cx) / 2; + else + preview.spacing.cx = (window.right - preview.bmScaledSize.cx * 2) / 3; + if (preview.spacing.cx < min_spacing) + preview.spacing.cx = min_spacing; + + update_preview_scrollbars(hwndPreview, &window); +} + +/* Update for zoom ratio changes with same page. */ +static void update_scaled_preview(HWND hMainWnd) +{ + HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); + preview.window.right = 0; + InvalidateRect(hwndPreview, NULL, TRUE); +} + +LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_CREATE: + { + HWND hEditorWnd = GetDlgItem(GetParent(hWnd), IDC_EDITOR); + FORMATRANGE fr; + GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200}; + HDC hdc = GetDC(hWnd); + HDC hdcTarget = make_dc(); + + fr.rc = preview.rcPage = get_print_rect(hdcTarget); + preview.rcPage.bottom += margins.bottom; + preview.rcPage.right += margins.right; + preview.rcPage.top = preview.rcPage.left = 0; + fr.rcPage = preview.rcPage; + + preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); + preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); + + fr.hdc = CreateCompatibleDC(hdc); + fr.hdcTarget = hdcTarget; + fr.chrg.cpMin = 0; + fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); + preview.pages = get_num_pages(hEditorWnd, fr); + DeleteDC(fr.hdc); + + update_preview_sizes(hWnd, TRUE); + break; + } + + case WM_PAINT: + return print_preview(hWnd); + + case WM_SIZE: + { + update_preview_sizes(hWnd, FALSE); + update_scaled_preview(hWnd); + break; + } + + case WM_VSCROLL: + case WM_HSCROLL: + { + SCROLLINFO si; + RECT rc; + int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ; + int origPos; + + GetClientRect(hWnd, &rc); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + GetScrollInfo(hWnd, nBar, &si); + origPos = si.nPos; + switch(LOWORD(wParam)) + { + case SB_TOP: /* == SB_LEFT */ + si.nPos = si.nMin; + break; + case SB_BOTTOM: /* == SB_RIGHT */ + si.nPos = si.nMax; + break; + case SB_LINEUP: /* == SB_LINELEFT */ + si.nPos -= si.nPage / 10; + break; + case SB_LINEDOWN: /* == SB_LINERIGHT */ + si.nPos += si.nPage / 10; + break; + case SB_PAGEUP: /* == SB_PAGELEFT */ + si.nPos -= si.nPage; + break; + case SB_PAGEDOWN: /* SB_PAGERIGHT */ + si.nPos += si.nPage; + break; + case SB_THUMBTRACK: + si.nPos = si.nTrackPos; + break; + } + si.fMask = SIF_POS; + SetScrollInfo(hWnd, nBar, &si, TRUE); + GetScrollInfo(hWnd, nBar, &si); + if (si.nPos != origPos) + { + int amount = origPos - si.nPos; + if (msg == WM_VSCROLL) + ScrollWindow(hWnd, 0, amount, NULL, NULL); + else + ScrollWindow(hWnd, amount, 0, NULL, NULL); + } + return 0; + } + + default: + return DefWindowProcW(hWnd, msg, wParam, lParam); + } + + return 0; +} + void init_preview(HWND hMainWnd, LPWSTR wszFileName) { + HWND hwndPreview; + HINSTANCE hInstance = GetModuleHandleW(0); preview.page = 1; preview.hdc = 0; preview.hdc2 = 0; preview.wszFileName = wszFileName; + preview.zoomratio = 0; + preview.zoomlevel = 0; preview_bar_show(hMainWnd, TRUE); + + hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL, + WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL, + 0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL); } void close_preview(HWND hMainWnd) { + HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); preview.window.right = 0; preview.window.bottom = 0; preview.page = 0; preview.pages = 0; preview_bar_show(hMainWnd, FALSE); + DestroyWindow(hwndPreview); } BOOL preview_isactive(void) @@ -663,46 +876,53 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, int bmWidth, int bmHeight, RECT* paper, int page) { HBITMAP hBitmapCapture = CreateCompatibleBitmap(lpFr->hdc, bmWidth, bmHeight); + int bottom; char_from_pagenum(hEditorWnd, lpFr, page); SelectObject(lpFr->hdc, hBitmapCapture); FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH)); + bottom = lpFr->rc.bottom; SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr); - /* EM_FORMATRANGE sets fr.rc to indicate the area printed in, but we want to - keep the original for drawing margins */ - lpFr->rc = get_print_rect(lpFr->hdcTarget); + /* EM_FORMATRANGE sets fr.rc.bottom to indicate the area printed in, + * but we want to keep the original for drawing margins */ + lpFr->rc.bottom = bottom; SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); } -LRESULT print_preview(HWND hMainWnd) +static void update_preview_buttons(HWND hMainWnd) +{ + HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.hdc2 ? + (preview.page + 1) < preview.pages : + preview.page < preview.pages); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), preview.pages > 1 && preview.zoomlevel == 0); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMIN), preview.zoomlevel < 2); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMOUT), preview.zoomlevel > 0); +} + +LRESULT print_preview(HWND hwndPreview) { FORMATRANGE fr; - GETTEXTLENGTHEX gt; HDC hdc; RECT window, background; - int bmWidth, bmHeight, bmNewWidth, bmNewHeight; - float ratioWidth, ratioHeight, ratio; - int xOffset, yOffset; - int barheight; - float spacing = 20.0; - HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); PAINTSTRUCT ps; + HWND hMainWnd = GetParent(hwndPreview); + POINT scrollpos; - hdc = BeginPaint(hMainWnd, &ps); - GetClientRect(hMainWnd, &window); + hdc = BeginPaint(hwndPreview, &ps); + GetClientRect(hwndPreview, &window); fr.hdcTarget = make_dc(); - fr.rc = get_print_rect(fr.hdcTarget); - fr.rcPage.left = 0; - fr.rcPage.top = 0; - fr.rcPage.bottom = fr.rc.bottom + margins.bottom; - fr.rcPage.right = fr.rc.right + margins.right; - - bmWidth = twips_to_pixels(fr.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); - bmHeight = twips_to_pixels(fr.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); + fr.rc = fr.rcPage = preview.rcPage; + fr.rc.left += margins.left; + fr.rc.top += margins.top; + fr.rc.bottom -= margins.bottom; + fr.rc.right -= margins.right; if(!preview.hdc) { + GETTEXTLENGTHEX gt; RECT paper; HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); @@ -715,111 +935,113 @@ LRESULT print_preview(HWND hMainWnd) preview.hdc2 = CreateCompatibleDC(hdc); } - fr.hdc = preview.hdc; gt.flags = GTL_DEFAULT; gt.codepage = 1200; fr.chrg.cpMin = 0; fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); paper.left = 0; - paper.right = bmWidth; + paper.right = preview.bmSize.cx; paper.top = 0; - paper.bottom = bmHeight; - - if(!preview.pages) - preview.pages = get_num_pages(hEditorWnd, fr); + paper.bottom = preview.bmSize.cy; fr.hdc = preview.hdc; - draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page); + draw_preview(hEditorWnd, &fr, preview.bmSize.cx, preview.bmSize.cy, &paper, preview.page); if(preview.hdc2) { fr.hdc = preview.hdc2; - draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page + 1); + draw_preview(hEditorWnd, &fr, preview.bmSize.cx, preview.bmSize.cy, &fr.rcPage, preview.page + 1); } - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1); - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.hdc2 ? - (preview.page + 1) < preview.pages : - preview.page < preview.pages); - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), preview.pages > 1); + update_preview_buttons(hMainWnd); } - barheight = SendMessageW(hReBar, RB_GETBARHEIGHT, 0, 0); - ratioHeight = ((float)window.bottom - spacing - (float)barheight) / (float)bmHeight; - - if(preview.hdc2) - ratioWidth = ((float)window.right / 2.0 - spacing * 2.0) / (float)bmWidth; - else - ratioWidth = ((float)window.right - spacing * 3.0) / (float)bmWidth; - - if(ratioWidth > ratioHeight) - ratio = ratioHeight; - else - ratio = ratioWidth; - - bmNewWidth = (int)((float)bmWidth * ratio); - bmNewHeight = (int)((float)bmHeight * ratio); - - yOffset = ((window.bottom - bmNewHeight + barheight) / 2); - - if(!preview.hdc2) - xOffset = (window.right - bmNewWidth) / 2; - else - xOffset = (window.right - bmNewWidth * 2) / 2; - - window.top = barheight; FillRect(hdc, &window, GetStockObject(GRAY_BRUSH)); - background.left = xOffset - 2; - background.right = xOffset + bmNewWidth + 2; - background.top = yOffset - 2; - background.bottom = yOffset + bmNewHeight + 2; + scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ); + scrollpos.y = GetScrollPos(hwndPreview, SB_VERT); + + background.left = preview.spacing.cx - 2 - scrollpos.x; + background.right = background.left + preview.bmScaledSize.cx + 4; + background.top = preview.spacing.cy - 2 - scrollpos.y; + background.bottom = background.top + preview.bmScaledSize.cy + 4; FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); + if(preview.hdc2) + { + background.left += preview.bmScaledSize.cx + preview.spacing.cx; + background.right += preview.bmScaledSize.cx + preview.spacing.cx; + + FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); + } + if(window.right != preview.window.right || window.bottom != preview.window.bottom) { - draw_preview_page(preview.hdc, &preview.hdcSized, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight); + draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.bmSize.cx, preview.bmSize.cy); if(preview.hdc2) { - background.left += bmNewWidth + spacing; - background.right += bmNewWidth + spacing; - - FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); - - draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight); + draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.bmSize.cx, preview.bmSize.cy); } } - BitBlt(hdc, xOffset, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized, 0, 0, SRCCOPY); + BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.hdcSized, 0, 0, SRCCOPY); if(preview.hdc2) { - BitBlt(hdc, xOffset + bmNewWidth + spacing, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized2, 0, 0, SRCCOPY); + BitBlt(hdc, preview.spacing.cx * 2 + preview.bmScaledSize.cx - scrollpos.x, + preview.spacing.cy - scrollpos.y, preview.bmScaledSize.cx, + preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY); } DeleteDC(fr.hdcTarget); preview.window = window; - EndPaint(hMainWnd, &ps); + EndPaint(hwndPreview, &ps); return 0; } -static void update_preview(HWND hWnd) +/* Update for page changes. */ +static void update_preview(HWND hMainWnd) { - RECT rc; - DeleteDC(preview.hdc); preview.hdc = 0; - preview.window.right = 0; + update_scaled_preview(hMainWnd); +} - GetClientRect(hWnd, &rc); - rc.top += SendMessageW(GetDlgItem(hWnd, IDC_REBAR), RB_GETBARHEIGHT, 0, 0); - InvalidateRect(hWnd, &rc, TRUE); +static void toggle_num_pages(HWND hMainWnd) +{ + HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); + WCHAR name[MAX_STRING_LEN]; + HINSTANCE hInst = GetModuleHandleW(0); + + if(preview.hdc2) + { + DeleteDC(preview.hdc2); + preview.hdc2 = 0; + } else + { + if(preview.page == preview.pages) + preview.page--; + preview.hdc2 = (HDC)-1; + } + + LoadStringW(hInst, preview.hdc2 ? STRING_PREVIEW_ONEPAGE : STRING_PREVIEW_TWOPAGES, + name, MAX_STRING_LEN); + + SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name); + update_preview_sizes(GetDlgItem(hMainWnd, IDC_PREVIEW), TRUE); + update_preview(hMainWnd); } LRESULT preview_command(HWND hWnd, WPARAM wParam) @@ -843,29 +1065,38 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam) break; case ID_PREVIEW_NUMPAGES: - { - HWND hReBar = GetDlgItem(hWnd, IDC_REBAR); - WCHAR name[MAX_STRING_LEN]; - HINSTANCE hInst = (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE); + toggle_num_pages(hWnd); + break; - if(preview.hdc2) + case ID_PREVIEW_ZOOMIN: + if (preview.zoomlevel < 2) { - DeleteDC(preview.hdc2); - preview.hdc2 = 0; - } else - { - if(preview.page == preview.pages) - preview.page--; - preview.hdc2 = (HDC)-1; + preview.zoomlevel++; + preview.zoomratio = 0; + if (preview.hdc2) + { + /* Forced switch to one page when zooming in. */ + toggle_num_pages(hWnd); + } else { + HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW); + update_preview_sizes(hwndPreview, TRUE); + update_scaled_preview(hWnd); + update_preview_buttons(hWnd); + } } + break; - LoadStringW(hInst, preview.hdc2 ? STRING_PREVIEW_ONEPAGE : STRING_PREVIEW_TWOPAGES, - name, MAX_STRING_LEN); - - SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name); - update_preview(hWnd); - } - break; + case ID_PREVIEW_ZOOMOUT: + if (preview.zoomlevel > 0) + { + HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW); + preview.zoomlevel--; + preview.zoomratio = 0; + update_preview_sizes(hwndPreview, TRUE); + update_scaled_preview(hWnd); + update_preview_buttons(hWnd); + } + break; case ID_PRINT: dialog_print(hWnd, preview.wszFileName); diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index 4786e66ddcc..3c32d1f7b2f 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -1,4 +1,4 @@ -/* +/* * Copyright 2004 by Krzysztof Foltman * Copyright 2007 by Alexander N. Sørnes * @@ -66,6 +66,7 @@ IDI_TXT ICON "txt.ico" #include "En.rc" #include "Fr.rc" #include "Hu.rc" +#include "It.rc" #include "Ja.rc" #include "Ko.rc" #include "Lt.rc" @@ -77,4 +78,5 @@ IDI_TXT ICON "txt.ico" #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Uk.rc" #include "Zh.rc" diff --git a/reactos/base/applications/wordpad/wordpad.c b/reactos/base/applications/wordpad/wordpad.c index e983c5d74b7..0bbe3604438 100644 --- a/reactos/base/applications/wordpad/wordpad.c +++ b/reactos/base/applications/wordpad/wordpad.c @@ -56,6 +56,9 @@ static const WCHAR wszMainWndClass[] = {'W','O','R','D','P','A','D','T','O','P', static const WCHAR stringFormat[] = {'%','2','d','\0'}; +const WCHAR wszPreviewWndClass[] = {'P','r','t','P','r','e','v','i','e','w',0}; +LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + static HWND hMainWnd; static HWND hEditorWnd; static HWND hFindWnd; @@ -85,7 +88,7 @@ static void DoLoadStrings(void) static const WCHAR files_txt[] = {'*','.','t','x','t','\0'}; static const WCHAR files_all[] = {'*','.','*','\0'}; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); LoadStringW(hInstance, STRING_RICHTEXT_FILES_RTF, p, MAX_STRING_LEN); p += lstrlenW(p) + 1; @@ -683,8 +686,7 @@ static void set_bar_states(void) static void preview_exit(HWND hMainWnd) { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); - HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_MAINMENU)); + HMENU hMenu = LoadMenuW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDM_MAINMENU)); HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); set_bar_states(); @@ -701,7 +703,7 @@ static void preview_exit(HWND hMainWnd) static void set_fileformat(WPARAM format) { HICON hIcon; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); fileFormat = format; if(format & SF_TEXT) @@ -980,8 +982,7 @@ static void DialogOpenFile(void) static void dialog_about(void) { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); - HICON icon = LoadImageW(hInstance, MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON, 48, 48, LR_SHARED); + HICON icon = LoadImageW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON, 48, 48, LR_SHARED); ShellAboutW(hMainWnd, wszAppTitle, 0, icon); } @@ -1088,7 +1089,7 @@ static void dialog_viewproperties(void) PROPSHEETPAGEW psp[2]; PROPSHEETHEADERW psh; size_t i; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)&psp; psp[0].dwSize = sizeof(PROPSHEETPAGEW); @@ -1241,7 +1242,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) if(pFr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; - ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft); + ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft); if(ret == -1) { @@ -1250,7 +1251,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) ft.chrg.cpMin = cr.cpMin = 0; ft.chrg.cpMax = cr.cpMax = startPos; - ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft); + ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft); } } @@ -1263,7 +1264,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) { end = ret + lstrlenW(pFr->lpstrFindWhat); cr.cpMin = end; - SendMessageW(hEditorWnd, EM_SETSEL, (WPARAM)ret, (LPARAM)end); + SendMessageW(hEditorWnd, EM_SETSEL, ret, end); SendMessageW(hEditorWnd, EM_SCROLLCARET, 0, 0); if(pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL) @@ -1414,7 +1415,7 @@ static INT_PTR CALLBACK newfile_proc(HWND hWnd, UINT message, WPARAM wParam, LPA { case WM_INITDIALOG: { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); WCHAR buffer[MAX_STRING_LEN]; HWND hListWnd = GetDlgItem(hWnd, IDC_NEWFILE); @@ -1459,8 +1460,7 @@ static INT_PTR CALLBACK paraformat_proc(HWND hWnd, UINT message, WPARAM wParam, { case WM_INITDIALOG: { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, - GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); WCHAR buffer[MAX_STRING_LEN]; HWND hListWnd = GetDlgItem(hWnd, IDC_PARA_ALIGN); HWND hLeftWnd = GetDlgItem(hWnd, IDC_PARA_LEFT); @@ -1737,7 +1737,7 @@ static int context_menu(LPARAM lParam) int from = 0, to = 0; POINTL pt; SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); - SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, (LPARAM)to); + SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, to); ClientToScreen(hEditorWnd, (POINT*)&pt); x = pt.x; y = pt.y; @@ -1752,7 +1752,7 @@ static int context_menu(LPARAM lParam) static LRESULT OnCreate( HWND hWnd ) { HWND hToolBarWnd, hFormatBarWnd, hReBarWnd, hFontListWnd, hSizeListWnd, hRulerWnd; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); HANDLE hDLL; TBADDBITMAP ab; int nStdBitmaps = 0; @@ -2018,7 +2018,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) case ID_FILE_NEW: { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); int ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_NEWFILE), hWnd, newfile_proc); @@ -2334,25 +2334,15 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) break; case ID_DATETIME: - { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); - DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_DATETIME), hWnd, datetime_proc); + DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_DATETIME), hWnd, datetime_proc); break; - } case ID_PARAFORMAT: - { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); - DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, - paraformat_proc); - } + DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, paraformat_proc); break; case ID_TABSTOPS: - { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); - DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_TABSTOPS), hWnd, tabstops_proc); - } + DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, tabstops_proc); break; case ID_ABOUT: @@ -2460,7 +2450,7 @@ static LRESULT OnSize( HWND hWnd, WPARAM wParam, LPARAM lParam ) { int nStatusSize = 0; RECT rc; - HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR); + HWND hwndEditor = preview_isactive() ? GetDlgItem(hWnd, IDC_PREVIEW) : GetDlgItem(hWnd, IDC_EDITOR); HWND hwndStatusBar = GetDlgItem(hWnd, IDC_STATUSBAR); HWND hwndReBar = GetDlgItem(hWnd, IDC_REBAR); HWND hRulerWnd = GetDlgItem(hWnd, IDC_RULER); @@ -2563,9 +2553,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara } break; case WM_PAINT: - if(preview_isactive()) - return print_preview(hWnd); - else + if(!preview_isactive()) return DefWindowProcW(hWnd, msg, wParam, lParam); default: @@ -2605,6 +2593,18 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar wc.lpszClassName = wszMainWndClass; RegisterClassW(&wc); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = preview_proc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_IBEAM); + wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); + wc.lpszMenuName = NULL; + wc.lpszClassName = wszPreviewWndClass; + RegisterClassW(&wc); + registry_read_winrect(&rc); hMainWnd = CreateWindowExW(0, wszMainWndClass, wszAppTitle, WS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, hInstance, NULL); diff --git a/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h index b51bec8fcb0..26aa41a1828 100644 --- a/reactos/base/applications/wordpad/wordpad.h +++ b/reactos/base/applications/wordpad/wordpad.h @@ -49,6 +49,8 @@ #define ID_PREVIEW_NEXTPAGE 1017 #define ID_PREVIEW_PREVPAGE 1018 #define ID_PREVIEW_NUMPAGES 1019 +#define ID_PREVIEW_ZOOMIN 1020 +#define ID_PREVIEW_ZOOMOUT 1021 #define ID_ALIGN_LEFT 1100 #define ID_ALIGN_CENTER 1101 @@ -84,7 +86,7 @@ #define ID_TOGGLE_STATUSBAR 1502 #define ID_TOGGLE_RULER 1503 -#define PREVIEW_BUTTONS 5 +#define PREVIEW_BUTTONS 7 #define FILELIST_ENTRIES 4 #define FILELIST_ENTRY_LENGTH 33 @@ -101,7 +103,9 @@ #define BANDID_PREVIEW_BTN3 8 #define BANDID_PREVIEW_BTN4 9 #define BANDID_PREVIEW_BTN5 10 -#define BANDID_PREVIEW_BUFFER 11 +#define BANDID_PREVIEW_BTN6 11 +#define BANDID_PREVIEW_BTN7 12 +#define BANDID_PREVIEW_BUFFER 13 #define ID_WORDWRAP_NONE 0 #define ID_WORDWRAP_WINDOW 1 @@ -145,6 +149,7 @@ #define IDC_FONTLIST 2013 #define IDC_SIZELIST 2014 #define IDC_RULER 2015 +#define IDC_PREVIEW 2016 #define IDD_DATETIME 2100 #define IDD_NEWFILE 2101 @@ -187,9 +192,11 @@ #define STRING_PREVIEW_PREVPAGE 1450 #define STRING_PREVIEW_TWOPAGES 1451 #define STRING_PREVIEW_ONEPAGE 1452 -#define STRING_PREVIEW_CLOSE 1453 +#define STRING_PREVIEW_ZOOMIN 1453 +#define STRING_PREVIEW_ZOOMOUT 1454 +#define STRING_PREVIEW_CLOSE 1455 -#define STRING_UNITS_CM 1454 +#define STRING_UNITS_CM 1456 #define STRING_DEFAULT_FILENAME 1700 #define STRING_PROMPT_SAVE_CHANGES 1701 diff --git a/reactos/base/applications/write/It.rc b/reactos/base/applications/write/It.rc new file mode 100644 index 00000000000..9c8ce25a7c9 --- /dev/null +++ b/reactos/base/applications/write/It.rc @@ -0,0 +1,32 @@ +/* + * Italian language support + * + * Copyright (C) 2010 by Luca Bennati + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resources.h" + +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + IDS_FAILED, "Impossibile avviare WordPad" +} +#pragma code_page(default) diff --git a/reactos/base/applications/write/Uk.rc b/reactos/base/applications/write/Uk.rc new file mode 100644 index 00000000000..968ed404d57 --- /dev/null +++ b/reactos/base/applications/write/Uk.rc @@ -0,0 +1,34 @@ +/* + * Ukrainian language support + * + * Copyright (C) 2007 Mikolaj Zalewski + * + * Copyright (C) 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resources.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + IDS_FAILED, "Ðе вдалоÑÑŒ запуÑтити Wordpad" +} +#pragma code_page(default) diff --git a/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/rsrc.rc index 7c55c3001b4..d3ddc33bdc7 100644 --- a/reactos/base/applications/write/rsrc.rc +++ b/reactos/base/applications/write/rsrc.rc @@ -23,6 +23,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "De.rc" #include "En.rc" #include "Fr.rc" +#include "It.rc" #include "Ja.rc" #include "Ko.rc" #include "Lt.rc" @@ -32,3 +33,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Ru.rc" #include "Si.rc" #include "Sv.rc" +#include "Uk.rc" From c6af848c9e01d67284b0659464fcfff4b6a842f5 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Mon, 8 Feb 2010 10:49:41 +0000 Subject: [PATCH 21/97] Sync winfile to Wine 1.1.38 svn path=/trunk/; revision=45496 --- rosapps/applications/winfile/Cs.rc | 17 +- rosapps/applications/winfile/Da.rc | 17 +- rosapps/applications/winfile/De.rc | 17 +- rosapps/applications/winfile/En.rc | 17 +- rosapps/applications/winfile/Es.rc | 17 +- rosapps/applications/winfile/Fr.rc | 17 +- rosapps/applications/winfile/Hu.rc | 17 +- rosapps/applications/winfile/It.rc | 110 +++++++++-- rosapps/applications/winfile/Ja.rc | 17 +- rosapps/applications/winfile/Ko.rc | 17 +- rosapps/applications/winfile/Lt.rc | 17 +- rosapps/applications/winfile/Nl.rc | 17 +- rosapps/applications/winfile/No.rc | 17 +- rosapps/applications/winfile/Pl.rc | 17 +- rosapps/applications/winfile/Pt.rc | 22 +-- rosapps/applications/winfile/Ru.rc | 16 +- rosapps/applications/winfile/Si.rc | 17 +- rosapps/applications/winfile/Sv.rc | 17 +- rosapps/applications/winfile/Tr.rc | 17 +- rosapps/applications/winfile/Uk.rc | 251 ++++++++++++++++++++++++ rosapps/applications/winfile/Zh.rc | 36 +--- rosapps/applications/winfile/resource.h | 3 +- rosapps/applications/winfile/rsrc.rc | 1 + rosapps/applications/winfile/winefile.c | 49 +---- 24 files changed, 375 insertions(+), 385 deletions(-) create mode 100644 rosapps/applications/winfile/Uk.rc diff --git a/rosapps/applications/winfile/Cs.rc b/rosapps/applications/winfile/Cs.rc index ad718638e69..80ddc1b75ca 100644 --- a/rosapps/applications/winfile/Cs.rc +++ b/rosapps/applications/winfile/Cs.rc @@ -45,7 +45,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Komprese...", 119 MENUITEM "&Dekomprese...", 120 MENUITEM SEPARATOR - MENUITEM "&Spustit...", ID_EXECUTE + MENUITEM "&Spustit...", ID_RUN MENUITEM "&Tisknout...", 102 MENUITEM "Asociovat...", 103 MENUITEM SEPARATOR @@ -150,21 +150,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Spustit" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Pøíkaz:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Jako &Symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Zrušit", 2, 158, 23, 47, 14 - PUSHBUTTON "&Pomoc", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Zvolte cíl" diff --git a/rosapps/applications/winfile/Da.rc b/rosapps/applications/winfile/Da.rc index ffc74156574..385333c3cfe 100644 --- a/rosapps/applications/winfile/Da.rc +++ b/rosapps/applications/winfile/Da.rc @@ -39,7 +39,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "K&omprimer...", 119 MENUITEM "De&komprimer...", 120 MENUITEM SEPARATOR - MENUITEM "Kø&r...", ID_EXECUTE + MENUITEM "Kø&r...", ID_RUN MENUITEM "&Udskriv...", 102 MENUITEM "Associer...", 103 MENUITEM SEPARATOR @@ -144,21 +144,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Kør" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Kommando:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "&Som symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Annuller", 2, 158, 23, 47, 14 - PUSHBUTTON "&Hjælp", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Vælg destination" diff --git a/rosapps/applications/winfile/De.rc b/rosapps/applications/winfile/De.rc index 576075f4098..cc77fd84402 100644 --- a/rosapps/applications/winfile/De.rc +++ b/rosapps/applications/winfile/De.rc @@ -43,7 +43,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "K&omprimieren...", 119 MENUITEM "Deko&mprimieren...", 120 MENUITEM SEPARATOR - MENUITEM "&Ausführen...", ID_EXECUTE + MENUITEM "&Ausführen...", ID_RUN MENUITEM "&Drucken...", 102 MENUITEM "Zuord&nen...", 103 MENUITEM SEPARATOR @@ -144,21 +144,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ausführen" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "Befehls&zeile:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Als &Symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Abbrechen", 2, 158, 23, 47, 14 - PUSHBUTTON "&Hilfe", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Ziel auswählen" diff --git a/rosapps/applications/winfile/En.rc b/rosapps/applications/winfile/En.rc index 644cf2ff262..06405aa1c33 100644 --- a/rosapps/applications/winfile/En.rc +++ b/rosapps/applications/winfile/En.rc @@ -41,7 +41,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "C&ompress...", 119 MENUITEM "Dec&ompress...", 120 MENUITEM SEPARATOR - MENUITEM "&Run...", ID_EXECUTE + MENUITEM "&Run...", ID_RUN MENUITEM "&Print...", 102 MENUITEM "Associate...", 103 MENUITEM SEPARATOR @@ -146,21 +146,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Execute" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Command:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "As &Symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Cancel", 2, 158, 23, 47, 14 - PUSHBUTTON "&Help", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Select destination" diff --git a/rosapps/applications/winfile/Es.rc b/rosapps/applications/winfile/Es.rc index 7e445ee309f..a531d974519 100644 --- a/rosapps/applications/winfile/Es.rc +++ b/rosapps/applications/winfile/Es.rc @@ -39,7 +39,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "C&omprimir...", 119 MENUITEM "&Descomprimir...", 120 MENUITEM SEPARATOR - MENUITEM "E&jecutar...", ID_EXECUTE + MENUITEM "E&jecutar...", ID_RUN MENUITEM "I&mprimir...", 102 MENUITEM "Asoc&iar...", 103 MENUITEM SEPARATOR @@ -144,21 +144,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ejecutar" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Comando:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Como &símbolo", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "Aceptar", 1, 158, 6, 47, 14 - PUSHBUTTON "Cancelar", 2, 158, 23, 47, 14 - PUSHBUTTON "&Ayuda", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Seleccione destino" diff --git a/rosapps/applications/winfile/Fr.rc b/rosapps/applications/winfile/Fr.rc index 1e8c279919f..d1f5c3e1137 100644 --- a/rosapps/applications/winfile/Fr.rc +++ b/rosapps/applications/winfile/Fr.rc @@ -46,7 +46,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Co&mpresser...", 119 MENUITEM "Décompre&sser...", 120 MENUITEM SEPARATOR - MENUITEM "E&xécuter...", ID_EXECUTE + MENUITEM "E&xécuter...", ID_RUN MENUITEM "&Imprimer...", 102 MENUITEM "&Associer...", 103 MENUITEM SEPARATOR @@ -151,21 +151,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Exécuter" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Commande :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Sous forme d'icône", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 75, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Annuler", 2, 158, 23, 47, 14 - PUSHBUTTON "Aid&e", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Sélectionner la destination" diff --git a/rosapps/applications/winfile/Hu.rc b/rosapps/applications/winfile/Hu.rc index f7ca49a2bbe..2af0595690f 100644 --- a/rosapps/applications/winfile/Hu.rc +++ b/rosapps/applications/winfile/Hu.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Becsomagolás...", 119 MENUITEM "K&icsomagolás...", 120 MENUITEM SEPARATOR - MENUITEM "&Futtatás...", ID_EXECUTE + MENUITEM "&Futtatás...", ID_RUN MENUITEM "&Nyomtatás...", 102 MENUITEM "Társítás...", 103 MENUITEM SEPARATOR @@ -146,18 +146,3 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Winefile-ról...", ID_ABOUT } } - - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Futtatás" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Parancs:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "&Szimbólumként", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Mégse", 2, 158, 23, 47, 14 - PUSHBUTTON "&Súgó", 254, 158, 43, 47, 14 -} diff --git a/rosapps/applications/winfile/It.rc b/rosapps/applications/winfile/It.rc index f2012300057..843d47312e3 100644 --- a/rosapps/applications/winfile/It.rc +++ b/rosapps/applications/winfile/It.rc @@ -6,6 +6,7 @@ * Copyright 2002 Steven Edwards * Copyright 2002 Alexandre Julliard * Copyright 2004 Ivan Leo Puoti + * Copyright 2010 Luca Bennati * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -24,6 +25,9 @@ #include "resource.h" +/*UTF-8*/ +#pragma code_page(65001) + LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL /* Menu */ @@ -37,12 +41,12 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Negli Appunti...\tF9", 118 MENUITEM "&Cancella\tDel", ID_FILE_DELETE MENUITEM "Ri&nomina...", 109 - MENUITEM "Propri&età...\tAlt+Invio", ID_EDIT_PROPERTIES + MENUITEM "Propri&età...\tAlt+Invio", ID_EDIT_PROPERTIES MENUITEM SEPARATOR MENUITEM "C&omprimi...", 119 MENUITEM "Dec&omprimi...", 120 MENUITEM SEPARATOR - MENUITEM "&Esegui...", ID_EXECUTE + MENUITEM "&Esegui...", ID_RUN MENUITEM "&Stampa...", 102 MENUITEM "Associa...", 103 MENUITEM SEPARATOR @@ -81,7 +85,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Espandi &tutto\tStrg+*", 303 MENUITEM "Riduci &Albero\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Seleziona unità", 505 + MENUITEM "&Seleziona unità", 505 } POPUP "&Visualizza" { @@ -141,27 +145,12 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Guida" { MENUITEM "&Sommario della Guida\tF1", ID_HELP MENUITEM "&Cerca nella Guida...\tF1", ID_HELP - MENUITEM "&Uso dell Guida\tF1", ID_HELP_USING + MENUITEM "&Uso della Guida\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Informazioni su Winefile...",ID_ABOUT } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Esegui" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Comando:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Come &Simbolo", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Annulla", 2, 158, 23, 47, 14 - PUSHBUTTON "&Aiuto", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Seleziona destinazione" @@ -175,8 +164,89 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Naviga", 254, 158, 43, 47, 14 } +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Per tipo di file" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Nome:",-1,7,8,22,10 + EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL + GROUPBOX "Tipo di file",-1,7,23,87,56 + CONTROL "&Cartelle",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Programmi",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "Docu&menti",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "&Altri files",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "&Mostra files nascosti/di sistema",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 + DEFPUSHBUTTON "OK",IDOK,104,7,50,14 + PUSHBUTTON "Annulla",IDCANCEL,104,24,50,14 +END + +IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Propprietà di %s" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,191,7,50,14 + PUSHBUTTON "Annulla",IDCANCEL,191,29,50,14 + LTEXT "Nome del &file:",-1,7,7,59,9 + EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "&Indirizzo completo:",-1,7,18,59,9 + EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Ultima modifica:",-1,7,29,59,9 + EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Versione:",-1,7,40,59,9 + EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Cop&yright:",-1,7,51,59,9 + EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Dimensione:",-1,7,62,59,9 + EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + GROUPBOX "Attributi",-1,7,79,158,46 + CONTROL "&Sola lettura",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "&Nascosto",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "&Archivio",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 + CONTROL "&Di sistema",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "&Compresso",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "&Informazioni sulla versione",-1,7,129,234,79 + LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL +END + + STRINGTABLE { IDS_FONT_SEL_DLG_NAME "Applica le impostazioni dei caratteri" - IDS_FONT_SEL_ERROR "Si è verificato un errore durante la selezione del nuovo carattere." + IDS_FONT_SEL_ERROR "Si è verificato un errore durante la selezione del nuovo carattere." +} + +STRINGTABLE +{ + IDS_WINEFILE "Wine File Manager" + IDS_ERROR "Errore" + IDS_ROOT_FS "root fs" + IDS_UNIXFS "unixfs" + IDS_DESKTOP "Scrivania" + IDS_SHELL "Shell" + IDS_TITLEFMT "%s - %s" + IDS_NO_IMPL "Non ancora implementato" + IDS_WINE_FILE "Wine File" +} + +STRINGTABLE +{ + IDS_COL_NAME "Nome" + IDS_COL_SIZE "Dimensione" + IDS_COL_CDATE "CDate" + IDS_COL_ADATE "ADate" + IDS_COL_MDATE "MDate" + IDS_COL_IDX "Index/Inode" + IDS_COL_LINKS "Collegamenti" + IDS_COL_ATTR "Attributi" + IDS_COL_SEC "Sicurezza" + + IDS_FREE_SPACE_FMT "liberi %s di %s" } diff --git a/rosapps/applications/winfile/Ja.rc b/rosapps/applications/winfile/Ja.rc index bac2414b6d1..e6def891c04 100644 --- a/rosapps/applications/winfile/Ja.rc +++ b/rosapps/applications/winfile/Ja.rc @@ -44,7 +44,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "圧縮(&O)...", 119 MENUITEM "è§£å‡(&O)...", 120 MENUITEM SEPARATOR - MENUITEM "実行(&R)...", ID_EXECUTE + MENUITEM "実行(&R)...", ID_RUN MENUITEM "å°åˆ·(&P)...", 102 MENUITEM "関連付ã‘...", 103 MENUITEM SEPARATOR @@ -149,21 +149,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "実行" -FONT 9, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "コマンド(&C):", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "As &Symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "キャンセル", 2, 158, 23, 47, 14 - PUSHBUTTON "ヘルプ(&H)", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ç§»å‹•å…ˆã‚’é¸æŠž" diff --git a/rosapps/applications/winfile/Ko.rc b/rosapps/applications/winfile/Ko.rc index 0a6207a52ca..7f125835c9e 100644 --- a/rosapps/applications/winfile/Ko.rc +++ b/rosapps/applications/winfile/Ko.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "¾ÐÃà(&O)...", 119 MENUITEM "¾ÐÃà Ç®±â(&O)...", 120 MENUITEM SEPARATOR - MENUITEM "½ÇÇà(&R)...", ID_EXECUTE + MENUITEM "½ÇÇà(&R)...", ID_RUN MENUITEM "Àμâ(&P)...", 102 MENUITEM "¿¬°á...", 103 MENUITEM SEPARATOR @@ -147,21 +147,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "½ÇÇà" -FONT 9, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "¸í·É(&C):", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "½É¹ú·Î(&S)", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "È®ÀÎ", 1, 158, 6, 47, 14 - PUSHBUTTON "Ãë¼Ò", 2, 158, 23, 47, 14 - PUSHBUTTON "µµ¿ò¸»(&H)", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "¸ñÀûÁö ¼±ÅÃ" diff --git a/rosapps/applications/winfile/Lt.rc b/rosapps/applications/winfile/Lt.rc index c8ca5ff0ecd..d0c277d5b75 100644 --- a/rosapps/applications/winfile/Lt.rc +++ b/rosapps/applications/winfile/Lt.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Glaudinti...", 119 MENUITEM "IÅ¡sk&leisti...", 120 MENUITEM SEPARATOR - MENUITEM "&Vykdyti...", ID_EXECUTE + MENUITEM "&Vykdyti...", ID_RUN MENUITEM "&Spausdinti...", 102 MENUITEM "Susieti...", 103 MENUITEM SEPARATOR @@ -147,21 +147,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Vykdyti" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Komanda:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Kaip &simbolį", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "Gerai", 1, 158, 6, 47, 14 - PUSHBUTTON "Atsisakyti", 2, 158, 23, 47, 14 - PUSHBUTTON "&Žinynas", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "IÅ¡rinkite paskirtį" diff --git a/rosapps/applications/winfile/Nl.rc b/rosapps/applications/winfile/Nl.rc index 8f6f7f16825..e6ea1dbb6f3 100644 --- a/rosapps/applications/winfile/Nl.rc +++ b/rosapps/applications/winfile/Nl.rc @@ -38,7 +38,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Comprimeren...", 119 MENUITEM "&Dec&omprimeren...", 120 MENUITEM SEPARATOR - MENUITEM "&Starten...", ID_EXECUTE + MENUITEM "&Starten...", ID_RUN MENUITEM "Af&drukken...", 102 MENUITEM "Koppelen...", 103 MENUITEM SEPARATOR @@ -143,21 +143,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Uitvoeren" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Opdracht:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Als &pictogram", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Annuleren", 2, 158, 23, 47, 14 - PUSHBUTTON "&Help", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Selecteer bestemming" diff --git a/rosapps/applications/winfile/No.rc b/rosapps/applications/winfile/No.rc index eec8b82c8f5..f1317e8868d 100644 --- a/rosapps/applications/winfile/No.rc +++ b/rosapps/applications/winfile/No.rc @@ -39,7 +39,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "K&omprimer...", 119 MENUITEM "De&komprimer...", 120 MENUITEM SEPARATOR - MENUITEM "Kjø&r...", ID_EXECUTE + MENUITEM "Kjø&r...", ID_RUN MENUITEM "Skriv &ut...", 102 MENUITEM "Tilknytt...", 103 MENUITEM SEPARATOR @@ -144,21 +144,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Kjør" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Kommando:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "&Som symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Avbryt", 2, 158, 23, 47, 14 - PUSHBUTTON "&Hjelp", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Velg plasserings" diff --git a/rosapps/applications/winfile/Pl.rc b/rosapps/applications/winfile/Pl.rc index 50247e3181a..8bc3a77bdd2 100644 --- a/rosapps/applications/winfile/Pl.rc +++ b/rosapps/applications/winfile/Pl.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Ko&mpresja...", 119 MENUITEM "D&ekompresja...", 120 MENUITEM SEPARATOR - MENUITEM "U&ruchom...", ID_EXECUTE + MENUITEM "U&ruchom...", ID_RUN MENUITEM "&Drukuj...", 102 MENUITEM "Skojarz...", 103 MENUITEM SEPARATOR @@ -147,21 +147,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Uruchom" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Polecenie:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Jako &symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Anuluj", 2, 158, 23, 47, 14 - PUSHBUTTON "&Pomoc", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Wybór celu" diff --git a/rosapps/applications/winfile/Pt.rc b/rosapps/applications/winfile/Pt.rc index 6ae50da9255..6f49ce48a9c 100644 --- a/rosapps/applications/winfile/Pt.rc +++ b/rosapps/applications/winfile/Pt.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "C&omprimir...", 119 MENUITEM "Descomprimir...", 120 MENUITEM SEPARATOR - MENUITEM "Execu&tar...", ID_EXECUTE + MENUITEM "Execu&tar...", ID_RUN MENUITEM "&Imprimir...", 102 MENUITEM "A&ssociar...", 103 MENUITEM SEPARATOR @@ -163,7 +163,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "C&omprimir...", 119 MENUITEM "&Descomprimir...", 120 MENUITEM SEPARATOR - MENUITEM "Execu&tar...", ID_EXECUTE + MENUITEM "Execu&tar...", ID_RUN MENUITEM "&Imprimir...", 102 MENUITEM "A&ssociar...", 103 MENUITEM SEPARATOR @@ -268,24 +268,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Executar" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Comando:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "&Minimizado", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Cancelar", 2, 158, 23, 47, 14 - PUSHBUTTON "&Ajuda", 254, 158, 43, 47, 14 -} - - LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 diff --git a/rosapps/applications/winfile/Ru.rc b/rosapps/applications/winfile/Ru.rc index c24bfc99edd..c4c2a6272de 100644 --- a/rosapps/applications/winfile/Ru.rc +++ b/rosapps/applications/winfile/Ru.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Ðрхивировать...", 119 MENUITEM "РаÑпаковать...", 120 MENUITEM SEPARATOR - MENUITEM "&ЗапуÑтить...", ID_EXECUTE + MENUITEM "&ЗапуÑтить...", ID_RUN MENUITEM "&Печатать...", 102 MENUITEM "ÐÑÑоциировать...", 103 MENUITEM SEPARATOR @@ -147,20 +147,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Выполнить" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Команда:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Как &Ñимвол", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Отмена", 2, 158, 23, 47, 14 - PUSHBUTTON "&Справка", 254, 158, 43, 47, 14 -} IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Выберите путь назначениÑ" diff --git a/rosapps/applications/winfile/Si.rc b/rosapps/applications/winfile/Si.rc index 24f673c3af1..f3ffd45a05b 100644 --- a/rosapps/applications/winfile/Si.rc +++ b/rosapps/applications/winfile/Si.rc @@ -41,7 +41,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Stisni ...", 119 MENUITEM "Ra&zÅ¡iri ...", 120 MENUITEM SEPARATOR - MENUITEM "Zaž&eni ...", ID_EXECUTE + MENUITEM "Zaž&eni ...", ID_RUN MENUITEM "&Tiskaj ...", 102 MENUITEM "Poveži s programom ...", 103 MENUITEM SEPARATOR @@ -146,21 +146,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Zagon" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Ukaz:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Kot &simbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "V redu", 1, 158, 6, 47, 14 - PUSHBUTTON "PrekliÄi", 2, 158, 23, 47, 14 - PUSHBUTTON "&PomoÄ", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Izbira ciljne poti" diff --git a/rosapps/applications/winfile/Sv.rc b/rosapps/applications/winfile/Sv.rc index 4deddd953a0..45202b218cb 100644 --- a/rosapps/applications/winfile/Sv.rc +++ b/rosapps/applications/winfile/Sv.rc @@ -42,7 +42,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Komprimera...", 119 MENUITEM "Packa &upp...", 120 MENUITEM SEPARATOR - MENUITEM "&Kör...", ID_EXECUTE + MENUITEM "&Kör...", ID_RUN MENUITEM "&Skriv ut...", 102 MENUITEM "Associera...", 103 MENUITEM SEPARATOR @@ -146,21 +146,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Kör" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Kommando:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Som &symbol", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 - PUSHBUTTON "Avbryt", 2, 158, 23, 47, 14 - PUSHBUTTON "&Hjälp", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Välj mål" diff --git a/rosapps/applications/winfile/Tr.rc b/rosapps/applications/winfile/Tr.rc index 8735264ceb8..48d5063600b 100644 --- a/rosapps/applications/winfile/Tr.rc +++ b/rosapps/applications/winfile/Tr.rc @@ -39,7 +39,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "S&ýkýþtýr...", 119 MENUITEM "Geni&þlet...", 120 MENUITEM SEPARATOR - MENUITEM "&Çalýþtýr...", ID_EXECUTE + MENUITEM "&Çalýþtýr...", ID_RUN MENUITEM "Ya&zdýr...", 102 MENUITEM "Ýliþkilendir...", 103 MENUITEM SEPARATOR @@ -144,21 +144,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Çalýþtýr" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Komut:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "&Simge Olarak", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "Tamam", 1, 158, 6, 47, 14 - PUSHBUTTON "Ýptal", 2, 158, 23, 47, 14 - PUSHBUTTON "&Yardým", 254, 158, 43, 47, 14 -} - IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Hedefi seç" diff --git a/rosapps/applications/winfile/Uk.rc b/rosapps/applications/winfile/Uk.rc new file mode 100644 index 00000000000..168894ace96 --- /dev/null +++ b/rosapps/applications/winfile/Uk.rc @@ -0,0 +1,251 @@ +/* + * WineFile + * Ukrainian Language Support + * + * Copyright 2000 Martin Fuchs + * Copyright 2002 Steven Edwards + * Copyright 2002 Alexandre Julliard + * Copyright 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +/* Menu */ + +IDM_WINEFILE MENU FIXED IMPURE +{ + POPUP "&Файл" { + MENUITEM "&Відкрити\tEnter", ID_ACTIVATE + MENUITEM "&ПереміÑтити...\tF7", ID_FILE_MOVE + MENUITEM "&Копіювати...\tF8", ID_FILE_COPY + MENUITEM "Ð’ &буфер обміну...\tF9", 118 + MENUITEM "Вида&лити\tDel", ID_FILE_DELETE + MENUITEM "Пере&йменувати...", 109 + MENUITEM "ВлаÑтивоÑ&ті...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "Запак&увати...", 119 + MENUITEM "Р&озпакувати...", 120 + MENUITEM SEPARATOR + MENUITEM "&ЗапуÑтити...", ID_RUN + MENUITEM "&Друк...", 102 + MENUITEM "ÐÑоціювати...", 103 + MENUITEM SEPARATOR + MENUITEM "Створити директорі&ÑŽ...", 111 + MENUITEM "По&шук...", 104 + MENUITEM "Виділити &файли...", 116 + MENUITEM SEPARATOR +#ifndef _NO_EXTENSIONS + MENUITEM "Ви&хід\tAlt+X", ID_FILE_EXIT +#else + MENUITEM "Ви&хід", ID_FILE_EXIT +#endif + } + + POPUP "&ДиÑк" { + MENUITEM "&Копіювати диÑк...", 201 + MENUITEM "&Мітка тому...", 202 + MENUITEM SEPARATOR + MENUITEM "&Форматувати диÑк...", ID_FORMAT_DISK +#ifdef _WIN95 + MENUITEM "&Створити ÑиÑтемний диÑк...", -1 /*TODO*/ +#endif + MENUITEM SEPARATOR + MENUITEM "Підключити &мережний диÑк", ID_CONNECT_NETWORK_DRIVE + MENUITEM "&Відключити мережний диÑк", ID_DISCONNECT_NETWORK_DRIVE + MENUITEM SEPARATOR + MENUITEM "Зробити Ñпільним Ñк...", 254 + MENUITEM "&Закрити Ñпільний доÑтуп...", 255 + MENUITEM SEPARATOR + MENUITEM "Ви&брати диÑк...", 251 + } + + POPUP "Ди&ректорії" { + MENUITEM "&ÐаÑтупний рівень\t+", 301 + MENUITEM "Розгорнути &дерево\t*", 302 + MENUITEM "Розгорнути &вÑе\tStrg+*", 303 + MENUITEM "Згорнути д&ерево\t-", 304 + MENUITEM SEPARATOR + MENUITEM "&Mark Children", 505 + } + + POPUP "&ВиглÑд" { + MENUITEM "Дере&во Ñ– директоріÑ", 413 + MENUITEM "Лише д&ерево", 411 + MENUITEM "Лише д&иректоріÑ", 412 + MENUITEM SEPARATOR + MENUITEM "Роз&бити", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Ім'Ñ", ID_VIEW_NAME + MENUITEM "Ð’ÑÑ– дані про фай&л", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "&ЧаÑткові дані...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "&Сортувати за ім'Ñм", ID_VIEW_SORT_NAME + MENUITEM "Сортувати за &типом", ID_VIEW_SORT_TYPE + MENUITEM "Сортувати за ро&зміром", ID_VIEW_SORT_SIZE + MENUITEM "Сортувати за &датою", ID_VIEW_SORT_DATE + MENUITEM SEPARATOR + MENUITEM "Сортувати за &...", ID_VIEW_FILTER + } + + POPUP "&ÐалаштуваннÑ" { + MENUITEM "&ПідтвердженнÑ...", 501 + MENUITEM "&Шрифт...", ID_SELECT_FONT + MENUITEM "Customize Tool&bar...", 512 + MENUITEM SEPARATOR + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "Панель &диÑків", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&РÑдок Ñтану", ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "Ð’&еÑÑŒ екран\tCtrl+Shift+S", ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "&Minimize on run", 504 + MENUITEM "&Зберегти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ виходом", ID_VIEW_SAVESETTINGS + } + + + POPUP "&Безпека" { + MENUITEM "&ДоÑтуп...", 605 + MENUITEM "&Logging...", 606 + MENUITEM "&ВлаÑник...", 607 + } + + POPUP "Ð’Ñ–&кно" { + MENUITEM "Ðове &Вікно", ID_WINDOW_NEW + MENUITEM "Вікна каÑкадом\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tCtrl+F4", ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "ВпорÑдкувати автоматично", ID_WINDOW_AUTOSORT +#endif + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + MENUITEM "&Оновити\tF5", ID_REFRESH + } + + POPUP "Довідк&а" { + MENUITEM "&Розділи довідки\tF1", ID_HELP + MENUITEM "По&шук...\tF1", ID_HELP + MENUITEM "&КориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¾ÑŽ\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "&Про Winefile...", ID_ABOUT + } +} + +IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Виберіть шлÑÑ… призначеннÑ" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "&ШлÑÑ…:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 + PUSHBUTTON "СкаÑувати", 2, 158, 23, 47, 14 + PUSHBUTTON "&ОглÑд", 254, 158, 43, 47, 14 +} + +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "За типом файлів" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Ім'Ñ:",-1,7,8,22,10 + EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL + GROUPBOX "Тип файлу",-1,7,23,87,56 + CONTROL "&Директорії",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Програми",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "Доку&менти",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "Інші &файли",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "Показати приховані/&СиÑтемні файли",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 + DEFPUSHBUTTON "OK",IDOK,104,7,50,14 + PUSHBUTTON "СкаÑувати",IDCANCEL,104,24,50,14 +END + +IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ВлаÑтивоÑті Ð´Ð»Ñ %s" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,191,7,50,14 + PUSHBUTTON "СкаÑувати",IDCANCEL,191,29,50,14 + LTEXT "Ім'Ñ &файлу:",-1,7,7,59,9 + EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Повний &шлÑÑ…:",-1,7,18,59,9 + EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "ОÑтанні зміни:",-1,7,29,59,9 + EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "ВерÑÑ–Ñ:",-1,7,40,59,9 + EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Cop&yright:",-1,7,51,59,9 + EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Розмір:",-1,7,62,59,9 + EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + GROUPBOX "Ðтрибути",-1,7,79,158,46 + CONTROL "&Лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "Пр&ихований",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "&Ðрхів",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 + CONTROL "&СиÑемний",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "С&тиÑнутий",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "Дані про ве&Ñ€ÑÑ–ÑŽ",-1,7,129,234,79 + LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL +END + + +STRINGTABLE +{ + IDS_FONT_SEL_DLG_NAME "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² шрифта" + IDS_FONT_SEL_ERROR "Помилка при виборі нового шрифта." +} + +STRINGTABLE +{ + IDS_WINEFILE "Wine File Manager" + IDS_ERROR "Помилка" + IDS_ROOT_FS "root fs" + IDS_UNIXFS "unixfs" + IDS_DESKTOP "Робочий Ñтіл" + IDS_SHELL "Shell" + IDS_TITLEFMT "%s - %s" + IDS_NO_IMPL "Ще не реалізовано" + IDS_WINE_FILE "Wine File" +} + +STRINGTABLE +{ + IDS_COL_NAME "Ім'Ñ" + IDS_COL_SIZE "Розмір" + IDS_COL_CDATE "CDate" + IDS_COL_ADATE "ADate" + IDS_COL_MDATE "MDate" + IDS_COL_IDX "Index/Inode" + IDS_COL_LINKS "ПоÑиланнÑ" + IDS_COL_ATTR "Ðтрибути" + IDS_COL_SEC "Безпека" + + IDS_FREE_SPACE_FMT "%s з %s вільно" +} diff --git a/rosapps/applications/winfile/Zh.rc b/rosapps/applications/winfile/Zh.rc index aac35a67420..eca51fad7c7 100644 --- a/rosapps/applications/winfile/Zh.rc +++ b/rosapps/applications/winfile/Zh.rc @@ -1,4 +1,4 @@ -/* +/* * WineFile * Simplified and Traditional Chinese Language Support * @@ -43,7 +43,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "压缩(&O)...", 119 MENUITEM "解压缩(&O)...", 120 MENUITEM SEPARATOR - MENUITEM "è¿è¡Œ(&R)...", ID_EXECUTE + MENUITEM "è¿è¡Œ(&R)...", ID_RUN MENUITEM "打å°(&P)...", 102 MENUITEM "é…置文件相关...", 103 MENUITEM SEPARATOR @@ -148,21 +148,6 @@ IDM_WINEFILE MENU FIXED IMPURE } } - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "è¿è¡Œ" -FONT 9, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "命令(&C):", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "作为连接(&S)", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "确定", 1, 158, 6, 47, 14 - PUSHBUTTON "å–æ¶ˆ", 2, 158, 23, 47, 14 - PUSHBUTTON "帮助(&H)", 254, 158, 43, 47, 14 -} - LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL /* Menu */ @@ -181,7 +166,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "壓縮(&O)...", 119 MENUITEM "解壓縮(&O)...", 120 MENUITEM SEPARATOR - MENUITEM "執行(&R)...", ID_EXECUTE + MENUITEM "執行(&R)...", ID_RUN MENUITEM "列å°(&P)...", 102 MENUITEM "é…置檔案相關...", 103 MENUITEM SEPARATOR @@ -285,19 +270,4 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&關於 Winefile...", ID_ABOUT } } - - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "執行" -FONT 9, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "指令(&C):", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "作為連接(&S)", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "確定", 1, 158, 6, 47, 14 - PUSHBUTTON "å–æ¶ˆ", 2, 158, 23, 47, 14 - PUSHBUTTON "幫助(&H)", 254, 158, 43, 47, 14 -} #pragma code_page(default) diff --git a/rosapps/applications/winfile/resource.h b/rosapps/applications/winfile/resource.h index 7c14871d31c..004a8e80a14 100644 --- a/rosapps/applications/winfile/resource.h +++ b/rosapps/applications/winfile/resource.h @@ -35,7 +35,6 @@ /* dialogs */ -#define IDD_EXECUTE 103 #define IDD_SELECT_DESTINATION 104 #define IDD_DIALOG_VIEW_TYPE 105 #define IDD_DIALOG_PROPERTIES 106 @@ -44,7 +43,7 @@ /* control ids */ #define ID_ACTIVATE 101 -#define ID_EXECUTE 105 +#define ID_RUN 105 #define ID_FILE_MOVE 106 #define ID_FILE_COPY 107 #define ID_FILE_DELETE 108 diff --git a/rosapps/applications/winfile/rsrc.rc b/rosapps/applications/winfile/rsrc.rc index 359b659641e..f6ddfcdc5ec 100644 --- a/rosapps/applications/winfile/rsrc.rc +++ b/rosapps/applications/winfile/rsrc.rc @@ -71,4 +71,5 @@ IDB_IMAGES BITMAP DISCARDABLE images.bmp #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Uk.rc" #include "Zh.rc" diff --git a/rosapps/applications/winfile/winefile.c b/rosapps/applications/winfile/winefile.c index 856430d6683..b63144ce7e0 100644 --- a/rosapps/applications/winfile/winefile.c +++ b/rosapps/applications/winfile/winefile.c @@ -1688,38 +1688,18 @@ static HWND create_child_window(ChildWnd* child) return child->hwnd; } +#define RFF_NODEFAULT 0x02 /* No default item selected. */ -struct ExecuteDialog { - WCHAR cmd[MAX_PATH]; - int cmdshow; -}; - -static INT_PTR CALLBACK ExecuteDialogDlgProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +static void WineFile_OnRun( HWND hwnd ) { - static struct ExecuteDialog* dlg; + static const WCHAR shell32_dll[] = {'S','H','E','L','L','3','2','.','D','L','L',0}; + void (WINAPI *pRunFileDlgAW )(HWND, HICON, LPWSTR, LPWSTR, LPWSTR, DWORD); + HMODULE hshell = GetModuleHandleW( shell32_dll ); - switch(nmsg) { - case WM_INITDIALOG: - dlg = (struct ExecuteDialog*) lparam; - return 1; - - case WM_COMMAND: { - int id = (int)wparam; - - if (id == IDOK) { - GetWindowTextW(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH); - dlg->cmdshow = get_check(hwnd,214) ? SW_SHOWMINIMIZED : SW_SHOWNORMAL; - EndDialog(hwnd, id); - } else if (id == IDCANCEL) - EndDialog(hwnd, id); - - return 1;} - } - - return 0; + pRunFileDlgAW = (void*)GetProcAddress(hshell, (LPCSTR)61); + if (pRunFileDlgAW) pRunFileDlgAW( hwnd, 0, NULL, NULL, NULL, RFF_NODEFAULT); } - static INT_PTR CALLBACK DestinationDlgProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) { WCHAR b1[BUFFER_LEN], b2[BUFFER_LEN]; @@ -2268,18 +2248,9 @@ static LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM Globals.saveSettings ? MF_CHECKED : MF_UNCHECKED ); break; - case ID_EXECUTE: { - struct ExecuteDialog dlg; - - memset(&dlg, 0, sizeof(struct ExecuteDialog)); - - if (DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_EXECUTE), hwnd, ExecuteDialogDlgProc, (LPARAM)&dlg) == IDOK) { - HINSTANCE hinst = ShellExecuteW(hwnd, NULL/*operation*/, dlg.cmd/*file*/, NULL/*parameters*/, NULL/*dir*/, dlg.cmdshow); - - if (PtrToUlong(hinst) <= 32) - display_error(hwnd, GetLastError()); - } - break;} + case ID_RUN: + WineFile_OnRun( hwnd ); + break; case ID_CONNECT_NETWORK_DRIVE: { DWORD ret = WNetConnectionDialog(hwnd, RESOURCETYPE_DISK); From 61cfcb1f2460e4ea1769431d80f6518e0d9269a4 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Mon, 8 Feb 2010 16:38:41 +0000 Subject: [PATCH 22/97] Fix build breakage svn path=/trunk/; revision=45500 --- rosapps/applications/winfile/Zh.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosapps/applications/winfile/Zh.rc b/rosapps/applications/winfile/Zh.rc index eca51fad7c7..12cc6a8a3c4 100644 --- a/rosapps/applications/winfile/Zh.rc +++ b/rosapps/applications/winfile/Zh.rc @@ -1,4 +1,4 @@ -/* +/* * WineFile * Simplified and Traditional Chinese Language Support * From 016d82736ced87f7d9cd480cde518550fb194d59 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Mon, 8 Feb 2010 19:35:26 +0000 Subject: [PATCH 23/97] Giant German Language Fix Patch by "tux." I skipped xcopy, winhlp32 and wordpad because they are wine synched and expand, because its not translated anymore. Fix some BOMs i did not see at wine synching. svn path=/trunk/; revision=45501 --- reactos/base/applications/calc/lang/de-DE.rc | 42 ++-- .../applications/cmdutils/doskey/doskey.rc | 1 + .../cmdutils/doskey/lang/de-DE.rc | 28 +++ .../cmdutils/doskey/lang/en-US.rc | 2 +- reactos/base/applications/cmdutils/reg/De.rc | 2 +- .../base/applications/cmdutils/xcopy/It.rc | 2 +- .../base/applications/cmdutils/xcopy/Uk.rc | 2 +- .../applications/downloader/lang/de-DE.rc | 14 +- .../base/applications/dxdiag/lang/de-DE.rc | 28 +-- .../base/applications/fontview/lang/de-DE.rc | 2 +- .../games/solitaire/lang/de-DE.rc | 2 +- .../applications/games/spider/lang/de-DE.rc | 2 +- .../applications/games/winemine/lang/de-DE.rc | 2 +- .../base/applications/mplay32/lang/de-DE.rc | 4 +- .../base/applications/msconfig/lang/de-DE.rc | 4 +- .../mscutils/devmgmt/lang/de-DE.rc | 2 +- .../mscutils/servman/lang/de-DE.rc | 2 +- reactos/base/applications/mstsc/lang/de-DE.rc | 10 +- .../network/ipconfig/lang/de-DE.rc | 18 +- .../base/applications/notepad/lang/de-DE.rc | 6 +- reactos/base/applications/paint/lang/de-DE.rc | 2 +- reactos/base/applications/rapps/lang/de-DE.rc | 38 +-- .../base/applications/regedit/lang/de-DE.rc | 28 +-- .../screensavers/3dtext/lang/de-DE.rc | 4 +- .../screensavers/logon/lang/de-DE.rc | 2 +- .../base/applications/sndvol32/lang/de-DE.rc | 2 +- .../base/applications/taskmgr/lang/de-DE.rc | 8 +- reactos/base/applications/wordpad/It.rc | 2 +- reactos/base/applications/wordpad/Uk.rc | 2 +- reactos/base/applications/wordpad/rsrc.rc | 2 +- reactos/base/applications/write/Uk.rc | 2 +- reactos/base/setup/reactos/lang/de-DE.rc | 28 +-- reactos/base/setup/usetup/lang/de-DE.h | 156 ++++++------ reactos/base/setup/vmwinst/lang/de-DE.rc | 62 ++--- reactos/base/setup/welcome/lang/de-DE.rc | 2 +- reactos/base/shell/cmd/lang/de-DE.rc | 112 ++++----- reactos/base/shell/explorer-new/lang/de-DE.rc | 70 +++--- reactos/base/shell/explorer/explorer-de.rc | 40 ++-- reactos/base/system/format/lang/de-DE.rc | 12 +- reactos/base/system/regsvr32/lang/de-DE.rc | 8 +- reactos/base/system/runonce/lang/de-DE.rc | 11 + reactos/base/system/runonce/rsrc.rc | 1 + reactos/base/system/winlogon/lang/de-DE.rc | 10 +- reactos/dll/cpl/access/lang/de-DE.rc | 30 +-- reactos/dll/cpl/appwiz/lang/de-DE.rc | 2 +- reactos/dll/cpl/console/lang/de-DE.rc | 8 +- reactos/dll/cpl/desk/lang/de-DE.rc | 6 +- reactos/dll/cpl/hdwwiz/lang/de-DE.rc | 52 ++-- reactos/dll/cpl/input/lang/de-DE.rc | 30 +-- reactos/dll/cpl/intl/lang/de-DE.rc | 14 +- reactos/dll/cpl/joy/lang/de-DE.rc | 24 +- reactos/dll/cpl/liccpa/lang/de-DE.rc | 10 +- reactos/dll/cpl/main/lang/de-DE.rc | 4 +- reactos/dll/cpl/mmsys/lang/de-DE.rc | 44 ++-- reactos/dll/cpl/powercfg/lang/de-DE.rc | 10 +- reactos/dll/cpl/sysdm/lang/de-DE.rc | 38 +-- reactos/dll/cpl/timedate/lang/de-DE.rc | 4 +- reactos/dll/cpl/usrmgr/lang/de-DE.rc | 223 ++++++++++++++++++ reactos/dll/cpl/usrmgr/rsrc.rc | 1 + reactos/dll/shellext/deskadp/lang/de-DE.rc | 4 +- reactos/dll/shellext/deskmon/lang/de-DE.rc | 2 +- reactos/dll/win32/devmgr/lang/de-DE.rc | 20 +- reactos/dll/win32/kernel32/lang/de-DE.mc | 206 ++++++++-------- reactos/dll/win32/modemui/lang/de-DE.rc | 20 +- reactos/dll/win32/msgina/lang/de-DE.rc | 2 +- reactos/dll/win32/netcfgx/lang/de-DE.rc | 8 +- reactos/dll/win32/netid/lang/de-DE.rc | 6 +- reactos/dll/win32/netshell/lang/de-DE.rc | 22 +- reactos/dll/win32/newdev/lang/de-DE.rc | 2 +- reactos/dll/win32/rasdlg/lang/de-DE.rc | 80 +++---- reactos/dll/win32/serialui/lang/de-DE.rc | 2 +- reactos/dll/win32/setupapi/lang/de-DE.rc | 4 +- reactos/dll/win32/shdoclc/De.rc | 4 +- reactos/dll/win32/shell32/lang/de-DE.rc | 6 +- reactos/dll/win32/shimgvw/lang/de-DE.rc | 8 +- reactos/dll/win32/syssetup/lang/de-DE.rc | 74 +++--- reactos/dll/win32/tapiui/lang/de-DE.rc | 8 +- reactos/dll/win32/user32/lang/de-DE.rc | 2 +- 78 files changed, 1012 insertions(+), 747 deletions(-) create mode 100644 reactos/base/applications/cmdutils/doskey/lang/de-DE.rc create mode 100644 reactos/base/system/runonce/lang/de-DE.rc create mode 100644 reactos/dll/cpl/usrmgr/lang/de-DE.rc diff --git a/reactos/base/applications/calc/lang/de-DE.rc b/reactos/base/applications/calc/lang/de-DE.rc index ba28b004ccb..f6513aa6dfe 100644 --- a/reactos/base/applications/calc/lang/de-DE.rc +++ b/reactos/base/applications/calc/lang/de-DE.rc @@ -324,7 +324,7 @@ END IDD_DIALOG_STAT DIALOGEX DISCARDABLE 0, 0, 163, 85 STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Statistik Box" +CAPTION "Statistikbox" FONT 8, "MS Shell Dlg" BEGIN LISTBOX IDC_LIST_STAT,4,4,156,40,LBS_NOINTEGRALHEIGHT | @@ -465,11 +465,11 @@ END // FLÄCHENTYPEN STRINGTABLE DISCARDABLE BEGIN - IDS_AREA_ACRES "Acres" - IDS_AREA_ACRES_BRAZIL "Acres (Brasilien)" - IDS_AREA_ACRES_FRANCE "Acres (Frankreich)" - IDS_AREA_ACRES_SCOTS "Acres (Schottland)" - IDS_AREA_ACRES_US "Acres (USA)" + IDS_AREA_ACRES "Acre" + IDS_AREA_ACRES_BRAZIL "Acre (Brasilien)" + IDS_AREA_ACRES_FRANCE "Acre (Frankreich)" + IDS_AREA_ACRES_SCOTS "Acre (Schottland)" + IDS_AREA_ACRES_US "Acre (USA)" IDS_AREA_ARES "Ar" IDS_AREA_CHOU "Chou" IDS_AREA_DANBO "Danbo" @@ -482,21 +482,21 @@ BEGIN IDS_AREA_PYEONGBANGJA "Pyeongbangja" IDS_AREA_RAI "Rai" IDS_AREA_SE "Se" - IDS_AREA_SQUARE_CHR "Qaudratchr" - IDS_AREA_SQUARE_FATHOMS "Qaudratfathom" - IDS_AREA_SQUARE_FATHOMS_HUNGARY "Qaudratfathom (Ungarn)" - IDS_AREA_SQUARE_FEET "Qaudratfuß" - IDS_AREA_SQUARE_KILOMETERS "Qaudratkilometer" - IDS_AREA_SQUARE_LAR "Qaudratlar" - IDS_AREA_SQUARE_METER "Qaudratmeter" - IDS_AREA_SQUARE_MILES "Qaudratmeilen" - IDS_AREA_SQUARE_MILLIMETERS "Qaudratmillimeter" - IDS_AREA_SQUARE_SHAKU "Qaudratshaku" - IDS_AREA_SQUARE_TSUEN "Qaudrattsuen" - IDS_AREA_SQUARE_VA "Qaudratva" - IDS_AREA_SQUARE_YARD "Qaudratyard" + IDS_AREA_SQUARE_CHR "Quadratchr" + IDS_AREA_SQUARE_FATHOMS "Quadratfathom" + IDS_AREA_SQUARE_FATHOMS_HUNGARY "Quadratfathom (Ungarn)" + IDS_AREA_SQUARE_FEET "Quadratfuß" + IDS_AREA_SQUARE_KILOMETERS "Quadratkilometer" + IDS_AREA_SQUARE_LAR "Quadratlar" + IDS_AREA_SQUARE_METER "Quadratmeter" + IDS_AREA_SQUARE_MILES "Quadratmeilen" + IDS_AREA_SQUARE_MILLIMETERS "Quadratmillimeter" + IDS_AREA_SQUARE_SHAKU "Quadratshaku" + IDS_AREA_SQUARE_TSUEN "Quadrattsuen" + IDS_AREA_SQUARE_VA "Quadratva" + IDS_AREA_SQUARE_YARD "Quadratyard" IDS_AREA_SQUARE_CENTIMETERS "Quadratzentimeter" - IDS_AREA_SQUARE_INCHES "Qaudratzoll" + IDS_AREA_SQUARE_INCHES "Quadratzoll" IDS_AREA_TAN "Tan" IDS_AREA_TSUBO "Tsubo" END @@ -517,7 +517,7 @@ BEGIN IDS_CURRENCY_DEUTSCHE_MARK "Deutsche Mark" IDS_CURRENCY_EURO "Euro" IDS_CURRENCY_FINNISH_MARKKA "Finnische Mark" - IDS_CURRENCY_FRENCH_FRANC "Französchishe Franc" + IDS_CURRENCY_FRENCH_FRANC "Französchische Franc" IDS_CURRENCY_GREEK_DRACHMA "Griechische Drachme" IDS_CURRENCY_IRISH_POUND "Irische Pfund" IDS_CURRENCY_ITALIAN_LIRA "Italienische Lire" diff --git a/reactos/base/applications/cmdutils/doskey/doskey.rc b/reactos/base/applications/cmdutils/doskey/doskey.rc index 780ea6ebee2..53772107152 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.rc +++ b/reactos/base/applications/cmdutils/doskey/doskey.rc @@ -7,5 +7,6 @@ #include "doskey.h" #include "lang/bg-BG.rc" +#include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc b/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc new file mode 100644 index 00000000000..fc73d5dc365 --- /dev/null +++ b/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc @@ -0,0 +1,28 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Verwaltet Einstellungen, Verlauf und Makros der Kommandozeile.\n\ +\n\ +DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ + [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ +\n\ + /INSERT Aktiviert den Einfügemodus.\n\ + /OVERSTRIKE Deaktiviert den Einfügemodus.\n\ + /EXENAME=exename Legt den Namen der Anwendung, auf die die Einstel-\n\ + lungen angewendet werden sollen, fest. Der Standard-\n\ + wert ist cmd.exe.\n\ + /HISTORY Zeigt den Befehlsverlauf an.\n\ + /LISTSIZE=size Legt die Anzahl der Befehle per Verlaufspuffer fest.\n\ + /REINSTALL Leert den Befehlsverlauf.\n\ + /MACROS Zeigt Makrodefinitionen an.\n\ + /MACROS:exename Zeigt Makrodefinitionen für eine Anwendung an.\n\ + /MACROS:ALL Zeigt Makrodefinitionen für alle Anwendungen an.\n\ + /MACROFILE=file Lädt Makrodefinitionen aus einer Datei.\n\ + macroname Legt den Namen eines zu erstellenden Makros fest.\n\ + text Legt den ersetzenden Text des Makros fest.\n" + +IDS_INVALID_MACRO_DEF, "Ungültige Makrodefinition: %s\n" + +END diff --git a/reactos/base/applications/cmdutils/doskey/lang/en-US.rc b/reactos/base/applications/cmdutils/doskey/lang/en-US.rc index 1b7028681c6..7adc23750d0 100644 --- a/reactos/base/applications/cmdutils/doskey/lang/en-US.rc +++ b/reactos/base/applications/cmdutils/doskey/lang/en-US.rc @@ -18,7 +18,7 @@ DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ /MACROS Displays macro definitions.\n\ /MACROS:exename Displays macro definitions for a specific program.\n\ /MACROS:ALL Displays macro definitions for all programs.\n\ - /MACROFILE=filename Loads macro definitions from a file.\n\ + /MACROFILE=file Loads macro definitions from a file.\n\ macroname Specifies the name of a macro to create.\n\ text Specifies the replacement text for the macro.\n" diff --git a/reactos/base/applications/cmdutils/reg/De.rc b/reactos/base/applications/cmdutils/reg/De.rc index 0940640306c..504359d67a6 100644 --- a/reactos/base/applications/cmdutils/reg/De.rc +++ b/reactos/base/applications/cmdutils/reg/De.rc @@ -35,6 +35,6 @@ STRINGTABLE STRING_SUCCESS, "Der Vorgang wurde erfolgreich abgeschlossen\n" STRING_INVALID_KEY, "Fehler: Ungültiger Schlüssel\n" STRING_INVALID_CMDLINE, "Fehler: Ungültige Befehlszeilenargumente\n" - STRING_NO_REMOTE, "Fehler: Konnte Schlüssel nicht zum remote Rechner hinzufügen\n" + STRING_NO_REMOTE, "Fehler: Konnte Schlüssel nicht zum entfernten Rechner hinzufügen\n" STRING_CANNOT_FIND, "Fehler: Der angegebene Schlüssel oder Wert konnte nicht gefunden werden\n" } diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc index 806bcea53b5..84ca52ca911 100644 --- a/reactos/base/applications/cmdutils/xcopy/It.rc +++ b/reactos/base/applications/cmdutils/xcopy/It.rc @@ -1,4 +1,4 @@ -/* +/* * XCOPY - Wine-compatible xcopy program * Italian language support * diff --git a/reactos/base/applications/cmdutils/xcopy/Uk.rc b/reactos/base/applications/cmdutils/xcopy/Uk.rc index a618346374c..d25e6483dcf 100644 --- a/reactos/base/applications/cmdutils/xcopy/Uk.rc +++ b/reactos/base/applications/cmdutils/xcopy/Uk.rc @@ -1,4 +1,4 @@ -/* +/* * XCOPY - Wine-compatible xcopy program * Ukrainian language support * diff --git a/reactos/base/applications/downloader/lang/de-DE.rc b/reactos/base/applications/downloader/lang/de-DE.rc index 087a14c6325..0b29796491c 100644 --- a/reactos/base/applications/downloader/lang/de-DE.rc +++ b/reactos/base/applications/downloader/lang/de-DE.rc @@ -15,11 +15,11 @@ STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Download Ordner:", -1, 6, 10, 140, 8 + LTEXT "Downloadordner:", -1, 6, 10, 140, 8 EDITTEXT IDC_DOWNLOAD_FOLDER_EDIT, 6, 20, 205, 14, WS_VISIBLE | WS_TABSTOP PUSHBUTTON "W&ähle...", IDC_CHOOSE_BUTTON, 216, 20, 45, 14 AUTOCHECKBOX "&Installationsdateien nach dem Setup löschen", IDC_DELINST_FILES_CHECKBOX, 8, 40, 210, 10, WS_GROUP - LTEXT "Update Server:", -1, 6, 55, 140, 8 + LTEXT "Updateserver:", -1, 6, 55, 140, 8 EDITTEXT IDC_UPDATE_SERVER_EDIT, 6, 65, 255, 14, WS_VISIBLE | WS_TABSTOP DEFPUSHBUTTON "&OK", IDOK, 147, 90, 54, 15 PUSHBUTTON "&Abbrechen", IDCANCEL, 207, 90, 54, 15 @@ -31,7 +31,7 @@ BEGIN IDS_WELCOME_TITLE "Willkommen im ReactOS Downloader" IDS_WELCOME "Bitte wählen Sie links eine Kategorie. Dies ist Version 1.1." IDS_NO_APP_TITLE "Keine Anwendung ausgewählt" - IDS_NO_APP "Bitte wählen Sie eine Anwendung, bevor Sie die Download-Schaltfläche betätigen. Wenn Sie Hilfe benötigen, drücken Sie die Hilfe-Schaltfläche in der oberen rechten Ecke." + IDS_NO_APP "Bitte wählen Sie eine Anwendung aus, bevor Sie die Download-Schaltfläche betätigen. Wenn Sie Hilfe benötigen, drücken Sie die Hilfe-Schaltfläche in der oberen rechten Ecke." IDS_UPDATE_TITLE "Update" IDS_UPDATE "Diese Funktion wurde noch nicht implementiert." IDS_HELP_TITLE "Hilfe" @@ -41,20 +41,20 @@ BEGIN IDS_CHOOSE_SUB "Bitte wählen Sie eine Unterkategorie." IDS_CHOOSE_CATEGORY "Bitte wählen Sie eine Kategorie." IDS_CHOOSE_BOTH "Bitte wählen Sie eine Unterkategorie oder eine Anwendung." - IDS_XMLERROR_1 "XML Datei nicht gefunden!" - IDS_XMLERROR_2 "XML Datei kann nicht verarbeitet werden!" + IDS_XMLERROR_1 "XML-Datei nicht gefunden!" + IDS_XMLERROR_2 "XML-Datei kann nicht verarbeitet werden!" IDS_DOWNLOAD_ERROR "Die Datei konnte nicht heruntergeladen werden.\nBitte prüfen sie, ob eine Verbindung zum Internet besteht." IDS_VERSION "Version: " IDS_LICENCE "Lizenz: " IDS_MAINTAINER "Maintainer: " IDS_APPS_TITLE "Anwendungen" IDS_CATS_TITLE "Kategorien" - IDS_CHOOSE_FOLDER "Bitte wählen Sie den Ordner..." + IDS_CHOOSE_FOLDER "Bitte wählen Sie den Ordner aus..." IDS_NOTCREATE_REGKEY "Registryschlüssel könnte nicht erstellt werden." IDS_DOWNLOAD_FOLDER "Downloader" IDS_UNABLECREATE_FOLDER "Es konnte kein Ordner mit diesem Namen erstellt werden!" IDS_UPDATE_URL "http://svn.reactos.org" - IDS_INSTALL_DEP "%s wird benötigt um %s ausführen zu können. Soll %s jetzt installiert werden?" + IDS_INSTALL_DEP "%s wird benötigt, um %s ausführen zu können. Soll %s jetzt installiert werden?" TTT_HELPBUTTON "Hilfe über den Downloader" TTT_UPDATEBUTTON "Noch nicht vorhanden" TTT_PROFBUTTON "Konfiguriert den Downloader" diff --git a/reactos/base/applications/dxdiag/lang/de-DE.rc b/reactos/base/applications/dxdiag/lang/de-DE.rc index 8a572b65576..e79530d5bed 100644 --- a/reactos/base/applications/dxdiag/lang/de-DE.rc +++ b/reactos/base/applications/dxdiag/lang/de-DE.rc @@ -148,9 +148,9 @@ IDD_INPUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "DirectInput Geräte", -1, 10, 10, 452, 80 + GROUPBOX "DirectInput-Geräte", -1, 10, 10, 452, 80 CONTROL "", IDC_LIST_DEVICE, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 - GROUPBOX "Eingabebezogene Geräte", -1, 10, 100, 452, 60 + GROUPBOX "Eingabegeräte", -1, 10, 100, 452, 60 CONTROL "", IDC_TREE_PORT, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 112, 432, 40, 0x00000200 GROUPBOX "Hinweis", -1, 10, 170, 452, 50 EDITTEXT IDC_RICH_INFO, 20, 182, 432, 30, WS_DISABLED | WS_TABSTOP @@ -172,7 +172,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_MAIN_DIALOG "ReactX Diagnoseprogramm" + IDS_MAIN_DIALOG "ReactX-Diagnoseprogramm" IDS_SYSTEM_DIALOG "System" IDS_DISPLAY_DIALOG "Anzeige" IDS_SOUND_DIALOG "Sound" @@ -193,7 +193,7 @@ BEGIN IDS_DEVICE_CONTROLLER "Controllererkennung" IDS_DEVICE_MANUFACTURER "Herstellererkennung" IDS_DEVICE_PRODUCT "Produkterkennung" - IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Treiber" + IDS_DEVICE_FORCEFEEDBACK "Force-Feedback-Treiber" IDS_NOT_APPLICABLE "Nicht zutreffend" IDS_OPTION_YES "Ja" IDS_DIRECTPLAY_COL_NAME1 "Name" @@ -204,20 +204,20 @@ BEGIN IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 serieller Dienstanbieter" IDS_DIRECTPLAY8_IPXSP "DirectPlay8-IPX-Dienstanbieter" IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP-Dienstanbieter" - IDS_DIRECTPLAY_TCPCONN "TCP/IP Verbindung für DirectPlay" - IDS_DIRECTPLAY_IPXCONN "IPX Verbindung für DirectPlay" + IDS_DIRECTPLAY_TCPCONN "TCP/IP-Verbindung für DirectPlay" + IDS_DIRECTPLAY_IPXCONN "IPX-Verbindung für DirectPlay" IDS_DIRECTPLAY_MODEMCONN "Modemverbindung für DirectPlay" IDS_DIRECTPLAY_SERIALCONN "Serielle Verbindung für DirectPlay" IDS_REG_SUCCESS "OK" IDS_REG_FAIL "Fehler" - IDS_DDTEST_ERROR "Test failed!" - IDS_DDTEST_DESCRIPTION "This will start DirecDraw interface test. Continue?" - IDS_DDPRIMARY_DESCRIPTION "This test will use DirectDraw to draw on primary surface. Black and white rectangles should be drawn. Continue?" - IDS_DDPRIMARY_RESULT "Did you see black and white rectangles?" - IDS_DDOFFSCREEN_DESCRIPTION "This test will use DirectDraw to draw in an offscreen buffer. Moving white rectangle should be drawn. Continue?" - IDS_DDOFFSCREEN_RESULT "Did you see white moving reactangle?" - IDS_DDFULLSCREEN_DESCRIPTION "This test will use DirectDraw to draw in a fullscreen mode. Moving white rectangle should be drawn. Continue?" - IDS_DDFULLSCREEN_RESULT "Did you see white moving reactangle in a fullscreen mode?" + IDS_DDTEST_ERROR "Test fehlgeschlagen!" + IDS_DDTEST_DESCRIPTION "Dies wird den DirectDraw-Interfacetest starten. Fortfahren?" + IDS_DDPRIMARY_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um auf Ihrem primären Bildschirm etwas darzustellen. Schwarze und weiße Rechtecke sollten zu sehen sein. Fortfahren?" + IDS_DDPRIMARY_RESULT "Haben Sie schwarze und weiße Rechtecke gesehen?" + IDS_DDOFFSCREEN_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um im Offscreen-Buffer zu zeichnen. Ein bewegtes weißes Rechteck sollte zu sehen sein. Fortfahren?" + IDS_DDOFFSCREEN_RESULT "Haben Sie das bewegte weiße Rechteck gesehen?" + IDS_DDFULLSCREEN_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um im Vollbildmodus zu zeichnen. Ein bewegtes weißes Rechteck sollte zu sehen sein. Fortfahren?" + IDS_DDFULLSCREEN_RESULT "Haben Sie das bewegte weiße Rechteck im Vollbildmodus gesehen?" IDS_FORMAT_ADAPTER_MEM "%u MB" IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u bit)(%uHz)" IDS_OPTION_NO "Nein" diff --git a/reactos/base/applications/fontview/lang/de-DE.rc b/reactos/base/applications/fontview/lang/de-DE.rc index 2197a7ffaec..28cc675ec79 100644 --- a/reactos/base/applications/fontview/lang/de-DE.rc +++ b/reactos/base/applications/fontview/lang/de-DE.rc @@ -8,7 +8,7 @@ BEGIN IDS_ERROR, "Fehler" IDS_ERROR_NOMEM, "Es steht nicht genügend Speicher zur Verfügung." IDS_ERROR_NOFONT, "Die angegebene Datei %1 ist keine gültige Schriftartendatei." - IDS_ERROR_NOCLASS, "Fehler beim initialisieren der Fensterklasse." + IDS_ERROR_NOCLASS, "Fehler beim Initialisieren der Fensterklasse." IDS_ERROR_BADCMD, "Keine Schriftartendatei angegeben.\nSyntax:\n fontview.exe " END diff --git a/reactos/base/applications/games/solitaire/lang/de-DE.rc b/reactos/base/applications/games/solitaire/lang/de-DE.rc index 5e8f44457f4..9ecc79e5c37 100644 --- a/reactos/base/applications/games/solitaire/lang/de-DE.rc +++ b/reactos/base/applications/games/solitaire/lang/de-DE.rc @@ -57,7 +57,7 @@ BEGIN IDS_SOL_NAME "Solitär" IDS_SOL_ABOUT "Solitär von J Brown\n\nCardLib version 1.0." IDS_SOL_QUIT "Laufendes Spiel beenden?" - IDS_SOL_WIN "Glückwunsch, Sie haben Gewonnen!" + IDS_SOL_WIN "Glückwunsch, Sie haben gewonnen!" IDS_SOL_DEAL "Neu geben?" END diff --git a/reactos/base/applications/games/spider/lang/de-DE.rc b/reactos/base/applications/games/spider/lang/de-DE.rc index b2bc790b06c..5b353b17263 100644 --- a/reactos/base/applications/games/spider/lang/de-DE.rc +++ b/reactos/base/applications/games/spider/lang/de-DE.rc @@ -54,7 +54,7 @@ BEGIN IDS_SPI_NAME "Spider" IDS_SPI_ABOUT "Spider Solitaire von Gregor Schneider\n\nCardLib Version 1.0" IDS_SPI_QUIT "Laufendes Spiel beenden?" - IDS_SPI_WIN "Gratulation, Sie haben gewonnen!" + IDS_SPI_WIN "Glückwunsch, Sie haben gewonnen!" IDS_SPI_DEAL "Neu geben?" END diff --git a/reactos/base/applications/games/winemine/lang/de-DE.rc b/reactos/base/applications/games/winemine/lang/de-DE.rc index 4c4e59d1457..69676c41f56 100644 --- a/reactos/base/applications/games/winemine/lang/de-DE.rc +++ b/reactos/base/applications/games/winemine/lang/de-DE.rc @@ -56,7 +56,7 @@ STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHEL CAPTION "Glückwunsch!" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Bitte geben Sie ihren Namen ein", IDIGNORE, 25, 10, 150, 10 + LTEXT "Bitte geben Sie Ihren Namen ein", IDIGNORE, 25, 10, 150, 10 EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 END diff --git a/reactos/base/applications/mplay32/lang/de-DE.rc b/reactos/base/applications/mplay32/lang/de-DE.rc index 622fdf6f10f..470413c555e 100644 --- a/reactos/base/applications/mplay32/lang/de-DE.rc +++ b/reactos/base/applications/mplay32/lang/de-DE.rc @@ -17,8 +17,8 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_ALL_TYPES_FILTER "Alle Unterstützten (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0" - IDS_TOOLTIP_PLAY "wiedergabe" + IDS_ALL_TYPES_FILTER "Alle unterstützten (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0" + IDS_TOOLTIP_PLAY "Wiedergabe" IDS_TOOLTIP_STOP "Stopp" IDS_TOOLTIP_EJECT "Auswerfen" IDS_TOOLTIP_BACKWARD "Zurück" diff --git a/reactos/base/applications/msconfig/lang/de-DE.rc b/reactos/base/applications/msconfig/lang/de-DE.rc index b7dd1ed5b9b..96cb09fd864 100644 --- a/reactos/base/applications/msconfig/lang/de-DE.rc +++ b/reactos/base/applications/msconfig/lang/de-DE.rc @@ -83,7 +83,7 @@ BEGIN PUSHBUTTON "A&ls Standard", IDC_BTN_SET_DEFAULT_BOOT, 120, 65, 63, 12 PUSHBUTTON "Nach &oben", IDC_BTN_MOVE_UP_BOOT_OPTION, 203, 65, 63, 12 PUSHBUTTON "Nach &unten", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 286, 65, 63, 12 - GROUPBOX "Boot Optionen", -1, 10, 80, 250, 90,0,WS_EX_TRANSPARENT + GROUPBOX "Bootoptionen", -1, 10, 80, 250, 90,0,WS_EX_TRANSPARENT CHECKBOX "/SA&FEBOOT", IDC_CBX_SAFE_BOOT, 15, 90, 55, 10 CHECKBOX "/&NOGUIBOOT", IDC_CBX_NO_GUI_BOOT, 15, 105, 60, 10 CHECKBOX "/&BOOTLOG", IDC_CBX_BOOT_LOG, 15, 120, 50, 10 @@ -149,7 +149,7 @@ BEGIN IDS_TOOLS_CMD_CMD "cmd.exe" IDS_TOOLS_INFO_NAME "Version" - IDS_TOOLS_INFO_DESCR "Zeigt die installierte ReactOS Version an." + IDS_TOOLS_INFO_DESCR "Zeigt die installierte ReactOS-Version an." IDS_TOOLS_INFO_CMD "winver.exe" IDS_TOOLS_REGEDIT_NAME "Registrierungs-Editor" diff --git a/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc b/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc index a3706603fcf..6e5f6fb4900 100644 --- a/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc @@ -51,7 +51,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/mscutils/servman/lang/de-DE.rc b/reactos/base/applications/mscutils/servman/lang/de-DE.rc index 7a978d1b3e0..d291a48463d 100644 --- a/reactos/base/applications/mscutils/servman/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/servman/lang/de-DE.rc @@ -193,7 +193,7 @@ BEGIN IDS_NUM_SERVICES "Anzahl der Dienste: %d" IDS_STOP_DEPENDS "When %s stops, these other services will also stop" IDS_NO_DEPENDS "" - IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/mstsc/lang/de-DE.rc b/reactos/base/applications/mstsc/lang/de-DE.rc index 15508777749..ebfae96f32e 100644 --- a/reactos/base/applications/mstsc/lang/de-DE.rc +++ b/reactos/base/applications/mstsc/lang/de-DE.rc @@ -15,18 +15,18 @@ BEGIN PUSHBUTTON "Speichern unter",IDC_SAVEAS,120,139,55,14 PUSHBUTTON "Öffnen...",IDC_OPEN,177,139,50,14 ICON "", IDC_CONNICON, 16,114,20,20 - LTEXT "Die derzeitigen Verbindungseinstellungen speichern oder vohandene Einstellungen laden.",IDC_STATIC,50,115,172,20 + LTEXT "Die derzeitigen Verbindungseinstellungen speichern oder vorhandene Einstellungen laden.",IDC_STATIC,50,115,172,20 END IDD_DISPLAY DIALOGEX 0, 0, 242, 175 STYLE DS_SHELLFONT | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Remotedesktop Größe",IDC_STATIC,7,7,228,68 + GROUPBOX "Remotedesktop-Größe",IDC_STATIC,7,7,228,68 GROUPBOX "Farben",IDC_STATIC,7,83,228,85 ICON "", IDC_REMICON, 15,19,20,20 ICON "", IDC_COLORSICON, 15,98,20,20 - LTEXT "Wählen Sie die Bildschirmgröße von Ihrem Remote- desktop. Stellen Sie den Regler für Vollbild nach rechts",IDC_STATIC,53,22,175,21 + LTEXT "Wählen Sie die Bildschirmgröße Ihres Remotedesktops. Stellen Sie den Regler für Vollbild nach rechts",IDC_STATIC,53,22,175,21 CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17 COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10 @@ -38,7 +38,7 @@ END IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 262 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Remotedesktop Verbindung" +CAPTION "Remotedesktop-Verbindung" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Verbinden",IDOK,147,245,50,14 @@ -58,6 +58,6 @@ BEGIN IDS_PIXEL "%lux%lu Pixel" IDS_FULLSCREEN "Vollbild" IDS_BROWSESERVER "" - IDS_HEADERTEXT1 "Remote Desktop" + IDS_HEADERTEXT1 "Remotedesktop" IDS_HEADERTEXT2 "Verbindung" END diff --git a/reactos/base/applications/network/ipconfig/lang/de-DE.rc b/reactos/base/applications/network/ipconfig/lang/de-DE.rc index e6d934d9db2..89c23c1bc31 100644 --- a/reactos/base/applications/network/ipconfig/lang/de-DE.rc +++ b/reactos/base/applications/network/ipconfig/lang/de-DE.rc @@ -12,12 +12,12 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_OTHER "Anderer Adapter" - IDS_ETH "Ethernet Adapter" - IDS_TOKEN "Token Ring Adapter" - IDS_FDDI "FDDI Adapter" - IDS_PPP "PPP Adapter" - IDS_LOOP "Loopback Adapter" - IDS_SLIP "SLIP Adapter" + IDS_ETH "Ethernet-Adapter" + IDS_TOKEN "Token-Ring-Adapter" + IDS_FDDI "FDDI-Adapter" + IDS_PPP "PPP-Adapter" + IDS_LOOP "Loopback-Adapter" + IDS_SLIP "SLIP-Adapter" END STRINGTABLE DISCARDABLE @@ -31,7 +31,7 @@ BEGIN \n \ wobei\n \ Adapter Verbindungsname\n \ - (wildcards * und ? sind möglich, siehe Beispiele)\n \ + (Wildcards * und ? sind möglich, siehe Beispiele)\n \ \n \ Optionen:\n \ /? Zeigt die Hilfe an.\n \ @@ -61,6 +61,6 @@ BEGIN > ipconfig /renew EL* ... Erneuert alle Verbindungen, deren Name\n \ mit EL beginnt.\n \ > ipconfig /release *Ver* ... Gibt alle passenden Verbindungen frei,\n \ - z.B. ""Lokale Vebindung 1"" oder\n \ - ""Lokale Vebindung 2""\n" + z.B. ""Lokale Verbindung 1"" oder\n \ + ""Lokale Verbindung 2""\n" END diff --git a/reactos/base/applications/notepad/lang/de-DE.rc b/reactos/base/applications/notepad/lang/de-DE.rc index 2844639f8d9..eeb89058298 100644 --- a/reactos/base/applications/notepad/lang/de-DE.rc +++ b/reactos/base/applications/notepad/lang/de-DE.rc @@ -127,7 +127,7 @@ FONT 8, "MS Shell Dlg" CAPTION "Enkodierung" BEGIN COMBOBOX ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -LTEXT "Enkodierung:",0x155,5,2,41,12 +LTEXT "Kodierung:",0x155,5,2,41,12 COMBOBOX ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Zeilenenden:",0x156,5,20,41,12 END @@ -161,7 +161,7 @@ END STRINGTABLE DISCARDABLE BEGIN - STRING_LICENSE, "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + STRING_LICENSE, "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE @@ -183,7 +183,7 @@ STRING_UNTITLED, "(unbenannt)" STRING_ALL_FILES, "Alle Dateien (*.*)" STRING_TEXT_FILES_TXT, "Textdateien (*.txt)" -STRING_TOOLARGE, "Die Datei '%s' ist zu groß für den Editor\n \ +STRING_TOOLARGE, "Die Datei '%s' ist zu groß für den Editor.\n \ Benutzen Sie bitte einen anderen Editor, um diese Datei zu bearbeiten." STRING_NOTEXT, "Sie haben keinen Text eingegeben, der \ gespeichert\n werden könnte. Geben Sie Text ein, und versuchen Sie es \ diff --git a/reactos/base/applications/paint/lang/de-DE.rc b/reactos/base/applications/paint/lang/de-DE.rc index d4a31e475b1..7c56d03cb51 100644 --- a/reactos/base/applications/paint/lang/de-DE.rc +++ b/reactos/base/applications/paint/lang/de-DE.rc @@ -193,7 +193,7 @@ BEGIN IDS_TOOLTIP9, "Sprühdose" IDS_TOOLTIP10, "Text" IDS_TOOLTIP11, "Linie" - IDS_TOOLTIP12, "Bezier-Kurve" + IDS_TOOLTIP12, "Bézier-Kurve" IDS_TOOLTIP13, "Rechteck" IDS_TOOLTIP14, "Polygon" IDS_TOOLTIP15, "Ellipse" diff --git a/reactos/base/applications/rapps/lang/de-DE.rc b/reactos/base/applications/rapps/lang/de-DE.rc index 1ead4abf906..b48f0ea2229 100644 --- a/reactos/base/applications/rapps/lang/de-DE.rc +++ b/reactos/base/applications/rapps/lang/de-DE.rc @@ -42,7 +42,7 @@ BEGIN MENUITEM "&Deinstallieren", ID_UNINSTALL MENUITEM "&Ändern", ID_MODIFY MENUITEM SEPARATOR - MENUITEM "&Remove from Registry", ID_REGREMOVE + MENUITEM "Aus &Registry entfernen", ID_REGREMOVE MENUITEM SEPARATOR MENUITEM "&Aktualisieren", ID_REFRESH END @@ -71,16 +71,16 @@ END IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 216, 97 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Program installation" +CAPTION "Programminstallation" FONT 8, "MS Shell Dlg" BEGIN LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35 - AUTORADIOBUTTON "&Install from a disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP - AUTORADIOBUTTON "&Download and install", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP + AUTORADIOBUTTON "&Installation von einem Datenträger (CD oder DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP + AUTORADIOBUTTON "Herunterla&den und installieren", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP PUSHBUTTON "OK", IDOK, 86, 78, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 150, 78, 60, 14 + PUSHBUTTON "Abbrechen", IDCANCEL, 150, 78, 60, 14 END IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76 @@ -98,7 +98,7 @@ STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME CAPTION "Über" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "ReactOS Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 + LTEXT "ReactOS-Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 PUSHBUTTON "Schließen", IDOK, 133, 46, 50, 14 ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 END @@ -124,14 +124,14 @@ STRINGTABLE DISCARDABLE BEGIN IDS_INFO_VERSION "\nVersion: " IDS_INFO_DESCRIPTION "\nBeschreibung: " - IDS_INFO_PUBLISHER "\nPublisher: " + IDS_INFO_PUBLISHER "\nVertrieb: " IDS_INFO_HELPLINK "\nHilfe-Link: " IDS_INFO_HELPPHONE "\nHilfe-Telefonnr.: " IDS_INFO_README "\nReadme: " IDS_INFO_REGOWNER "\nregistrierter Eigentümer: " IDS_INFO_PRODUCTID "\nProdukt-ID: " - IDS_INFO_CONTACT "\nKontaktt: " - IDS_INFO_UPDATEINFO "\nUpdate Information: " + IDS_INFO_CONTACT "\nKontakt: " + IDS_INFO_UPDATEINFO "\nUpdate-Informationen: " IDS_INFO_INFOABOUT "\nInformation über: " IDS_INFO_COMMENTS "\nKommentare: " IDS_INFO_INSTLOCATION "\nInstallationsort: " @@ -171,23 +171,23 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_APPTITLE "ReactOS Anwendungsmanager" + IDS_APPTITLE "ReactOS-Anwendungsmanager" IDS_SEARCH_TEXT "Suche..." IDS_INSTALL "Installieren" IDS_UNINSTALL "Deinstallieren" IDS_MODIFY "Ändern" IDS_APPS_COUNT "Anzahl der Anwendungen: %d" - IDS_WELCOME_TITLE "Willkommen im ReactOS Anwendungsmanager!\n\n" - IDS_WELCOME_TEXT "Wählen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS Webseite: " + IDS_WELCOME_TITLE "Willkommen im ReactOS-Anwendungsmanager!\n\n" + IDS_WELCOME_TEXT "Wählen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS-Webseite: " IDS_WELCOME_URL "http://www.reactos.org" IDS_INSTALLED "Installiert" IDS_AVAILABLEFORINST "Zur Installation verfügbar" - IDS_UPDATES "Updates" + IDS_UPDATES "Aktualisierungen" IDS_APPLICATIONS "Anwendungen" - IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will be used for downloading of programs:" - IDS_CHOOSE_FOLDER_ERROR "You have specified a nonexistent folder!" - IDS_USER_NOT_ADMIN "You should be administrator for start ""ReactOS Applications Manager""!" - IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?" - IDS_INFORMATION "Information" - IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!" + IDS_CHOOSE_FOLDER_TEXT "Wählen Sie ein Verzeichnis aus, das zum Herunterladen verwendet werden soll:" + IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existentes Verzeichnis angegeben!" + IDS_USER_NOT_ADMIN "Sie müssen als Administrator angemeldet sein, um den Anwendungsmanager zu starten!" + IDS_APP_REG_REMOVE "Sind Sie sich sicher, dass Sie die Daten dieses Programms aus der Registry entfernen möchten?" + IDS_INFORMATION "Informationen" + IDS_UNABLE_TO_REMOVE "Konnte die Daten nicht aus der Registry löschen!" END diff --git a/reactos/base/applications/regedit/lang/de-DE.rc b/reactos/base/applications/regedit/lang/de-DE.rc index 6e456a541ba..2b0a22cd2af 100644 --- a/reactos/base/applications/regedit/lang/de-DE.rc +++ b/reactos/base/applications/regedit/lang/de-DE.rc @@ -54,8 +54,8 @@ BEGIN MENUITEM "&Exportieren...", ID_REGISTRY_EXPORTREGISTRYFILE MENUITEM SEPARATOR - MENUITEM "Hive laden...", ID_REGISTRY_LOADHIVE, GRAYED - MENUITEM "Hive entladen...", ID_REGISTRY_UNLOADHIVE, GRAYED + MENUITEM "Zweig laden...", ID_REGISTRY_LOADHIVE, GRAYED + MENUITEM "Zweig entladen...", ID_REGISTRY_UNLOADHIVE, GRAYED MENUITEM SEPARATOR MENUITEM "&Mit Netzwerkregistrierung verbinden...", ID_REGISTRY_CONNECTNETWORKREGISTRY @@ -78,7 +78,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Zeichenkette", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binärwert", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&DWORD Wert", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&DWORD-Wert", ID_EDIT_NEW_DWORDVALUE MENUITEM "&Mehrteilige Zeichenkette", ID_EDIT_NEW_MULTISTRINGVALUE MENUITEM "&Erweiterbare Zeichenkette", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END @@ -134,14 +134,14 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Zeichenkette", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binärwert", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&DWORD Wert", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&DWORD-Wert", ID_EDIT_NEW_DWORDVALUE MENUITEM "&Mehrteilige Zeichenkette", ID_EDIT_NEW_MULTISTRINGVALUE MENUITEM "&Erweiterbare Zeichenkette", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END END POPUP "" BEGIN - MENUITEM "Expandieren/Schliessen", ID_TREE_EXPANDBRANCH + MENUITEM "Erweitern/Schließen", ID_TREE_EXPANDBRANCH POPUP "&Neu" BEGIN MENUITEM "&Schlüssel", ID_EDIT_NEW_KEY @@ -160,7 +160,7 @@ BEGIN MENUITEM "&Exportieren", ID_TREE_EXPORT MENUITEM "&Berechtigungen...", ID_TREE_PERMISSIONS, GRAYED MENUITEM SEPARATOR - MENUITEM "S&chlüsselname kopieren", ID_EDIT_COPYKEYNAME + MENUITEM "S&chlüsselnamen kopieren", ID_EDIT_COPYKEYNAME END END @@ -215,7 +215,7 @@ END IDD_EDIT_DWORD DIALOGEX 32, 24, 252, 104 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "DWORD Wert editieren" +CAPTION "DWORD-Wert editieren" FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Name:",IDC_STATIC,6,6,134,8 @@ -242,7 +242,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_APP_TITLE "Registry Editor" + IDS_APP_TITLE "Registry-Editor" IDC_REGEDIT "REGEDIT" IDC_REGEDIT_FRAME "REGEDIT_FRAME" END @@ -253,7 +253,7 @@ BEGIN ID_EDIT_MENU "Enthält Befehle für das Ändern von Schlüsseln oder Werten" ID_VIEW_MENU "Enthält Befehle für das Anpassen des Registry Editor Fensters" ID_FAVOURITES_MENU "Enthält Befehle um auf oft genutzte Schlüssel zuzugreifen" - ID_HELP_MENU "Enthält Befehle um Hilfe und Informationen über den Registry Editor anzuzeigen" + ID_HELP_MENU "Enthält Befehle um Hilfe und Informationen über den Registry-Editor anzuzeigen" ID_EDIT_NEW_MENU "Enthält Befehle für das Erstellen von neuen Schlüsseln oder Werten" END @@ -263,7 +263,7 @@ BEGIN ID_EDIT_NEW_KEY "Fügt einen neuen Schlüssel hinzu" ID_EDIT_NEW_STRINGVALUE "Fügt eine neue Zeichenkette hinzu " ID_EDIT_NEW_BINARYVALUE "Fügt einen neuen Binärwärt hinzu" - ID_EDIT_NEW_DWORDVALUE "Fügt einen neuen DWORD Wert hinzu" + ID_EDIT_NEW_DWORDVALUE "Fügt einen neuen DWORD-Wert hinzu" ID_REGISTRY_IMPORTREGISTRYFILE "Importiert eine Textddatei in die Registry" ID_REGISTRY_EXPORTREGISTRYFILE "Exportiert Teile oder die ganze Registry in eine Textdatei" @@ -278,7 +278,7 @@ END STRINGTABLE DISCARDABLE BEGIN - ID_REGISTRY_EXIT "Beendet den Registry Editor" + ID_REGISTRY_EXIT "Beendet den Registry-Editor" ID_FAVOURITES_ADDTOFAVOURITES "Fügt Schlüssel zu den Favoriten hinzu" ID_FAVOURITES_REMOVEFAVOURITE "Löscht Schlüssel aus den Favoriten" ID_VIEW_STATUSBAR "Zeigt oder versteckt die Statusleiste" @@ -297,7 +297,7 @@ BEGIN IDS_WARNING "Warnung" IDS_BAD_KEY "Kann den Schlüssel '%s' nicht lesen" IDS_BAD_VALUE "Kann den Wert '%s' nicht lesen" - IDS_UNSUPPORTED_TYPE "Kann den Schlüssel des Typen (%ld) nicht ändern" + IDS_UNSUPPORTED_TYPE "Kann den Schlüssel des Typs (%ld) nicht ändern" IDS_TOO_BIG_VALUE "Der Wert (%ld) ist zu groß" IDS_MULTI_SZ_EMPTY_STRING "Daten vom Typ REG_MULTI_SZ können keine leere Zeichenkette enthalten.\nDie leere Zeichenkette wurde aus der Liste gelöscht." IDS_QUERY_DELETE_KEY_ONE "Diesen Schlüssel wirklich löschen?" @@ -323,7 +323,7 @@ BEGIN IDS_MY_COMPUTER "Arbeitsplatz" IDS_IMPORT_REG_FILE "Registry importieren" IDS_EXPORT_REG_FILE "Registry exportieren" - IDS_INVALID_DWORD "(ungültiger DWORD Wert)" + IDS_INVALID_DWORD "(ungültiger DWORD-Wert)" END STRINGTABLE DISCARDABLE @@ -331,7 +331,7 @@ BEGIN IDS_FLT_REGFILE "Registrierungsdatei" IDS_FLT_REGFILES "Registrierungsdateien" IDS_FLT_REGFILES_FLT "*.reg" - IDS_FLT_REGEDIT4 "Win9x/NT4 Registrierungsdateien (REGEDIT4)" + IDS_FLT_REGEDIT4 "Win9x/NT4-Registrierungsdateien (REGEDIT4)" IDS_FLT_REGEDIT4_FLT "*.reg" IDS_FLT_ALLFILES "Alle Dateien (*.*)" IDS_FLT_ALLFILES_FLT "*.*" diff --git a/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc b/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc index d6df75d4ba7..0fb89e80ef2 100644 --- a/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc +++ b/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc @@ -2,7 +2,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL DLG_SCRNSAVECONFIGURE DIALOGEX 0, 0, 273, 178 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "3D-Text Bildschirmschoner-Einstellungen" +CAPTION "3D-Text-Bildschirmschoner-Einstellungen" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,216,7,50,14 @@ -13,5 +13,5 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_DESCRIPTION "3D Text Bildschirmschoner" + IDS_DESCRIPTION "3D-Text-Bildschirmschoner" END diff --git a/reactos/base/applications/screensavers/logon/lang/de-DE.rc b/reactos/base/applications/screensavers/logon/lang/de-DE.rc index 10fc8483229..b740bedea3e 100644 --- a/reactos/base/applications/screensavers/logon/lang/de-DE.rc +++ b/reactos/base/applications/screensavers/logon/lang/de-DE.rc @@ -2,6 +2,6 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE BEGIN - IDS_DESCRIPTION "Logon Bildschirmschoner" + IDS_DESCRIPTION "Logon-Bildschirmschoner" IDS_TEXT "Keinerlei Einstellungen notwendig." END diff --git a/reactos/base/applications/sndvol32/lang/de-DE.rc b/reactos/base/applications/sndvol32/lang/de-DE.rc index abcab15673e..6ea135d5a0a 100644 --- a/reactos/base/applications/sndvol32/lang/de-DE.rc +++ b/reactos/base/applications/sndvol32/lang/de-DE.rc @@ -19,7 +19,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SNDVOL32 "Lautstärke Einstellungen" + IDS_SNDVOL32 "Lautstärke-Einstellungen" IDS_NOMIXERDEVICES "Es sind keine aktiven Mixer vorhanden! Die Anwendung wird jetzt beendet." END diff --git a/reactos/base/applications/taskmgr/lang/de-DE.rc b/reactos/base/applications/taskmgr/lang/de-DE.rc index 97a3f79e0b3..53b93098ca0 100644 --- a/reactos/base/applications/taskmgr/lang/de-DE.rc +++ b/reactos/base/applications/taskmgr/lang/de-DE.rc @@ -573,7 +573,7 @@ BEGIN ID_FILE_NEW "Führt ein neues Programm aus." ID_OPTIONS_ALWAYSONTOP "Task-Manager bleibt im Vordergrund, wenn nicht minimiert." ID_OPTIONS_MINIMIZEONUSE - "Task-Manager wird minimiert wenn ein SwitchTo-Vorgang durchgeführt wird." + "Task-Manager wird minimiert, wenn ein SwitchTo-Vorgang durchgeführt wird." ID_OPTIONS_HIDEWHENMINIMIZED "Blendet den Task-Manager aus, wenn er minimiert ist." ID_VIEW_REFRESH "Veranlasst den Task-Manager zur sofortigen Aktualisierung, unabhängig von der Geschwindigkeitseinstellung." ID_VIEW_LARGE "Zeigt Tasks als große Symbole an." @@ -596,9 +596,9 @@ BEGIN ID_WINDOWS_BRINGTOFRONT "Zeigt das Fenster im Vordergrund an, aber wechselt nicht zu diesem." ID_HELP_TOPICS "Zeigt die Hilfethemen des Taskmanagers an." ID_HELP_ABOUT "Zeigt Programminformationen, Versionsnummer und Copyright an." - ID_FILE_EXIT "Beendet den Task-Manager." + ID_FILE_EXIT "Beendet den Taskmanager." ID_OPTIONS_SHOW16BITTASKS - "Zeigt die 16-Bit Tasks unter der zugehörigen ntvdm.exe an." + "Zeigt die 16-Bit-Tasks unter der zugehörigen ntvdm.exe an." ID_VIEW_SELECTCOLUMNS "Legt fest welche Spalten auf der Registerkarte Prozesse angezeigt werden." ID_VIEW_SHOWKERNELTIMES "Zeigt die Kernel-Zeiten in den Systemmonitordiagrammen an." ID_VIEW_CPUHISTORY_ONEGRAPHALL @@ -675,7 +675,7 @@ BEGIN IDS_MENU_SHOWKERNELTIMES "&Kernel-Zeiten anzeigen" IDS_CREATENEWTASK "Neuen Task erstellen" IDS_CREATENEWTASK_DESC "Geben Sie Programme, Ordner, Dokumente oder Internetressourcen an, die geöffnet werden sollen." - IDS_MSG_ACCESSPROCESSAFF "Zugriff auf die / Änderung der Prozess Affinität nicht möglich" + IDS_MSG_ACCESSPROCESSAFF "Zugriff auf die / Änderung der Prozessaffinität nicht möglich" IDS_MSG_PROCESSONEPRO "Der Prozess muss eine Zugehörigkeit zu mindestens einem Prozessor aufweisen." IDS_MSG_INVALIDOPTION "Ungültige Auswahl" IDS_MSG_UNABLEDEBUGPROCESS "Kann Prozess nicht debuggen" diff --git a/reactos/base/applications/wordpad/It.rc b/reactos/base/applications/wordpad/It.rc index fd7a09b8576..e0d3b890bc4 100644 --- a/reactos/base/applications/wordpad/It.rc +++ b/reactos/base/applications/wordpad/It.rc @@ -1,4 +1,4 @@ -/* Italian resource for Wine WordPad +/* Italian resource for Wine WordPad * * Copyright 2010 by Luca Bennati * diff --git a/reactos/base/applications/wordpad/Uk.rc b/reactos/base/applications/wordpad/Uk.rc index 08ad375af2e..c71cbe1575c 100644 --- a/reactos/base/applications/wordpad/Uk.rc +++ b/reactos/base/applications/wordpad/Uk.rc @@ -1,4 +1,4 @@ -/* +/* * Copyright 2004 by Krzysztof Foltman * * Ukrainian language support diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index 3c32d1f7b2f..4a699aa9c15 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -1,4 +1,4 @@ -/* +/* * Copyright 2004 by Krzysztof Foltman * Copyright 2007 by Alexander N. Sørnes * diff --git a/reactos/base/applications/write/Uk.rc b/reactos/base/applications/write/Uk.rc index 968ed404d57..ac970be8bd7 100644 --- a/reactos/base/applications/write/Uk.rc +++ b/reactos/base/applications/write/Uk.rc @@ -1,4 +1,4 @@ -/* +/* * Ukrainian language support * * Copyright (C) 2007 Mikolaj Zalewski diff --git a/reactos/base/setup/reactos/lang/de-DE.rc b/reactos/base/setup/reactos/lang/de-DE.rc index c37399228b7..4c44f64b83c 100644 --- a/reactos/base/setup/reactos/lang/de-DE.rc +++ b/reactos/base/setup/reactos/lang/de-DE.rc @@ -4,17 +4,17 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_STARTPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Willkommen beim ReactOS Setup Assistenten.", IDC_STARTTITLE, 115, 8, 195, 24 + LTEXT "Willkommen beim ReactOS-Setup-Assistenten.", IDC_STARTTITLE, 115, 8, 195, 24 LTEXT "ReactOS kann noch nicht direkt von dieser CD installiert werden! Bitte starten Sie Ihren Computer mit dieser CD um ReactOS zu installieren.", IDC_STATIC, 115, 40, 195, 100 LTEXT "Klicken Sie auf Beenden um das Setup zu verlassen.", IDC_STATIC, 115, 169, 195, 17 END IDD_LANGSELPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "IDB_LOGO", IDB_ROSLOGO, "Static", WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 18, 0, 290, 99 @@ -27,7 +27,7 @@ END IDD_TYPEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Setuptyp", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 @@ -38,7 +38,7 @@ END IDD_DEVICEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Geräteeinstellungen", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 @@ -53,7 +53,7 @@ END IDD_DRIVEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Partition für die ReactOS-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 10,1,298,176 @@ -99,7 +99,7 @@ END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Installationszusammenfassung", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 @@ -108,7 +108,7 @@ END IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Installationsaktion", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 @@ -121,13 +121,13 @@ END IDD_RESTARTPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Vervollständige ReactOS Setup" +CAPTION "Vervollständige ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Abschließen der ersten Stufe des ReactOS Setup", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Sie haben die erste Stufe des ReactOS Setup erfolgreich abgeschlossen.", IDC_STATIC, 20, 50, 277, 10 + CONTROL "Abschließen der ersten Stufe der ReactOS-Installation", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Sie haben die erste Stufe des ReactOS-Setup erfolgreich abgeschlossen.", IDC_STATIC, 20, 50, 277, 10 - LTEXT "Wenn Sie auf Beenden klicken wird der Computer neugestartet.", IDC_STATIC, 20, 80, 277, 10 + LTEXT "Wenn Sie auf Beenden klicken, wird der Computer neu gestartet.", IDC_STATIC, 20, 80, 277, 10 CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 120, 277, 8 LTEXT "Wenn eine CD im Laufwerk ist, entfernen Sie sie. Klicken Sie zum Neustart auf Beenden.", IDC_STATIC, 10, 180, 297, 20 END @@ -137,7 +137,7 @@ STRINGTABLE BEGIN IDS_LANGTITLE "Sprachauswahl" IDS_LANGSUBTITLE "Wählen Sie eine Sprache für das Setup und das Endsystem aus." - IDS_TYPETITLE "Willkommen zum ReactOS Setup" + IDS_TYPETITLE "Willkommen zum ReactOS-Setup" IDS_TYPESUBTITLE "Wählen Sie einen Setuptyp." IDS_DEVICETITLE "Einstellen der Basisgeräte" IDS_DEVICESUBTITLE "Einstellungen der Anzeigegeräte und der Tastatur." @@ -149,7 +149,7 @@ BEGIN IDS_RESTARTSUBTITLE "Die erste Stufe des Setup wurde abgeschlossen, starten Sie den Rechner neu, um mit der zweiten Stufe fortzufahren." IDS_SUMMARYTITLE "Installationszusammenfassung" IDS_SUMMARYSUBTITLE "Liste alle Installationseinstellungen vor Anwendung auf die Geräte auf" - IDS_ABORTSETUP "ReactOS ist nicht vollständig auf Ihrem Computer installiert. Wenn Sie das Setup verlassen, dann müssen Sie das Setup nochmal ausführen, um ReactOS zu installieren. Wirklich beenden?" + IDS_ABORTSETUP "ReactOS ist nicht vollständig auf Ihrem Computer installiert. Wenn Sie das Setup verlassen, dann müssen Sie das Setup nochmals ausführen, um ReactOS zu installieren. Wirklich beenden?" IDS_ABORTSETUP2 "Installation abbrechen?" END /* EOF */ diff --git a/reactos/base/setup/usetup/lang/de-DE.h b/reactos/base/setup/usetup/lang/de-DE.h index 570f2147761..c585bd9885c 100644 --- a/reactos/base/setup/usetup/lang/de-DE.h +++ b/reactos/base/setup/usetup/lang/de-DE.h @@ -65,13 +65,13 @@ static MUI_ENTRY deDEWelcomePageEntries[] = { 6, 8, - "Willkommen zum ReactOS Setup", + "Willkommen zum ReactOS-Setup", TEXT_STYLE_HIGHLIGHT }, { 6, 11, - "Dieser Teil des Setups kopiert das ReactOS Betriebssystem auf Ihren", + "Dieser Teil des Setups kopiert das ReactOS-Betriebssystem auf Ihren", TEXT_STYLE_NORMAL }, { @@ -107,7 +107,7 @@ static MUI_ENTRY deDEWelcomePageEntries[] = { 6, 23, - "Fr weitere Informationen, besuchen Sie bitte:", + "Fr weitere Informationen besuchen Sie bitte:", TEXT_STYLE_NORMAL }, { @@ -141,7 +141,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 6, 8, - "Das ReactOS Setup ist noch in einer frhen Entwicklungsphase. Es unter-", + "Das ReactOS-Setup ist noch in einer frhen Entwicklungsphase. Es unter-", TEXT_STYLE_NORMAL }, { @@ -165,7 +165,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 8, 14, - "- Setup kann keine prim„re Partition von einer HDD l”schen", + "- Setup kann keine prim„re Partition von einer HDD l”schen,", TEXT_STYLE_NORMAL }, { @@ -177,7 +177,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 8, 16, - "- Setup kann die erste erweiterte Partition nicht von der HDD l”schen", + "- Setup kann die erste erweiterte Partition nicht von der HDD l”schen,", TEXT_STYLE_NORMAL }, { @@ -189,7 +189,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 8, 18, - "- Setup untersttzt nur FAT Dateisysteme.", + "- Setup untersttzt nur FAT-Dateisysteme.", TEXT_STYLE_NORMAL }, { @@ -406,7 +406,7 @@ static MUI_ENTRY deDEDevicePageEntries[] = { 6, 20, - "Dann drcken Sie die Eingabetaste, um eine Einstellung abzu„ndern.", + "Dann drcken Sie die Eingabetaste, um eine Einstellung zu „ndern.", TEXT_STYLE_NORMAL }, { @@ -452,7 +452,7 @@ static MUI_ENTRY deDERepairPageEntries[] = { 6, 8, - "Das ReactOS Setup ist noch in einer frhen Entwicklungsphase. Es unter-", + "Das ReactOS-Setup ist noch in einer frhen Entwicklungsphase. Es unter-", TEXT_STYLE_NORMAL }, { @@ -488,7 +488,7 @@ static MUI_ENTRY deDERepairPageEntries[] = { 8, 21, - "\x07 Drcken Sie ENTER, um den Computer neuzustarten.", + "\x07 Drcken Sie ENTER, um den Computer neu zu starten.", TEXT_STYLE_NORMAL }, { @@ -579,7 +579,7 @@ static MUI_ENTRY deDEFlushPageEntries[] = { 10, 9, - "Der PC wird automatisch neustarten, wenn der Vorgang beendet ist.", + "Der PC wird automatisch neunstarten, wenn der Vorgang beendet ist.", TEXT_STYLE_NORMAL }, { @@ -895,7 +895,7 @@ static MUI_ENTRY deDEInstallDirectoryEntries[] = { 6, 8, - "Setup installiert die ReactOS Installationsdateien in die ausgew„hlte", + "Setup installiert die ReactOS-Installationsdateien in die ausgew„hlte", TEXT_STYLE_NORMAL }, { @@ -907,13 +907,13 @@ static MUI_ENTRY deDEInstallDirectoryEntries[] = { 6, 14, - "Um den Vorschlag zu „ndern drcken sie die 'Entf' Taste um", + "Um den Vorschlag zu „ndern drcken sie die 'Entf'-Taste, um", TEXT_STYLE_NORMAL }, { 6, 15, - "Zeichen zu l”schen und gegeben sie dann den Namen des Verzeichnis ein", + "Zeichen zu l”schen, und geben sie dann den Namen des Verzeichnis ein", TEXT_STYLE_NORMAL }, { @@ -941,7 +941,7 @@ static MUI_ENTRY deDEFileCopyEntries[] = { 0, 12, - "Bitte warten Sie w„hrend ReactOS Setup die ReactOS Dateien", + "Bitte warten Sie, w„hrend das ReactOS-Setup die ReactOS-Dateien", TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER }, { @@ -987,7 +987,7 @@ static MUI_ENTRY deDEBootLoaderEntries[] = { 8, 12, - "Boot-Loader auf der Festplatte installieren (Boot-Sektor).", + "Boot-Loader auf der Festplatte installieren (Bootsektor).", TEXT_STYLE_NORMAL }, { @@ -1079,7 +1079,7 @@ static MUI_ENTRY deDELayoutSettingsEntries[] = { 6, 8, - "Bitte w„hlen Sie ein zu installierendes Standard Layout.", + "Bitte w„hlen Sie ein zu installierendes Standardlayout aus.", TEXT_STYLE_NORMAL }, { @@ -1161,7 +1161,7 @@ static MUI_ENTRY deDESelectFSEntries[] = { 6, 17, - "W„hlen Sie ein Dateisystem von der folgenden Liste.", + "W„hlen Sie ein Dateisystem aus der folgenden Liste aus.", 0 }, { @@ -1208,7 +1208,7 @@ static MUI_ENTRY deDEDeletePartitionEntries[] = { 6, 8, - "Sie haben sich entschieden diese Partition zu l”schen", + "Sie haben sich entschieden, diese Partition zu l”schen", TEXT_STYLE_NORMAL }, { @@ -1260,7 +1260,7 @@ static MUI_ENTRY deDERegistryEntries[] = { 0, 0, - "Registry Hives erstellen...", + "Registryzweige erstellen...", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1287,62 +1287,62 @@ MUI_ERROR deDEErrorEntries[] = { //ERROR_NO_HDD "Setup konnte keine Festplatte finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_NO_SOURCE_DRIVE "Setup konnte das Quelllaufwerk nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_TXTSETUPSIF "Setup konnte TXTSETUP.SIF nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CORRUPT_TXTSETUPSIF - "Setup fand eine korrupte TXTSETUP.SIF.\n", - "ENTER = Computer neustarten" + "Setup fand eine defekte TXTSETUP.SIF.\n", + "ENTER = Computer neu starten" }, { //ERROR_SIGNATURE_TXTSETUPSIF, "Setup fand eine ungltige Signatur in TXTSETUP.SIF.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_DRIVE_INFORMATION "Setup konnte keine Laufwerksinformationen abfragen.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_WRITE_BOOT, - "Setup konnte den FAT Bootcode nicht auf der Partition installieren.", - "ENTER = Computer neustarten" + "Setup konnte den FAT-Bootcode nicht auf der Partition installieren.", + "ENTER = Computer neu starten" }, { //ERROR_LOAD_COMPUTER, "Setup konnte die Computertypenliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_DISPLAY, "Setup konnte die Displayeinstellungsliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_KEYBOARD, "Setup konnte die Tastaturtypenliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_KBLAYOUT, "Setup konnte die Tastaturlayoutliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_WARN_PARTITION, "Setup hat mindestens eine Festplatte mit einer inkompatiblen Partitionstabelle\n" - "welche nicht richtig verwendet werden k”nnen!\n" + "gefunden, die nicht richtig verwendet werden kann!\n" "\n" "Partitionen zu erstellen/l”schen kann die Partitionstabelle zerst”ren.\n" "\n" @@ -1367,8 +1367,8 @@ MUI_ERROR deDEErrorEntries[] = }, { //ERROR_INSTALL_BOOTCODE, - "Setup konnte den FAT Bootcode nicht auf der Partition installieren.", - "ENTER = Computer neustarten" + "Setup konnte den FAT-Bootcode nicht auf der Partition installieren.", + "ENTER = Computer neu starten" }, { //ERROR_NO_FLOPPY, @@ -1378,105 +1378,105 @@ MUI_ERROR deDEErrorEntries[] = { //ERROR_UPDATE_KBSETTINGS, "Setup konnte das Tastaturlayout nicht aktualisieren.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_UPDATE_DISPLAY_SETTINGS, "Setup konnte die Display-Registrywerte nicht aktualisieren.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_IMPORT_HIVE, - "Setup konnte keine Hive Datei importieren.", - "ENTER = Computer neustarten" + "Setup konnte keine Hive-Datei importieren.", + "ENTER = Computer neu starten" }, { //ERROR_FIND_REGISTRY "Setup konnte die Registrydateien nicht finden.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CREATE_HIVE, - "Setup konnte die Registry-Hives nicht erstellen.", - "ENTER = Computer neustarten" + "Setup konnte die Registryzweige nicht erstellen.", + "ENTER = Computer neu starten" }, { //ERROR_INITIALIZE_REGISTRY, "Setup konnte die Registry nicht initialisieren.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_INVALID_CABINET_INF, - "Cabinet hat keine gltige .inf Datei.\n", - "ENTER = Computer neustarten" + "Cabinet hat keine gltige .inf-Datei.\n", + "ENTER = Computer neu starten" }, { //ERROR_CABINET_MISSING, "Cabinet nicht gefunden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CABINET_SCRIPT, - "Cabinet enth„lt kein Setup Skript.\n", - "ENTER = Computer neustarten" + "Cabinet enth„lt kein Setup-Skript.\n", + "ENTER = Computer neu starten" }, { //ERROR_COPY_QUEUE, "Setup konnte die Liste mit zu kopierenden Dateien nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CREATE_DIR, "Setup konnte die Installationspfade nicht erstellen.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_TXTSETUP_SECTION, - "Setup konnte die 'Ordner' Sektion in\n" + "Setup konnte die 'Ordner'-Sektion in\n" "TXTSETUP.SIF nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CABINET_SECTION, - "Setup konnte die 'Ordner' Sektion im\n" + "Setup konnte die 'Ordner'-Sektion im\n" "Cabinet nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CREATE_INSTALL_DIR "Setup konnte den Installationspfad nicht erstellen.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_FIND_SETUPDATA, - "Setup konnte die 'SetupData' Sektion in\n" + "Setup konnte die 'SetupData'-Sektion in\n" "TXTSETUP.SIF nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_WRITE_PTABLE, "Setup konnte die Partitionstabellen nicht schreiben.\n" - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_ADDING_CODEPAGE, - "Setup konnte den CodePage-Eintrag nicht hinzufgen.\n" - "ENTER = Computer neustarten" + "Setup konnte den Codepage-Eintrag nicht hinzufgen.\n" + "ENTER = Computer neu starten" }, { //ERROR_UPDATE_LOCALESETTINGS, "Setup konnte die Systemsprache nicht einstellen.\n" - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_ADDING_KBLAYOUTS, - "Setup konnte die Tastaturlayouts nicht in Registry eintragen.\n" - "ENTER = Computer neustarten" + "Setup konnte die Tastaturlayouts nicht in der Registry eintragen.\n" + "ENTER = Computer neu starten" }, { //ERROR_UPDATE_GEOID, - "Setup konnte den geographischen Standort nicht einstellen.\n" - "ENTER = Computer neustarten" + "Setup konnte den geografischen Standort nicht einstellen.\n" + "ENTER = Computer neu starten" }, { NULL, @@ -1596,7 +1596,7 @@ MUI_STRING deDEStrings[] = {STRING_PARTITIONSIZE, "Gr”áe der neuen Partition:"}, {STRING_CHOOSENEWPARTITION, - "Sie haben beschlossen eine neue Partition zu erstellen auf"}, + "Sie haben beschlossen, eine neue Partition zu erstellen auf"}, {STRING_HDDSIZE, "Bitte geben Sie die Gr”áe der neuen Partition in Megabyte ein."}, {STRING_CREATEPARTITION, @@ -1606,21 +1606,21 @@ MUI_STRING deDEStrings[] = {STRING_NONFORMATTEDPART, "Sie wollen ReactOS auf einer neuen/unformatieren Partition installieren."}, {STRING_INSTALLONPART, - "Setup installiert ReactOS auf diese Partition"}, + "Setup installiert ReactOS auf dieser Partition"}, {STRING_CHECKINGPART, "Setup berprft die ausgew„hlte Partition."}, {STRING_QUITCONTINUE, "F3 = Beenden ENTER = Fortsetzen"}, {STRING_REBOOTCOMPUTER, - "ENTER = Computer neustarten"}, + "ENTER = Computer neu starten"}, {STRING_TXTSETUPFAILED, - "Setup konnte die '%S' Sektion\nin TXTSETUP.SIF nicht finden.\n"}, + "Setup konnte die '%S'-Sektion\nin TXTSETUP.SIF nicht finden.\n"}, {STRING_COPYING, "\xB3 Kopiere Datei: %S"}, {STRING_SETUPCOPYINGFILES, "Setup kopiert Dateien..."}, {STRING_REGHIVEUPDATE, - " Registry hives werden aktualisiert..."}, + " Registryzweige werden aktualisiert..."}, {STRING_IMPORTFILE, " Importiere %S..."}, {STRING_DISPLAYETTINGSUPDATE, @@ -1628,27 +1628,27 @@ MUI_STRING deDEStrings[] = {STRING_LOCALESETTINGSUPDATE, " Lokalisierungseinstellungen werden aktualisiert..."}, {STRING_KEYBOARDSETTINGSUPDATE, - " Tastaturlayout Einstellungen werden aktualisiert..."}, + " Tastaturlayouteinstellungen werden aktualisiert..."}, {STRING_CODEPAGEINFOUPDATE, - " Codepage Informationen werden hinzugefgt..."}, + " Codepage-Informationen werden hinzugefgt..."}, {STRING_DONE, " Fertig..."}, {STRING_REBOOTCOMPUTER2, - " ENTER = Computer neustarten"}, + " ENTER = Computer neu starten"}, {STRING_CONSOLEFAIL1, "Konsole konnte nicht ge”ffnet werden\n\n"}, {STRING_CONSOLEFAIL2, - "Der h„ufigste Grund hierfr ist die Verwendung einer USB Tastautur\n"}, + "Der h„ufigste Grund hierfr ist die Verwendung einer USB-Tastatur\n"}, {STRING_CONSOLEFAIL3, - "USB Tastaturen werden noch nicht vollst„ndig untersttzt\n"}, + "USB-Tastaturen werden noch nicht vollst„ndig untersttzt\n"}, {STRING_FORMATTINGDISK, "Setup formatiert Ihre Festplatte"}, {STRING_CHECKINGDISK, "Setup überprüft Ihre Festplatte"}, {STRING_FORMATDISK1, - " Formatiere Partition als %S Dateisystem (Schnell) "}, + " Formatiere Partition als %S-Dateisystem (Schnell) "}, {STRING_FORMATDISK2, - " Formatiere Partition als %S Dateisystem "}, + " Formatiere Partition als %S-Dateisystem "}, {STRING_KEEPFORMAT, " Dateisystem beibehalten (Keine Ver„nderungen) "}, {STRING_HDINFOPARTCREATE, diff --git a/reactos/base/setup/vmwinst/lang/de-DE.rc b/reactos/base/setup/vmwinst/lang/de-DE.rc index 67a0320d8f8..b66c13f0746 100644 --- a/reactos/base/setup/vmwinst/lang/de-DE.rc +++ b/reactos/base/setup/vmwinst/lang/de-DE.rc @@ -5,8 +5,8 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Das ReactOS Setup hat festgestellt, dass Sie ReactOS in VMware(r) installieren.", -1, 117, 8, 140, 24 - LTEXT "Wenn Sie den VMware(r) SVGA Treiber installieren möchten, klicken Sie auf 'Weiter', ansonsten auf 'Abbrechen'.", -1, 117, 140, 140, 24 + LTEXT "Das ReactOS-Setup hat festgestellt, dass Sie ReactOS in VMware(r) installieren.", -1, 117, 8, 140, 24 + LTEXT "Wenn Sie den VMware(r)-SVGA-Treiber installieren möchten, klicken Sie auf 'Weiter', ansonsten auf 'Abbrechen'.", -1, 117, 140, 140, 24 END IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -14,7 +14,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "ReactOS wird nicht mit dem VMware(r) SVGA Treiber ausgeliefert.\n\nGehen Sie bitte auf 'VM' in der Menüleiste von VMware(r) Workstation und wählen Sie 'VMware Tools installieren...'\n\n\nKlicken Sie auf 'Weiter' um fortzufahren, ansonsten auf 'Abbrechen'",-1,25,25,225,85 + LTEXT "ReactOS wird nicht mit dem VMware(r)-SVGA-Treiber ausgeliefert.\n\nGehen Sie bitte auf 'VM' in der Menüleiste von VMware(r) Workstation und wählen Sie 'VMware Tools installieren...'\n\n\nKlicken Sie auf 'Weiter', um fortzufahren, ansonsten auf 'Abbrechen'",-1,25,25,225,85 END IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -31,7 +31,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Der VMware(r) SVGA Treiber wurde erfolgreich installiert. Wählen Sie bitte Ihre Auflösung:",-1,25,5,225,20 + LTEXT "Der VMware(r)-SVGA-Treiber wurde erfolgreich installiert. Wählen Sie bitte Ihre Auflösung:",-1,25,5,225,20 PUSHBUTTON "640x480", 1120, 25, 30, 65, 15, BS_AUTORADIOBUTTON PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON @@ -52,7 +52,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Das ReactOS Setup konnte den VMware(r) SVGA Treiber nicht finden.\n\n\nKlicken Sie auf 'Fertigstellen' um mit der Installation fortzufahren",-1,25,25,225,85 + LTEXT "Das ReactOS-Setup konnte den VMware(r)-SVGA-Treiber nicht finden.\n\n\nKlicken Sie auf 'Fertigstellen', um mit der Installation fortzufahren",-1,25,25,225,85 END IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -60,10 +60,10 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Der VMware(r) SVGA Treiber wurde schon installiert.\n\nWählen Sie bitte eine der folgenden Optionen aus:",-1,25,5,225,30 + LTEXT "Der VMware(r)-SVGA-Treiber wurde schon installiert.\n\nWählen Sie bitte eine der folgenden Optionen aus:",-1,25,5,225,30 PUSHBUTTON "Die Bildeinstellungen ändern", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON PUSHBUTTON "Einen anderen Grafiktreiber benutzen", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON - PUSHBUTTON "Den VMware(r) SVGA Treiber entfernen", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "Den VMware(r)-SVGA-Treiber entfernen", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON LTEXT "Klicken Sie auf 'Weiter' um fortzufahren oder 'Abbrechen' um den Asssistenten zu beenden.", -1, 25, 93, 225, 19 END @@ -73,9 +73,9 @@ CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Wählen Sie bitte den Grafiktreiber aus, den Sie verwenden möchten:",-1,25,25,225,15 - PUSHBUTTON "ReactOS VGA Treiber", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON - PUSHBUTTON "ReactOS VBE Treiber (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON - LTEXT "Klicken Sie auf 'Fertigstellen' um die Installation fertigzustellen oder auf 'Abbrechen' um das Setup ohne Veränderungen zu beenden.", -1, 25, 93, 225, 20 + PUSHBUTTON "ReactOS-VGA-Treiber", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "ReactOS-VBE-Treiber (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON + LTEXT "Klicken Sie auf 'Fertigstellen', um die Installation fertigzustellen, oder auf 'Abbrechen', um das Setup ohne Veränderungen zu beenden.", -1, 25, 93, 225, 20 END IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -83,48 +83,48 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Das ReactOS Setup wird Ihren VMware(r) SVGA Treiber entfernen!!!\n\n\nKlicken Sie auf 'Fertigstellen' um den Treiber zu entfernen oder auf 'Abbrechen' um ihn weiterhin zu verwenden.",-1,25,25,225,85 + LTEXT "Das ReactOS-Setup wird Ihren VMware(r)-SVGA-Treiber entfernen!!!\n\n\nKlicken Sie auf 'Fertigstellen', um den Treiber zu entfernen, oder auf 'Abbrechen', um ihn weiterhin zu verwenden.",-1,25,25,225,85 END STRINGTABLE BEGIN IDS_WIZARD_NAME "VMware(r) gefunden" - IDS_FAILEDTOLOCATEDRIVERS "Das ReactOS Setup konnte die benötigten Dateien nicht finden.\nStellen Sie sicher, dass sich die VMware-Tools CD in dem Laufwerk befindet." - IDS_FAILEDTOCOPYFILES "Das ReactOS Setup konnte die benötigten Dateien nicht kopieren.\nStellen Sie sicher, dass sich die VMware-Tools CD in dem Laufwerk befindet.\n" - IDS_FAILEDTOACTIVATEDRIVER "Fehler beim Aktivieren des VMware(r) SVGA Treibers!" - IDS_FAILEDTOSELVGADRIVER "Fehler beim Aktivieren des ReactOS VGA Treibers!" - IDS_FAILEDTOSELVBEDRIVER "Fehler beim Aktivieren des ReactOS VBE Treibers!" - IDS_UNINSTNOTICE "Die VMware(r) SVGA Treiber Dateien wurden noch nicht gelöscht.\nLöschen Sie sie bitte nach dem Neustart manuell." + IDS_FAILEDTOLOCATEDRIVERS "Das ReactOS-Setup konnte die benötigten Dateien nicht finden.\nStellen Sie sicher, dass sich die VMware-Tools-CD in dem Laufwerk befindet." + IDS_FAILEDTOCOPYFILES "Das ReactOS-Setup konnte die benötigten Dateien nicht kopieren.\nStellen Sie sicher, dass sich die VMware-Tools-CD in dem Laufwerk befindet.\n" + IDS_FAILEDTOACTIVATEDRIVER "Fehler beim Aktivieren des VMware(r)-SVGA-Treibers!" + IDS_FAILEDTOSELVGADRIVER "Fehler beim Aktivieren des ReactOS-VGA-Treibers!" + IDS_FAILEDTOSELVBEDRIVER "Fehler beim Aktivieren des ReactOS-VBE-Treibers!" + IDS_UNINSTNOTICE "Die VMware(r)-SVGA-Treiberdateien wurden noch nicht gelöscht.\nLöschen Sie sie bitte nach dem Neustart manuell." END STRINGTABLE BEGIN 10001 "Niedrigste (8BPP)" - 10002 "Mittelere (16BPP)" + 10002 "Mittlere (16BPP)" 10003 "Höchste (32BPP)" END STRINGTABLE BEGIN - IDS_SEARCHINGFORCDROM "Suche die VMware(r) Tools CD-ROM..." + IDS_SEARCHINGFORCDROM "Suche die VMware(r)-Tools-CD-ROM..." IDS_COPYINGFILES "Kopiere Dateien..." - IDS_ENABLINGDRIVER "Aktiviere den VMware(r) SVGA Treiber..." + IDS_ENABLINGDRIVER "Aktiviere den VMware(r)-SVGA-Treiber..." END STRINGTABLE BEGIN - IDD_INSERT_VMWARE_TOOLSTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_INSERT_VMWARE_TOOLSSUBTITLE "Bitte legen Sie die VMware-Tool CD-ROM ein." - IDD_INSTALLING_VMWARE_TOOLSTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Suchen und kopieren des VMware(r) SVGA Treibers." - IDD_CONFIGTITLE "VMware(r) SVGA Treiber Installationsassistent" + IDD_INSERT_VMWARE_TOOLSTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_INSERT_VMWARE_TOOLSSUBTITLE "Bitte legen Sie die VMware-Tools-CD-ROM ein." + IDD_INSTALLING_VMWARE_TOOLSTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Suchen und kopieren des VMware(r)-SVGA-Treibers." + IDD_CONFIGTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" IDD_CONFIGSUBTITLE "Wählen Sie die Bildschirmauflösung aus." - IDD_INSTALLATION_FAILEDTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_INSTALLATION_FAILEDSUBTITLE "Die VMware(r) SVGA Treiber installation ist fehlgeschlagen." - IDD_CHOOSEACTIONTITLE "VMware(r) SVGA Treiber Installationsassistent" + IDD_INSTALLATION_FAILEDTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_INSTALLATION_FAILEDSUBTITLE "Die VMware(r)-SVGA-Treiberinstallation ist fehlgeschlagen." + IDD_CHOOSEACTIONTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" IDD_CHOOSEACTIONSUBTITLE "Wählen Sie eine Option aus." - IDD_SELECTDRIVERTITLE "VMware(r) SVGA Treiber Installationsassistent" + IDD_SELECTDRIVERTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" IDD_SELECTDRIVERSUBTITLE "Wählen Sie einen Treiber aus." - IDD_DOUNINSTALLTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_DOUNINSTALLSUBTITLE "De-Installieren des Treibers." + IDD_DOUNINSTALLTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_DOUNINSTALLSUBTITLE "Deinstallieren des Treibers." END diff --git a/reactos/base/setup/welcome/lang/de-DE.rc b/reactos/base/setup/welcome/lang/de-DE.rc index 4e96578839e..63998b0b0b0 100644 --- a/reactos/base/setup/welcome/lang/de-DE.rc +++ b/reactos/base/setup/welcome/lang/de-DE.rc @@ -53,7 +53,7 @@ STRINGTABLE DISCARDABLE BEGIN IDS_TOPICDESC0 "Installiert ReactOS auf ihrem Computer oder aktualisiert eine bestehende Installation." IDS_TOPICDESC1 "Die ReactOS-CD durchsuchen." - IDS_TOPICDESC2 "Klicken Sie um dieses Programm zu beenden." + IDS_TOPICDESC2 "Klicken Sie, um dieses Programm zu beenden." // IDS_TOPICDESC3 "Topic description 3.\n\nDescribe topic 3 here." // IDS_TOPICDESC4 "Topic description 4.\n\nDescribe topic 4 here." // IDS_TOPICDESC5 "Topic description 5.\n\nDescribe topic 5 here." diff --git a/reactos/base/shell/cmd/lang/de-DE.rc b/reactos/base/shell/cmd/lang/de-DE.rc index de29914a295..a0aa97e842e 100644 --- a/reactos/base/shell/cmd/lang/de-DE.rc +++ b/reactos/base/shell/cmd/lang/de-DE.rc @@ -29,7 +29,7 @@ ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\ /D Verarbeitet auch die Ordner.\n\n\ ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an." -STRING_ALIAS_HELP, "Setzt, löscht oder zeigt Alias.\n\n\ +STRING_ALIAS_HELP, "Setzt, löscht oder zeigt ein Alias.\n\n\ ALIAS [alias=[command]]\n\n\ alias Name des Alias.\n\ command Text welcher für den Alias zugeordnet wird.\n\n\ @@ -40,7 +40,7 @@ Setzt ein neues oder Löscht ein Alias von der Alias-Liste:\n\ ALIAS da=" -STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP" +STRING_BEEP_HELP, "Gibt einen Piepton durch den PC-Lautsprecher aus.\n\nBEEP" STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\ CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\ @@ -54,7 +54,7 @@ CD [Laufwerk:][Pfad]\n\ CD[..|.]\n\n\ .. übergeordnetes Verzeichnis\n\ . vorhergehende Verzeichnis\n\n\ -Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\ +Geben Sie CD-Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\ Laufwerk anzuzeigen.\n\ Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt." @@ -66,7 +66,7 @@ Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an." STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option wählen muss.\n\n\ CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ /C[:]choices Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\ - /N Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\ + /N Zeigt choices und ? am ende des Prompt-Strings NICHT an.\n\ /S Groß- und Kleinschreibung wird beachtet.\n\ /T[:]c,nn Standard-Auswahl wird auf c gesetzt nach nn Sekunden.\n\ text Zeigt eine Beschreibung an.\n\n\ @@ -74,9 +74,9 @@ ERRORLEVEL wird auf den Offset der Taste welche der Benutzer gedr STRING_CLS_HELP, "Löscht den Bildschirminhalt.\n\nCLS" -STRING_CMD_HELP1, "\nIntere Befehle verfügbar:\n" +STRING_CMD_HELP1, "\nInterne Befehle verfügbar:\n" -STRING_CMD_HELP2, "\nVerfügbare Features:" +STRING_CMD_HELP2, "\nVerfügbare Funktionen:" STRING_CMD_HELP3," [aliases]" @@ -96,11 +96,11 @@ CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ (kann nicht beendet werden).\n\ /T:bf Setzt die Hintergrund- und Vordergrund-Farbe (siehe COLOR Befehl)." -STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben für die Konsole fest.\n\n\ +STRING_COLOR_HELP1, "Legt die Standardhinter- und Vordergrundfarben für die Konsole fest.\n\n\ COLOR [attr [/F]] \n\n\ attr Gibt die Farbattribute für die Konsolenausgabe an.\n\ - /F füllt die Konsolenausgabe mit dem Farbattribut\n\n\ -Es gibt 3 Möglichkeiten die Farbe festzulegen:\n\ + /F Füllt die Konsolenausgabe mit dem Farbattribut\n\n\ +Es gibt 3 Möglichkeiten, um die Farbe festzulegen:\n\ 1) [bright] name on [bright] name (Nur die 4 ersten Buchstaben sind nötig)\n\ 2) decimal on decimal\n\ 3) two hex digits\n\n\ @@ -129,7 +129,7 @@ COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\ vorhandener Zieldateien.\n\ /-Y Fordert beim Überschreiben vorhandener Zieldateien zum\n\ Bestätigen auf.\n\n\ -Die Option /Y ist möglicherweise in der Umgebungsvariablen COPYCMD.\n\ +Die Option /Y ist möglicherweise in der Umgebungsvariablen COPYCMD definiert.\n\ ..." STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): " @@ -148,22 +148,22 @@ STRING_DEL_HELP1, "L DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\ - file Geben Sie die Dateinamen an welche Sie löschen möchten\n\n\ + file Geben Sie die Dateinamen an, welche Sie löschen möchten\n\n\ /N Nichts.\n\ /P Fordert Sie vor dem Löschen jeder Datei zur Bestätigung auf.\n\ /T Zeigt die Anzahl der gelöschten Dateien und deren vorherigen Speicherplatzbedarf an.\n\ /Q Beenden.\n\ - /W Sicheres Löschen. Dateien werden mit Zufallszahlen überschrieben bevor sie gelöscht werden.\n\ + /W Sicheres Löschen. Dateien werden mit Zufallszahlen überschrieben, bevor sie gelöscht werden.\n\ /Y Löscht alles (*.*) ohne Vorwarnung.\n\ - /Z Löscht versteckte, mit nur leserechten und Systemdateien.\n" + /Z Löscht versteckte Dateien mit Nur-Leserechten und Systemdateien.\n" -STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden gelöscht!\nSind Sie sicher (Y/N)?" +STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden gelöscht!\nSind Sie sich sicher (Y/N)?" STRING_DEL_HELP3, " %lu Datei(en) gelöscht\n" STRING_DEL_HELP4, " %lu Datei(en) gelöscht\n" STRING_DELAY_HELP, "Pause für n Sekunden oder Millisekunden\n\ DELAY [/m]n\n\n\ - /m Millisekunden ansonsten Sekunden\n" + /m Millisekunden, ansonsten Sekunden\n" STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\ DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ @@ -199,7 +199,7 @@ DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ werden Leerzeichen angezeigt.\n\ /4 Zeigt das Jahr vierstellig an.\n\n\ Optionen können in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\ -""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W." +""-"" vor einer Option setzt die Voreinstellung außer Kraft, z.B. DIR /-W." STRING_DIR_HELP2, " Datenträger in Laufwerk %c ist %s\n" STRING_DIR_HELP3, " Datenträger in Laufwerk %c hat keine Bezeichnung\n" @@ -209,25 +209,25 @@ STRING_DIR_HELP6, "%16i Verzeichnis(se), % 15s Bytes frei\n" STRING_DIR_HELP7, "\n Verzeichnis von %s\n\n" STRING_DIR_HELP8, "%16i Datei(en)% 14s Bytes\n" -STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis für den POPD Befehl, und\n\ -wechselt dann zu den festgelegten Verzeichnis.\n\n\ +STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis für den POPD-Befehl und\n\ +wechselt dann in das festgelegte Verzeichnis.\n\n\ PUSHD [path | ..]\n\n\ - path Legt das Verzeichnis fest zu welchem gewechselt werden soll" + path Legt das Verzeichnis fest, in das gewechselt werden soll" -STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD" +STRING_DIRSTACK_HELP2, "Wechselt in das Verzeichnis, das vom PUSHD-Befehl gespeichert wurde.\n\nPOPD" STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS" STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer" -STRING_ECHO_HELP1, "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\ +STRING_ECHO_HELP1, "Sendet eine Nachricht, ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\ ECHOS message" -STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\ +STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard-Fehlerausgabe.\n\n\ ECHOERR Nachricht\n\ ECHOERR. gibt eine Leerzeile aus" -STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\ +STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard-Fehlerausgabe, ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\ ECHOSERR Nachricht" STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\ @@ -252,11 +252,11 @@ statt %Variable an." STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\ Volume-Seriennummer: %s\n\ - %16s bytes Speicherkapazität\n\ - %16s bytes belegter Speicher\n\ - %16s bytes freier Speicher\n" + %16s Byte Speicherkapazität\n\ + %16s Byte belegter Speicher\n\ + %16s Byte freier Speicher\n" -STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]" +STRING_FREE_HELP2, "Zeigt die Volumeinformationen an.\n\nFREE [Laufwerk: ...]" STRING_IF_HELP1, "Verarbeitet Ausdrücke in einer Batchdatei abhängig von Bedingungen.\n\n\ IF [NOT] ERRORLEVEL Nummer Befehl\n\ @@ -292,12 +292,12 @@ STRING_LOCALE_HELP1, "Aktuelle Zeit: " STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\ MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad" -STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\ -MKLINK [/D | /H | /J] linkname target\n\n\ - /D Indicates that the symbolic link target is a directory.\n\ - /H Create a hard link.\n\ - /J Create a directory junction.\n\n\ -If neither /H or /J is specified, a symbolic link is created." +STRING_MKLINK_HELP, "Erzeugt eine Dateisystemverknüpfung.\n\n\ +MKLINK [/D | /H | /J] Linkname Ziel\n\n\ + /D Gibt an, dass das Ziel der Verknüpfung ein Verzeichnis ist.\n\ + /H Erzeugt einen Hardlink.\n\ + /J Erzeugt einen Junction Point.\n\n\ +Wenn weder /H noch /J angegeben werden, wird eine symbolische Verknüpfung angelegt." STRING_MEMMORY_HELP1, "Zeigt die Größe des Systemspeicher an.\n\nMEMORY" @@ -307,7 +307,7 @@ STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\ %13s bytes Auslagerungsdatei (insgesamt)\n\ %13s bytes verfügbare Auslagerungsdatei\n\n\ %13s bytes Virtueller Speicher (insgesamt)\n\ - %13s bytes verfügbarer Virtueller Speicher\n" + %13s bytes verfügbarer virtueller Speicher\n" STRING_MISC_HELP1, "Drücken Sie eine beliebige Taste . . .\n" @@ -320,9 +320,9 @@ Um ein Verzeichnis umzubenennen:\n\ MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\ [Laufwerk:][Pfad]Datei1 Bezeichnet den Pfad und den Namen der zu\n\ verschiebenden Datei(en).\n\ - /N Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\ + /N Nichts. Tut alles außer Dateien/Verzeichnisse verschieben.\n\n\ Derzeitige Einschränkung:\n\ -Es ist noch nicht möglich Objekte über die Laufwerksgrenzen hinaus zu verschieben.\n" +Es ist noch nicht möglich, Objekte über die Laufwerksgrenzen hinaus zu verschieben.\n" STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\ MSGBOX type ['title'] prompt\n\n\ @@ -331,7 +331,7 @@ type Button anzeigen\n\ YESNO, YESNOCANCEL\n\ title Titel des Fensters\n\ prompt Text der in dem Fenster angezeigt wird\n\n\n\ -ERRORLEVEL is set according the button pressed:\n\n\ +ERRORLEVEL wird je nach dem gedrückten Button gesetzt:\n\n\ YES : 10 | NO : 11\n\ OK : 10 | CANCEL : 12\n" @@ -387,9 +387,9 @@ REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\ /T Zeigt die Anzahl der umbenannten Dateien an.\n\n\ Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n" -STRING_REN_HELP2, " %lu Datei umbennant\n" +STRING_REN_HELP2, " %lu Datei umbenannt\n" -STRING_REN_HELP3, " %lu Dateien umbennant\n" +STRING_REN_HELP3, " %lu Dateien umbenannt\n" STRING_REPLACE_HELP1, "Ersetzt Dateien.\n\n\ REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/A] [/P] [/R] [/W]\n\ @@ -405,7 +405,7 @@ REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/P] [/R] [/S] [/W] [/U /S Ersetzt Dateien in allen Unterordnern des Ziel-\n\ pfades. Kann nicht mit Parameter /A genutzt\n\ werden.\n\ - /W Wartet vor dem Start bis ein Datenträger\n\ + /W Wartet vor dem Start, bis ein Datenträger\n\ eingelegt wurde.\n\ /U Ersetzt (aktualisiert) nur Dateien, die älter\n\ sind als die Quelldaten. Kann nicht mit Paramater\n\ @@ -495,7 +495,7 @@ STRING_VERIFY_HELP2, "VERIFY ist %s.\n" STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein" -STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\ +STRING_VERSION_HELP1, "Zeigt Shellinformationen an.\n\n\ VER [/C][/R][/W]\n\n\ /C Zeigt die Credits an.\n\ /R Zeigt die Weitergabeinformationen an.\n\ @@ -521,9 +521,9 @@ STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an .\n\ Updates sind auf der offiziellen ReactOS-Webseite verfügbar:\n\ http://www.reactos.org" -STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n" +STRING_VERSION_HELP6, "\nFreeDOS-Version programmiert von:\n" -STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n" +STRING_VERSION_HELP7, "\nReactOS-Version programmiert von:\n" STRING_VOL_HELP1, " Datenträger im Laufwerk %c ist %s\n" STRING_VOL_HELP2, " Datenträger im Laufwerk %c hat keine Bezeichnung.\n" @@ -554,7 +554,7 @@ STRING_HELP1, " ? Listet alle Befehle auf (ohne Erklärung).\n\ ALIAS Setzt, löscht oder zeigt den Alias.\n\ ATTRIB Zeigt Dateiattribute an bzw. ändert sie.\n\ -BEEP Gibt einen piep-Ton durch den PC-Speaker aus.\n\ +BEEP Gibt einen Piepton durch den PC-Speaker aus.\n\ CALL Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\ CD Zeigt den Namen des aktuellen Verzeichnisses an bzw. ändert diesen.\n\ CHCP Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\ @@ -581,7 +581,7 @@ IF Verarbeitet Ausdr LABEL Erstellt, ändert oder löscht die Bezeichnung eines Volumes.\n\ MD Erstellt ein Verzeichnis.\n\ MKDIR Erstellt ein Verzeichnis.\n\ -MKLINK Creates a filesystem link object.\n\ +MKLINK Erzeugt eine Dateisystemverknüpfung.\n\ MOVE Verschiebt eine oder mehrere Dateien von einem Verzeichnis in\n\ ein anderes.\n\ PATH Legt den Suchpfad für ausführbare Dateien fest oder zeigt diesen an.\n\ @@ -615,9 +615,9 @@ STRING_COPY_OPTION, "JNA" STRING_ALIAS_ERROR, "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n" STRING_ASSOC_ERROR, "Dateizuordnung für Erweiterung %s nicht gefunden\n" -STRING_BATCH_ERROR, "Es trat ein Fehler auf, während die Batch-Datei geöffnet wurde.\n" -STRING_CHCP_ERROR1, "Aktive Code-Page: %u\n" -STRING_CHCP_ERROR4, "Ungültige Code-Page\n" +STRING_BATCH_ERROR, "Es trat ein Fehler auf, während die Batchdatei geöffnet wurde.\n" +STRING_CHCP_ERROR1, "Aktive Codepage: %u\n" +STRING_CHCP_ERROR4, "Ungültige Codepage\n" STRING_CHOICE_ERROR, "Ungültige Option. Erwartetes Format: /C[:]options" STRING_CHOICE_ERROR_TXT, "Ungültige Option. Erwartetes Format: /T[:]c,nn" STRING_CHOICE_ERROR_OPTION, "Ungültige Option: %s" @@ -628,7 +628,7 @@ STRING_CMD_ERROR3, "%s kann nicht in die Datei umgeleitet werden \n" STRING_CMD_ERROR4, "Ausführend %s...\n" STRING_CMD_ERROR5, "Ausführend cmdexit.bat...\n" STRING_COLOR_ERROR1, "Fehler: Hinter- und Vordergrund können nicht die selben Farben haben!" -STRING_COLOR_ERROR2, "Fehler in der Farb-Angabe" +STRING_COLOR_ERROR2, "Fehler in der Farbangabe" STRING_COLOR_ERROR3, "Farbe %x\n" STRING_COLOR_ERROR4, "Fehler: Die selben Farben!" STRING_CONSOLE_ERROR, "Unbekannter Fehler: %d\n" @@ -679,19 +679,19 @@ STRING_REPLACE_ERROR5, "Zugriff verweigert - %s\n" STRING_REPLACE_ERROR6, "Keine Dateien gefunden - %s\n" STRING_REPLACE_ERROR7, "Erweiterter Fehler 32\n" STRING_REACTOS_VERSION, "ReactOS Operating System [Version %s-%s]\n" -STRING_CMD_SHELLINFO, "\nReactOS Befehlszeilen Interpreter\nVersion %s %s" +STRING_CMD_SHELLINFO, "\nReactOS-Befehlszeileninterpreter\nVersion %s %s" STRING_VERSION_RUNVER, " läuft in %s" STRING_COPY_FILE , " %d Datei(en) kopiert\n" -STRING_DELETE_WIPE, "gewiped" +STRING_DELETE_WIPE, "sicher gelöscht" STRING_FOR_ERROR, "ungültige Variablenangabe." STRING_SCREEN_COL, "ungültige Spalten-Angabe" STRING_SCREEN_ROW, "ungültige Zeilen-Angabe" STRING_TIMER_TIME "Timer %d ist %s: " -STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n" -STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n" -STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n" -STRING_MORE, "More? " -STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Ja/Nein/Alle) " +STRING_MKLINK_CREATED_SYMBOLIC, "Symbolische Verknüpfung erstellt für %s <<===>> %s\n" +STRING_MKLINK_CREATED_HARD, "Hardlink erstellt für %s <<===>> %s\n" +STRING_MKLINK_CREATED_JUNCTION, "Junction Point erstellt für %s <<===>> %s\n" +STRING_MORE, "Mehr? " +STRING_CANCEL_BATCH_FILE, "\r\nStrg-Pause gedrückt. Batchvorgang abbrechen? (Ja/Nein/Alle) " STRING_INVALID_OPERAND, "Ungültiger Operand." STRING_EXPECTED_CLOSE_PAREN, "Erwartet ')'." STRING_EXPECTED_NUMBER_OR_VARIABLE,"Erwartet Nummer oder Variablennamen." diff --git a/reactos/base/shell/explorer-new/lang/de-DE.rc b/reactos/base/shell/explorer-new/lang/de-DE.rc index 2445bb2d96e..80aefc0c32a 100644 --- a/reactos/base/shell/explorer-new/lang/de-DE.rc +++ b/reactos/base/shell/explorer-new/lang/de-DE.rc @@ -5,7 +5,7 @@ BEGIN POPUP "" BEGIN MENUITEM SEPARATOR - MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR + MENUITEM "Taskmanager", ID_SHELL_CMD_OPEN_TASKMGR MENUITEM SEPARATOR MENUITEM "Taskbar fi&xieren", ID_LOCKTASKBAR MENUITEM "E&igenschaften", ID_SHELL_CMD_PROPERTIES @@ -56,60 +56,60 @@ END IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Taskbar" +CAPTION "Taskleiste" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121 + GROUPBOX "Taskleiste", IDC_STATIC, 6,6,240,121 CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21 - AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10 - AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10 - AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10 - AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10 - AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10 - AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10 + AUTOCHECKBOX "Task&leiste fixieren", IDC_TASKBARPROP_LOCK, 13,45,200,10 + AUTOCHECKBOX "Taskleiste a&utom. verstecken", IDC_TASKBARPROP_HIDE, 13,58,200,10 + AUTOCHECKBOX "&Taskleiste immer im Vordergrund halten", IDC_TASKBARPROP_ONTOP, 13,71,200,10 + AUTOCHECKBOX "Ähnliche Buttons &gruppieren", IDC_TASKBARPROP_GROUP, 13,84,200,10 + AUTOCHECKBOX "Schnellstartleiste &anzeigen", IDC_TASKBARPROP_SHOWQL, 13,97,200,10 + AUTOCHECKBOX "Fenstervor&schau anzeigen", IDC_TASKBARPROP_WNDPREV, 13,110,200,10 END IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Start Menu" +CAPTION "Startmenü" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10 - LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED - AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED - LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED - GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42 - AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED - AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED + AUTORADIOBUTTON "Modernes &Startmenü", IDC_TASKBARPROP_STARTMENU, 7,7,105,10 + LTEXT "Dieser Stil gewährt Ihnen einfachen Zugriff auf Ihre Verzeichnisse, bevorzugten Programme und die Suchfunktion.", IDC_STATIC, 20,17,150,24, WS_DISABLED + PUSHBUTTON "An&passen...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED + AUTORADIOBUTTON "Klassisches Start&menü", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED + LTEXT "Dieser Stil beinhaltet das klassische Aussehen mit gewohnter Funktionalität",-1,20,57,150,24, WS_DISABLED + PUSHBUTTON "An&passen...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED + GROUPBOX "Privatsphäre",IDC_STATIC, 7,100,238,42 + AUTOCHECKBOX "Eine Liste zuletzt geö&ffneter Dateien führen", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED + AUTOCHECKBOX "Eine Liste zuletzt gestarteter &Programme führen",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED END IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Notification Area" +CAPTION "Benachrichtigungsfeld" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED - GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED - LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED - AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED - GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED - LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED - AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED - AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED - AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED - AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED + GROUPBOX "Symbole", IDC_STATIC, 6,33,240,58, WS_DISABLED + LTEXT "Das Benachrichtigungsfeld kann übersichtlich gestaltet werden, indem selten verwendete Symbole ausgeblendet werden.", IDC_STATIC, 13,48,223,16, WS_DISABLED + AUTOCHECKBOX "&Inaktive Symbole ausblenden", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED + PUSHBUTTON "An&passen...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED + GROUPBOX "Systemsymbole", IDC_STATIC, 6,97,240,84, WS_DISABLED + LTEXT "Wählen Sie die Systemsymbole aus, die immer angezeigt werden sollen.", IDC_STATIC, 13,112,223,16, WS_DISABLED + AUTOCHECKBOX "&Uhr", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED + AUTOCHECKBOX "Lautstär&ke", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED + AUTOCHECKBOX "&Netzwerk", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED + AUTOCHECKBOX "&Akku", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED END IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Toolbars" +CAPTION "Symbolleisten" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED + LTEXT "Wählen Sie aus, welche Symbolleisten der Taskleiste hinzugefügt werden sollen.", IDC_STATIC, 7,7,223,12, WS_DISABLED CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE END @@ -118,11 +118,11 @@ STRINGTABLE DISCARDABLE BEGIN IDS_START "Start" IDS_PROPERTIES "E&igenschaften" - IDS_OPEN_ALL_USERS "Öffnen &Alle Benutzer" - IDS_EXPLORE_ALL_USERS "Explorer A&lle Benutzer" + IDS_OPEN_ALL_USERS "Öffnen (&Alle Benutzer)" + IDS_EXPLORE_ALL_USERS "Explorer (A&lle Benutzer)" END STRINGTABLE DISCARDABLE BEGIN - IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties" + IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskleisten- und Startmenüeinstellungen" END diff --git a/reactos/base/shell/explorer/explorer-de.rc b/reactos/base/shell/explorer/explorer-de.rc index d7062378467..658b0ddb334 100644 --- a/reactos/base/shell/explorer/explorer-de.rc +++ b/reactos/base/shell/explorer/explorer-de.rc @@ -64,7 +64,7 @@ BEGIN END POPUP "&Hilfe" BEGIN - MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "Explorer-&FAQ...", ID_EXPLORER_FAQ MENUITEM "&Über ReactOS Explorer...", ID_ABOUT_EXPLORER MENUITEM "Über React&OS...", ID_ABOUT_WINDOWS END @@ -76,7 +76,7 @@ BEGIN BEGIN MENUITEM "&Ausführen...", ID_EXECUTE MENUITEM SEPARATOR - MENUITEM "&Schliessen", ID_FILE_EXIT + MENUITEM "&Schließen", ID_FILE_EXIT END POPUP "&Ansicht" BEGIN @@ -94,9 +94,9 @@ BEGIN END POPUP "&Hilfe" BEGIN - MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "Explorer-&FAQ...", ID_EXPLORER_FAQ MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER - MENUITEM "Über &OS...", ID_ABOUT_WINDOWS + MENUITEM "Über React&OS...", ID_ABOUT_WINDOWS END END @@ -105,7 +105,7 @@ BEGIN POPUP "" BEGIN MENUITEM "&Einstellungen...", ID_DESKTOPBAR_SETTINGS - MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM "&Taskmanager...", ID_TASKMGR MENUITEM SEPARATOR MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER END @@ -129,7 +129,7 @@ BEGIN POPUP "" BEGIN MENUITEM "Öffne &Lautstärkeregler", ID_TRAY_VOLUME - MENUITEM "Editieren der Audio-&Einstellungen", ID_VOLUME_PROPERTIES + MENUITEM "Ändern der Audio-&Einstellungen", ID_VOLUME_PROPERTIES END END @@ -177,27 +177,27 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Bitte wählen Sie den gewünschten Platzierungs-Algorithmus für die Desktop-Symbole aus:", IDC_STATIC,7,7,197,23 - CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + CONTROL "li./ob. abw.",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,35,46,44 - CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + CONTROL "li./ob. re.",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,35,46,44 - CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + CONTROL "re./ob. li.",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,35,46,44 - CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + CONTROL "re./ob. abw.",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,35,46,44 - CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + CONTROL "li./unt. aufw.",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,83,46,44 - CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + CONTROL "li./unt. re.",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,83,46,44 - CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + CONTROL "re./unt. li.",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,83,46,44 - CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + CONTROL "re./unt. aufw.",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,83,46,44 - CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + CONTROL "Rahmen abw.",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,131,46,44 - CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + CONTROL "Rahmen H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,131,46,44 - CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + CONTROL "im Kreis",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,131,46,44 CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,131,46,44 @@ -242,7 +242,7 @@ BEGIN CONTROL "Öffne Unterverzeichnisses in &neuen Fenstern", IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,90,157,10 - LTEXT "Diese Auswahl wird künftig für alle Explorer-Fenster verwendet werden.", + LTEXT "Diese Auswahl wird künftig für alle Explorerfenster verwendet werden.", IDC_STATIC,7,111,174,22 DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP PUSHBUTTON "A&bbrechen",IDCANCEL,106,136,50,14 @@ -344,7 +344,7 @@ BEGIN IDS_FAVORITES "Favoriten" IDS_PROGRAMS "Programme" IDS_SETTINGS "Einstellungen" - IDS_EXPLORE "Explore" + IDS_EXPLORE "Explorer" IDS_EMPTY "(Leer)" IDS_RECENT "Aktuelle Dokumente" IDS_ADMIN "Verwaltung" @@ -383,7 +383,7 @@ BEGIN IDS_SEARCH "Suche" IDS_ABOUT_EXPLORER "&Über Explorer..." IDS_LAUNCH_MANY_PROGRAMS - "Sie haben mehrere Programme ausgewählt.\nSind Sie sicher, daß Sie diese alle starten wollen?" + "Sie haben mehrere Programme ausgewählt.\nSind Sie sich sicher, dass Sie diese alle starten wollen?" IDS_DESKTOPBAR_SETTINGS "Desktop-Einstellungen" IDS_DESKTOP "Desktop" IDS_TASKBAR "Taskbar" diff --git a/reactos/base/system/format/lang/de-DE.rc b/reactos/base/system/format/lang/de-DE.rc index c3c08486b9c..9620be2ed2f 100644 --- a/reactos/base/system/format/lang/de-DE.rc +++ b/reactos/base/system/format/lang/de-DE.rc @@ -28,9 +28,9 @@ STRING_HELP, "Syntax: %s Datentr STRING_COMPLETE "%lu Prozent komplett.\r" -STRING_FORMAT_FAIL "FormatEx konnte Operation nicht erfolgreich beenden.\n\n" +STRING_FORMAT_FAIL "FormatEx konnte Vorgang nicht erfolgreich beenden.\n\n" -STRING_NO_SUPPORT "Operation nicht unterstützt" +STRING_NO_SUPPORT "Vorgang nicht unterstützt" STRING_FMIFS_FAIL "Kann FMIFS-Eingangspunkte nicht lokalisieren.\n\n" @@ -40,11 +40,11 @@ STRING_DRIVE_PARM "Ben STRING_ERROR_DRIVE_TYPE "Konnte den Laufwerkstyp nicht erhalten" -STRING_INSERT_DISK "Legen Sie eine neue Diskette in Laufwerk %C: ein\nund drücken Sie Enter wenn das Laufwerk bereit ist" +STRING_INSERT_DISK "Legen Sie eine neue Diskette in Laufwerk %C: ein\nund betätigen Sie die Eingabetaste, wenn das Laufwerk\nbereit ist." STRING_NO_VOLUME "Kann Medium nicht abfragen" -STRING_NO_VOLUME_SIZE "Kann Mediumsgröße nicht abfragen" +STRING_NO_VOLUME_SIZE "Kann Mediengröße nicht abfragen" STRING_FILESYSTEM "Der Typ des Dateisystems ist %s.\n" @@ -70,7 +70,7 @@ STRING_ENTER_LABEL "Datentr STRING_NO_LABEL "Konnte Datenträger nicht benennen" -STRING_FREE_SPACE "\n%I64d bytes Speicherkapazität.\n%I64d bytes freier Speicher.\n" +STRING_FREE_SPACE "\n%I64d Byte Speicherkapazität.\n%I64d bytes freier Speicher.\n" -STRING_SERIAL_NUMBER "\nDatenträger Seriennummer ist %04X-%04X\n" +STRING_SERIAL_NUMBER "\nDatenträger-Seriennummer ist %04X-%04X\n" END diff --git a/reactos/base/system/regsvr32/lang/de-DE.rc b/reactos/base/system/regsvr32/lang/de-DE.rc index c467baf88da..dd519a07744 100644 --- a/reactos/base/system/regsvr32/lang/de-DE.rc +++ b/reactos/base/system/regsvr32/lang/de-DE.rc @@ -12,7 +12,7 @@ IDS_UsageMessage, "%s\n\nSyntax: regsvr32 [/u] [/s] [/c] [/n] [/i[:cmdline]] dll /s - Hintergrundmodus; Meldungen werden nicht angezeigt\n\ /c - Konsolenausgabe verwenden\n\ /i - Aufruf von DLLInstall, wobei optional eine [Befehlszeile] übergeben\n\ - werden kann. Unter Verwendung von /u wird die DLL_Deinstallation\n\ + werden kann. Unter Verwendung von /u wird die DLL-Deinstallation\n\ aufgerufen.\n\ /n - Kein Aufruf von DLLRegisterServer. Diese Option muss mit /i verwendet werden." @@ -20,12 +20,12 @@ IDS_NoDllSpecified, "Es wurde kein DLL-Name angegeben." IDS_InvalidFlag, "Ungültiger Parameter: %s" -IDS_SwitchN_NoI, "Ungültiger Parameter: /n muss zusammen mit dem /i Schalter verwendet werden." +IDS_SwitchN_NoI, "Ungültiger Parameter: /n muss zusammen mit dem /i-Schalter verwendet werden." -IDS_DllNotLoaded, "LoadLibrary('%s') ist fehlgeschlagen.\nGetLastError Rückgabewert 0x%08x." +IDS_DllNotLoaded, "LoadLibrary('%s') ist fehlgeschlagen.\nGetLastError-Rückgabewert 0x%08x." IDS_MissingEntry, "%s wurde geladen, aber der %s Einstiegspunkt wurde nicht gefunden.\n\n\ -%s wurde möglicherweise nicht exportiert, oder eine fehlerhafte Version von %s befindet sich im Speicher. Erwägen Sie die Verwendung von PView um es festzustellen und zu löschen." +%s wurde möglicherweise nicht exportiert, oder eine fehlerhafte Version von %s befindet sich im Speicher. Erwägen Sie die Verwendung von PView, um es festzustellen und zu löschen." IDS_FailureMessage, "%s in %s ist fehlgeschlagen.\nRückgabewert: 0x%08x" diff --git a/reactos/base/system/runonce/lang/de-DE.rc b/reactos/base/system/runonce/lang/de-DE.rc new file mode 100644 index 00000000000..44df265a81d --- /dev/null +++ b/reactos/base/system/runonce/lang/de-DE.rc @@ -0,0 +1,11 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +IDD_RUNONCE_DLG DIALOG DISCARDABLE 0, 0, 239, 170 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS-Setup" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ReactOS nimmt nun die folgenden Einstellungen vor:", -1, 38, 8, 196, 18 + LISTBOX IDC_COMP_LIST, 36, 32, 197, 131, LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + ICON IDI_ICON, -1, 5, 6, 21, 20 +END diff --git a/reactos/base/system/runonce/rsrc.rc b/reactos/base/system/runonce/rsrc.rc index 540fe8abd20..cc21daecfe9 100644 --- a/reactos/base/system/runonce/rsrc.rc +++ b/reactos/base/system/runonce/rsrc.rc @@ -1,3 +1,4 @@ +#include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" #include "lang/ja-JP.rc" diff --git a/reactos/base/system/winlogon/lang/de-DE.rc b/reactos/base/system/winlogon/lang/de-DE.rc index 398907674e7..22acc39d009 100644 --- a/reactos/base/system/winlogon/lang/de-DE.rc +++ b/reactos/base/system/winlogon/lang/de-DE.rc @@ -14,11 +14,11 @@ END IDD_GINALOADFAILED DIALOGEX 58, 83, 231, 119 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Benutzer Interface Fehler" +CAPTION "Benutzerinterface-Fehler" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Die Logon Benutzer Schnittstelle DLL %s konnte nicht geladen werden.", IDC_GINALOADFAILED, 39, 16, 156, 24 - LTEXT "Kontaktieren Sie Ihren Systemadministrator um die DLL zu ersetzen, oder stellen Sie die Original-DLL wieder her.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25 + LTEXT "Die Logon-Benutzerschnittstellen-DLL %s konnte nicht geladen werden.", IDC_GINALOADFAILED, 39, 16, 156, 24 + LTEXT "Kontaktieren Sie Ihren Systemadministrator, um die DLL zu ersetzen, oder stellen Sie die Original-DLL wieder her.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25 DEFPUSHBUTTON "Neusta&rt", 1, 80, 91, 68, 14 END @@ -32,9 +32,9 @@ BEGIN IDS_RUNNINGLOGOFFSCRIPTS "Abmeldeskripte ausführen..." IDS_RUNNINGLOGONSCRIPTS "Anmeldeskripte ausführen..." IDS_LOADINGYOURPERSONALSETTINGS "Ihre persönlichen Einstellungen laden..." - IDS_CLOSINGNETWORKCONNECTIONS "Netzwerkverbindungen schliessen..." + IDS_CLOSINGNETWORKCONNECTIONS "Netzwerkverbindungen schließen..." IDS_REACTOSISSHUTTINGDOWN "ReactOS fährt herunter..." - IDS_PREPARETOSTANDBY "Vorbereiten für den StandBy Modus..." + IDS_PREPARETOSTANDBY "Vorbereiten für den Stromsparmodus..." IDS_PREPARETOHIBERNATE "Vorbereiten für den Ruhezustand..." IDS_SAVEYOURSETTINGS "Speichern Ihrer persönlichen Einstellungen..." IDS_REACTOSISSTARTINGUP "ReactOS startet..." diff --git a/reactos/dll/cpl/access/lang/de-DE.rc b/reactos/dll/cpl/access/lang/de-DE.rc index 3f8de377b94..50fb674e97b 100644 --- a/reactos/dll/cpl/access/lang/de-DE.rc +++ b/reactos/dll/cpl/access/lang/de-DE.rc @@ -23,7 +23,7 @@ BEGIN AUTOCHECKBOX "&Signalfunktion benutzen",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "Ei&nstellungen",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(20)+2,PROPSHEETPADDING(15),14 - AUTOCHECKBOX "Extra Tastaturhilfe in &Programmen anzeigen ",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 + AUTOCHECKBOX "Extra-Tastaturhilfe in &Programmen anzeigen ",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 END @@ -75,7 +75,7 @@ CAPTION "Maus" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN GROUPBOX "Tastaturmaus",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "Aktivieren Sie diese Option, um den Mauszeiger mit dem Nummernpad der Tastatur zu steuern.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "Aktivieren Sie diese Option, um den Mauszeiger mit den Nummerntasten der Tastatur zu steuern.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "&Tastaturmaus aktivieren",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "&Einstellungen",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 END @@ -112,12 +112,12 @@ CAPTION "Einstellungen f FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "Drücken Sie fünfmal die Umschalttaste um die Einrastfunktion zu aktivieren.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "Drücken Sie fünfmal die Umschalttaste, um die Einrastfunktion zu aktivieren.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "Tastenkombination a&ktivieren",IDC_STICKY_ACTIVATE_CHECK,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETPADDING(17)+4,14 GROUPBOX "Optionen",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) AUTOCHECKBOX "&Zum Einrasten Feststelltaste zweimal drücken.",IDC_STICKY_LOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(10)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 - AUTOCHECKBOX "&Einrastfunktion deaktivieren wenn zwei Tasten gedrückt sind.",IDC_STICKY_UNLOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(12),PROPSHEETWIDTH-PROPSHEETPADDING(4),14 + AUTOCHECKBOX "&Einrastfunktion deaktivieren, wenn zwei Tasten gedrückt sind.",IDC_STICKY_UNLOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(12),PROPSHEETWIDTH-PROPSHEETPADDING(4),14 GROUPBOX "Mitteilungen",-1,PROPSHEETPADDING(1),LABELLINE(15),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) AUTOCHECKBOX "&Ausgabe eines Tons wenn die Feststelltaste gedrückt wird.",IDC_STICKY_SOUND_CHECK,PROPSHEETPADDING(2),LABELLINE(16)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 @@ -130,7 +130,7 @@ END IDD_FILTERKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Anschlagverzögerung Einstellungen" +CAPTION "AnschlagverzögerungseEinstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) @@ -150,13 +150,13 @@ BEGIN AUTOCHECKBOX "Status der Ansc&hlagverzögerung auf dem Bildschirm anzeigen.",IDC_FILTER_STATUS_CHECK,PROPSHEETPADDING(2),LABELLINE(20)+6,PROPSHEETWIDTH-PROPSHEETPADDING(4),10 DEFPUSHBUTTON "OK", IDOK, PROPSHEETWIDTH-111, PROPSHEETHEIGHT-21, 50, 14 - PUSHBUTTON "Abrechen", IDCANCEL, PROPSHEETWIDTH-57, PROPSHEETHEIGHT-21, 50, 14 + PUSHBUTTON "Abbrechen", IDCANCEL, PROPSHEETWIDTH-57, PROPSHEETHEIGHT-21, 50, 14 END IDD_TOGGLEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Toggle Keys Einstellungen" +CAPTION "Toggle-Keys-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) @@ -170,14 +170,14 @@ END IDD_CONTRASTOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Hoher Konstrast Einstellungen" +CAPTION "Einstellungen für hohen Konstrast" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) LTEXT "Die Tastenkombination für hohen Kontrast ist:\nDrücke .",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "&Wähle Schnelltaste",IDC_CONTRAST_ACTIVATE_CHECK,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 - GROUPBOX "Hoher Kontrast Farbschema",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) + GROUPBOX "Hoher-Kontrast-Farbschema",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) LTEXT "Derzeitiges Farbschema:",-1,PROPSHEETPADDING(2),LABELLINE(10)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(1) COMBOBOX IDC_CONTRAST_COMBO, PROPSHEETPADDING(2), LABELLINE(11)+2, PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6), CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP @@ -189,7 +189,7 @@ END IDD_MOUSEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Tastaturmaus Einstellungen" +CAPTION "Tastaturmaus-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombiation",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) @@ -223,10 +223,10 @@ END IDD_BOUNCEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erweiterte Anschlagverzögerung Einstellungen" +CAPTION "Einstellungen für die erweiterte Anschlagverzögerung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Bounce Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5) + GROUPBOX "Tastenanschläge",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5) LTEXT "&Tastenanschläge igorieren, die schneller wiederholt werden als:",-1,PROPSHEETPADDING(2),LABELLINE(2)+1,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) COMBOBOX IDC_BOUNCE_TIME_COMBO, PROPSHEETPADDING(2), LABELLINE(3)+5, PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6), CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP @@ -241,10 +241,10 @@ END IDD_REPEATKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erweiterte Anschlagverzögerung Einstellungen" +CAPTION "Einstellungen für die erweiterte Anschlagverzögerung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Repeat Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(12) + GROUPBOX "Tastenwiederholung",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(12) LTEXT "Tastatureinstellungen in der Systemsteuerung übergehen:",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) AUTORADIOBUTTON "&Keine Wiederholung",IDC_REPEAT_NOREPEAT_RADIO,PROPSHEETPADDING(2),LABELLINE(3)+3,78,LABELLINE(1),WS_GROUP @@ -273,7 +273,7 @@ END IDD_SERIALKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "SerialKeys Einstellungen" +CAPTION "SerialKeys-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Serial Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(10) diff --git a/reactos/dll/cpl/appwiz/lang/de-DE.rc b/reactos/dll/cpl/appwiz/lang/de-DE.rc index fe55301c09f..b2c32d21b94 100644 --- a/reactos/dll/cpl/appwiz/lang/de-DE.rc +++ b/reactos/dll/cpl/appwiz/lang/de-DE.rc @@ -43,7 +43,7 @@ END STRINGTABLE BEGIN - IDS_CPLSYSTEMNAME "Programme Hinzufügen/Entfernen" + IDS_CPLSYSTEMNAME "Programme hinzufügen/entfernen" IDS_CPLSYSTEMDESCRIPTION "Installiert Programme und erstellt Verknüpfungen." IDS_CREATE_SHORTCUT "Verknüpfung erstellen" IDS_ERROR_NOT_FOUND "Die Datei %s konnte nicht gefunden werden." diff --git a/reactos/dll/cpl/console/lang/de-DE.rc b/reactos/dll/cpl/console/lang/de-DE.rc index e01dc0ad68c..a6611419d53 100644 --- a/reactos/dll/cpl/console/lang/de-DE.rc +++ b/reactos/dll/cpl/console/lang/de-DE.rc @@ -20,7 +20,7 @@ GROUPBOX "Cursorgr CONTROL "&Klein", IDC_RADIO_SMALL_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 25, 90, 10 CONTROL "&Mittel", IDC_RADIO_MEDIUM_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 40, 90, 10 CONTROL "&Groß", IDC_RADIO_LARGE_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 90, 10 -GROUPBOX "Display Einstellungen", -1, 140, 15, 100, 70, WS_CHILD | WS_VISIBLE | WS_GROUP +GROUPBOX "Anzeigeeinstellungen", -1, 140, 15, 100, 70, WS_CHILD | WS_VISIBLE | WS_GROUP CONTROL "&Fenster", IDC_RADIO_DISPLAY_WINDOW, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 35, 70, 10 CONTROL "V&ollbild", IDC_RADIO_DISPLAY_FULL, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 50, 70, 10 GROUPBOX "Befehlsspeicher:", -1, 15, 90, 120, 70, WS_CHILD | WS_VISIBLE | WS_GROUP @@ -34,7 +34,7 @@ CHECKBOX "&Alte Duplikate l GROUPBOX "Bearbeitungsoptionen", -1, 140, 90, 100, 70, BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP -CHECKBOX "&QuickEdit Modus", IDC_CHECK_QUICK_EDIT, 150, 100, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP +CHECKBOX "&QuickEdit-Modus", IDC_CHECK_QUICK_EDIT, 150, 100, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP CHECKBOX "&Einfügemodus", IDC_CHECK_INSERT_MODE, 150, 120, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP END @@ -53,7 +53,7 @@ LISTBOX IDC_LBOX_TYPE, 10, 120, 110, 50, LBS_DISABLENOSCROLL | WS_VSCROLL GROUPBOX "", IDC_GROUPBOX_FONT_NAME, 10, 155, 200, 50 CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 15, 165, 95, 35 LTEXT "Jedes Zeichen ist:", -1, 130, 165, 75, 10 -LTEXT "screen pixel breit\nscreen pixel hoch", -1, 140, 180, 65, 20 +LTEXT "Bildschirmpixeö breit\nBildschirmpixel hoch", -1, 140, 180, 65, 20 LTEXT "", IDC_FONT_SIZE_X, 125, 180, 10, 10 LTEXT "", IDC_FONT_SIZE_Y, 125, 188, 10, 10 END @@ -147,5 +147,5 @@ BEGIN IDS_CPLDESCRIPTION "Konfiguriert die Konsoleneigenschaften." IDS_APPLY_SHORTCUT_ALL "Modifiziere die &Verknüpfung, die das Fenster startete" IDS_SCREEN_TEXT "C:\ReactOS> dir\nSYSTEM 10-01-99 5:00\nSYSTEM32 10-01-99 5:00" - IDS_RASTERFONTS "Raster Schriften" + IDS_RASTERFONTS "Rasterschriften" END diff --git a/reactos/dll/cpl/desk/lang/de-DE.rc b/reactos/dll/cpl/desk/lang/de-DE.rc index 4deba826591..d0829d9fbc0 100644 --- a/reactos/dll/cpl/desk/lang/de-DE.rc +++ b/reactos/dll/cpl/desk/lang/de-DE.rc @@ -124,7 +124,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Verschieben Sie die Monitor-Symbole, sodass sie der physikalischen Anordnung Ihrer Monitore entsprechen.",-1,3,1,240,16 + LTEXT "Verschieben Sie die Monitor-Symbole, so dass sie der physikalischen Anordnung Ihrer Monitore entsprechen.",-1,3,1,240,16 CONTROL "",IDC_SETTINGS_MONSEL,"MONITORSELWNDCLASS",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,20,240,82,WS_EX_CLIENTEDGE LTEXT "&Anzeige:",1820,3,106,30,8 LTEXT "",IDC_SETTINGS_DEVICE,9,115,224,8 @@ -178,8 +178,8 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SLIDEEFFECT "Slide-Effekt" - IDS_FADEEFFECT "Fade-Effekt" + IDS_SLIDEEFFECT "Gleiten" + IDS_FADEEFFECT "Ausblenden" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/hdwwiz/lang/de-DE.rc b/reactos/dll/cpl/hdwwiz/lang/de-DE.rc index 6ef031b23be..9fb5c2daac2 100644 --- a/reactos/dll/cpl/hdwwiz/lang/de-DE.rc +++ b/reactos/dll/cpl/hdwwiz/lang/de-DE.rc @@ -2,21 +2,21 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_STARTPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Wilkommen zum Hardware Assistenten", IDC_FINISHTITLE, 114, 8, 203, 24 + LTEXT "Wilkommen zum Hardwareassistenten", IDC_FINISHTITLE, 114, 8, 203, 24 LTEXT "Dieser Assistent unterstützt Sie bei:", -1, 114, 40, 182, 8 LTEXT "1) Software installieren, um die an den Computer angeschlossene Hardware zu unterstützen.", -1, 121, 56, 184, 16 LTEXT "2) Probleme lösen, die Sie mit Ihrer Hardware haben.", -1, 121, 78, 185, 16 ICON IDI_WARNINGICON, IDC_WARNINGICON, 124, 109, 20, 20 - LTEXT "Falls die Hardware mit einer Installations CD geliefert wurde, ist es empfehlenswert den Assistenten zu beenden und die Installations CD des Anbieters zu verwenden.", 503, 150, 106, 155, 50 - LTEXT "Klicken Sie ""Weiter"", um fortzufahren.", -1, 114, 166, 193, 8 + LTEXT "Falls die Hardware mit einer Installations-CD geliefert wurde, ist es empfehlenswert, den Assistenten zu beenden und die Installations-CD des Anbieters zu verwenden.", 503, 150, 106, 155, 50 + LTEXT "Klicken Sie auf ""Weiter"", um fortzufahren.", -1, 114, 166, 193, 8 END IDD_SEARCHPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDC_STATUSTEXT, 21, 8, 275, 32 @@ -25,7 +25,7 @@ END IDD_ISCONNECTEDPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Ist die Hardware bereits am Computer angeschlossen?", -1, 20, 11, 275, 8 @@ -35,21 +35,21 @@ END IDD_PROBELISTPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Wählen Sie aus der Liste ein installiertes Gerät aus und klicken Sie auf ""Weiter"", um die Einstellungen zu überprüfen und mögliche Probleme zu lösen.", -1, 21, 8, 275, 22 - LTEXT "Um Hardware zu installieren, die nicht in der Liste aufgelistet ist, klicken Sie ""Ein neues Gerät hinzufügen.""", -1, 21, 32, 275, 24 + LTEXT "Um Hardware zu installieren, die nicht in der Liste aufgelistet ist, klicken Sie auf ""Ein neues Gerät hinzufügen.""", -1, 21, 32, 275, 24 LTEXT "I&nstallierte Hardware:", -1, 21, 62, 140, 8 CONTROL "", IDC_PROBELIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_NOCOLUMNHEADER, 21, 72, 275, 66 END IDD_SELECTWAYPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Der Assistent kann automatisch Hardware suchen und diese installieren. Oder, falls Sie das zu installierende Gerät genau kennen, können Sie es aus der Liste auswählen.", -1, 21, 8, 280, 24 + LTEXT "Der Assistent kann automatisch Hardware suchen und diese installieren oder, falls Sie das zu installierende Gerät genau kennen, können Sie es aus der Liste auswählen.", -1, 21, 8, 280, 24 LTEXT "Wie wollen Sie den Assistenten fortsetzen?", -1, 23, 40, 275, 8 AUTORADIOBUTTON "Automatisch nach neuer Hardware &suchen und installieren (empfohlen)", IDC_AUTOINSTALL, 30, 55, 266, 8, WS_GROUP | NOT WS_TABSTOP AUTORADIOBUTTON "&Manuell aus der Liste ausgewählte Hardware installieren (erweitert)", IDC_MANUALLYINST, 30, 70, 266, 8, NOT WS_TABSTOP @@ -57,7 +57,7 @@ END IDD_DETECTEDHWPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDC_STATUSTEXT, 21, 9, 275, 40 @@ -67,20 +67,20 @@ END IDD_HWTYPESPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Wenn Sie die Hardwarekategorie, die Sie benötigen nicht finden, wählen Sie ""Alle Geräte"".", IDC_STATUSTEXT, 21, 9, 275, 18 - LTEXT "Bekannte &Hardware Typen:", IDC_HWTYPESTEXT, 21, 31, 180, 8 + LTEXT "Wenn Sie die Hardwarekategorie, die Sie benötigen, nicht finden, wählen Sie ""Alle Geräte"".", IDC_STATUSTEXT, 21, 9, 275, 18 + LTEXT "Bekannte &Hardwaretypen:", IDC_HWTYPESTEXT, 21, 31, 180, 8 CONTROL "", IDC_HWTYPESLIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_NOCOLUMNHEADER, 21, 42, 275, 92 END IDD_PROGRESSPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Der Hardware Suchvorgang kann mehere Minuten dauern.", -1, 21, 8, 275, 15 + LTEXT "Der Hardware-Suchvorgang kann mehrere Minuten dauern.", -1, 21, 8, 275, 15 LTEXT "Fortschitt:", IDC_TPROGRESSTEXT, 21, 25, 275, 8 CONTROL "", IDC_TPROGRESSBAR, "msctls_progress32", 0, 21, 37, 275, 14 LTEXT "", IDC_PROGRESSTEXT, 58, 58, 200, 8, SS_NOPREFIX @@ -89,21 +89,21 @@ END IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24 - LTEXT "Der Hardware Assistent wurde erfolgreich abgeschlossen.", -1, 114, 32, 193, 19 + LTEXT "Hardwareassistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24 + LTEXT "Der Hardwareassistent wurde erfolgreich abgeschlossen.", -1, 114, 32, 193, 19 LTEXT "", IDC_STATUSTEXT, 114, 70, 193, 92 LTEXT "Klicken Sie ""Beenden"", um den Assistenten zu schließen.", -1, 114, 166, 192, 8 END IDD_ISFOUNDPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24 + LTEXT "Hardwareassistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24 LTEXT "Der Assistent fand folgende Hardware an ihrem Computer:", -1, 114, 32, 193, 19 LTEXT "Klicken Sie ""Beenden"", um den Assistenten zu schließen.", -1, 114, 166, 132, 8 CONTROL "", IDC_FOUNDHARDWARELIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS, 114, 56, 193, 78 @@ -111,10 +111,10 @@ END IDD_HWSTATUSPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 195, 28 + LTEXT "Hardwareassistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 195, 28 LTEXT "Derzeitiger Status der ausgewählten Hardware:", -1, 114, 40, 193, 19 EDITTEXT IDC_HWSTATUSEDIT, 114, 60, 193, 70, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | NOT WS_TABSTOP LTEXT "Klicken Sie ""Beenden"", um Hilfe zum Lösen von möglichen Problemen zu erhalten.", -1, 114, 136, 193, 16 @@ -123,10 +123,10 @@ END IDD_NOTCONNECTEDPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent kann nicht fortgesetzt werden", IDC_FINISHTITLE, 114, 8, 203, 28 + LTEXT "Hardwareassistent kann nicht fortgesetzt werden", IDC_FINISHTITLE, 114, 8, 203, 28 LTEXT "Um fortsetzen zu können, verbinden Sie folgende Hardware mit dem Computer.", -1, 114, 40, 193, 16 AUTOCHECKBOX "&Nach Beenden den Computer neustarten, um die Hardware anschließen zu können.", IDC_TURNOFFCHECKBOX, 114, 64, 203, 20, BS_TOP | BS_MULTILINE LTEXT "In den meisten Fällen wird ReactOS die Hardware automatisch installieren, wenn Sie sie mit dem Computer verbinden. Andernfalls können Sie den Assistenten erneut starten, um die zu unterstützende Hardware zu installieren.", -1, 114, 98, 193, 32 @@ -139,7 +139,7 @@ BEGIN IDS_CPLDESCRIPTION "Installiert neue Hardwarekomponenten." IDS_SEARCHTITLE "Bitte warten Sie, während der Assistent neue Hardware sucht..." IDS_SEARCHTEXT "Dieser Assistent sucht nach Hardware, die vor kurzem an Ihren Computer angeschlossen, aber noch nicht installiert wurde." - IDS_ISCONNECTED "Ist die Hardware bereits verbunden?" + IDS_ISCONNECTED "Ist die Hardware bereits angeschlossen?" IDS_PROBELISTTITLE "Folgende Hardware ist bereits auf Ihrem Computer installiert" IDS_ADDNEWDEVICE "Ein neues Gerät hinzufügen" IDS_SELECTWAYTITLE "Der Assistent kann Sie bei der Installation anderer Hardware unterstützen" diff --git a/reactos/dll/cpl/input/lang/de-DE.rc b/reactos/dll/cpl/input/lang/de-DE.rc index c44f155bbb8..6412b5a6348 100644 --- a/reactos/dll/cpl/input/lang/de-DE.rc +++ b/reactos/dll/cpl/input/lang/de-DE.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Wählen Sie die Dienste, die Sie für die Eingabesprachen in der Liste verwenden wollen.\nVerwenden Sie Hinzufügen und Entfernen, um die Liste zu bearbeiten.", -1, 9, 6, 238, 25 + LTEXT "Wählen Sie die Dienste aus, die Sie für die Eingabesprachen in der Liste verwenden wollen.\nVerwenden Sie Hinzufügen und Entfernen, um die Liste zu bearbeiten.", -1, 9, 6, 238, 25 CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101 PUSHBUTTON "&Als Standard", IDC_SET_DEFAULT, 101, 159, 144, 14 PUSHBUTTON "&Hinzufügen...", IDC_ADD_BUTTON, 27, 142, 70, 14 @@ -22,7 +22,7 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Um Caps Lock zu deaktivieren", -1, 7, 7, 258, 26 AUTORADIOBUTTON "Caps &Lock Taste drücken", IDC_PRESS_CL_KEY_RB, 14, 17, 120, 11, WS_GROUP - AUTORADIOBUTTON "&Shift Taste drücken", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP + AUTORADIOBUTTON "Um&schalttaste drücken", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP GROUPBOX "Schnelltasten für Eingabesprachen", -1, 7, 37, 258, 95 LTEXT "Aktion", -1, 14, 47, 60, 9 RTEXT "Tasten&kombination", -1, 177, 47, 79, 9 @@ -57,7 +57,7 @@ BEGIN AUTORADIOBUTTON "&Strg", IDC_CTRL_LANG, 29, 31, 30, 11 AUTORADIOBUTTON "&Alt links", IDC_LEFT_ALT_LANG, 29, 45, 46, 12 AUTOCHECKBOX "&Tastaturlayout umschalten", IDC_SWITCH_KBLAYOUTS_CB, 16, 65, 141, 12 - LTEXT "Shift", -1, 74, 87, 27, 12 + LTEXT "Umschalt", -1, 74, 87, 27, 12 CTEXT "+", -1, 63, 87, 8, 9 AUTORADIOBUTTON "S&trg", IDC_CTRL_LAYOUT, 30, 81, 30, 11 AUTORADIOBUTTON "A< links", IDC_LEFT_ALT_LAYOUT, 30, 95, 44, 12 @@ -67,7 +67,7 @@ END IDD_INPUT_LANG_PROP DIALOGEX 20, 20, 227, 75 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Eingabesprache Einstellungen" +CAPTION "Eingabespracheneinstellungen" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Eingabesprache:", -1, 7, 7, 61, 8 @@ -94,8 +94,8 @@ BEGIN IDS_CONFIRMATION "Bestätigung" IDS_LAYOUT_EXISTS "Dieses Layout existiert bereits." IDS_LAYOUT_EXISTS2 "Dieses Layout existiert bereits und kann nicht hinzugefügt werden." - IDS_CTRL_SHIFT "Strg+Shift" - IDS_LEFT_ALT_SHIFT "Alt links+Shift" + IDS_CTRL_SHIFT "Strg+Umschalt" + IDS_LEFT_ALT_SHIFT "Alt links+Umschalt" IDS_SWITCH_BET_INLANG "Zwischen Eingabesprachen umschalten" END @@ -171,7 +171,7 @@ BEGIN IDS_CHINESE_TRADITIONAL_BIG5CODE_LAYOUT, "Chinesisch (traditionell) - Big5-Code" IDS_CHINESE_TRADITIONAL_DAYI_LAYOUT, "Chinesisch (traditionell) - DaYi" IDS_CHINESE_TRADITIONAL_UNICODE_LAYOUT, "Chinesisch (traditionell) - Unicode" - IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT, "Chinesisch (traditionell) - Alphanumerisch" + IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT, "Chinesisch (traditionell) - Alphanummerisch" IDS_CHINESE_SIMPLIFIED_USKEYBOARD_LAYOUT, "Chinesisch (vereinfacht) - US-Tastatur" IDS_CHINESE_SIMPLIFIED_QUANPIN_LAYOUT, "Chinesisch (vereinfacht) - QuanPin" IDS_CHINESE_SIMPLIFIED_SHUANGPIN_LAYOUT, "Chinesisch (vereinfacht) - ShuangPin" @@ -220,7 +220,7 @@ BEGIN IDS_ARMENIAN_EASTERN_LAYOUT, "Ostarmenisch" IDS_ARMENIAN_WESTERN_LAYOUT, "Westarmenisch" IDS_GREEK_POLYTONIC_LAYOUT, "Griechisch (Polytonisch)" - IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT, "US-Englische Tabelle für IBM Arabisch 238_L" + IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT, "US-englische Tabelle für IBM Arabisch 238_L" IDS_FARSI_LAYOUT, "Farsi" IDS_GAELIC_LAYOUT, "Gälisch" IDS_PORTUGUESE_BRAZIL_ABNT2_LAYOUT, "Portugiesisch (Brasilianisch, ABNT2)" @@ -231,12 +231,12 @@ BEGIN IDS_SYRIAC_PHONETIC_LAYOUT, "Syrisch (Phonetisch)" IDS_DIVEHI_PHONETIC_LAYOUT, "Divehi (Phonetisch)" IDS_DIVEHI_TYPEWRITER_LAYOUT, "Divehi (Schreibmaschine)" - IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT, "Bulgarian Phonetic (Classic)" - IDS_BULGARIAN_PHONETIC_BDS_LAYOUT, "Bulgarian Phonetic (BDS)" - IDS_BULGARIAN_BDS_LAYOUT, "Bulgarian BDS 5237-1978" - IDS_GERMAN_RISTOME_LAYOUT, "German (RISTOME)" - IDS_GERMAN_NEO_11_LAYOUT, "German (NEO-1.1)" - IDS_GERMAN_DE_ERGO_LAYOUT, "German (de_ergo)" - IDS_BURMESE_LAYOUT, "Burmese" + IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT, "Bulgarisch (klassisch phonetisch)" + IDS_BULGARIAN_PHONETIC_BDS_LAYOUT, "Bulgarisch BDS (phonetisch)" + IDS_BULGARIAN_BDS_LAYOUT, "Bulgarisch BDS 5237-1978" + IDS_GERMAN_RISTOME_LAYOUT, "Deutsch (RISTOME)" + IDS_GERMAN_NEO_11_LAYOUT, "Deutsch (NEO-1.1)" + IDS_GERMAN_DE_ERGO_LAYOUT, "Deutsch (de_ergo)" + IDS_BURMESE_LAYOUT, "Burmesisch" IDS_UKRAINIAN_STUDENT_LAYOUT, "Ukrainian (Student)" END diff --git a/reactos/dll/cpl/intl/lang/de-DE.rc b/reactos/dll/cpl/intl/lang/de-DE.rc index cbb8ca8cd14..909652966c4 100644 --- a/reactos/dll/cpl/intl/lang/de-DE.rc +++ b/reactos/dll/cpl/intl/lang/de-DE.rc @@ -22,7 +22,7 @@ BEGIN EDITTEXT IDC_SHORTTIMESAMPLE_EDIT, 89, 131, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP EDITTEXT IDC_FULLTIMESAMPLE_EDIT, 89, 146, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP GROUPBOX "Geografische Lage", -1, 5, 172, 234, 55 - LTEXT "Wählen Sie Ihren Standort, sodass Dienste Sie mit lokalen Informationen, wie Nachrichten und Wettervorhersagen, versorgen können.", -1, 14, 184, 210, 24 + LTEXT "Wählen Sie Ihren Standort, so dass Dienste Sie mit lokalen Informationen, wie Nachrichten und Wettervorhersagen, versorgen können.", -1, 14, 184, 210, 24 COMBOBOX IDC_LOCATION_COMBO, 14, 210, 217, 160, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT END @@ -36,7 +36,7 @@ BEGIN PUSHBUTTON "&Details...", IDC_DETAIL_BUTTON, 177, 34, 54, 14 GROUPBOX "Zusätzliche Sprachunterstützung", -1, 5, 62, 234, 82 LTEXT "Die meisten Sprachen sind standardmäßig installiert. Um weitere Sprachen zu installieren, aktivieren Sie die unteren Kontollkästchen.", -1, 12, 72, 220, 18 - CHECKBOX "Dateien für Sprachen mit &komplexer Schrift und Rechts-nach-Links Schreibstil installieren.", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22, BS_MULTILINE + CHECKBOX "Dateien für Sprachen mit &komplexer Schrift und Rechts-nach-Links-Schreibstil installieren.", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22, BS_MULTILINE CHECKBOX "Dateien für &ostasiatische Sprachen installieren.", IDC_INST_FILES_FOR_ASIAN, 12, 114, 180, 22, BS_MULTILINE END @@ -47,12 +47,12 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Sprache für Unicode-Inkompatible Programme", -1, 5, 5, 234, 90 COMBOBOX IDC_LANGUAGE_COMBO, 14, 75, 217, 160, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Diese Einstellung ermöglicht es Unicode-Inkompatiblen Programmen, Menüs und Dialoge in der örtlichen Sprache darzustellen. Dies beeinflusst Unicode-Kompatible Programme nicht, wird aber für alle Nutzer des Computers angewendet.", -1, 14, 18, 223, 33 - LTEXT "Wählen Sie eine Sprache aus, die der Sprachversion des Programmes entspricht, dass Sie nutzen wollen:", -1, 14, 55, 223, 18 + LTEXT "Diese Einstellung ermöglicht es, Unicode-Inkompatiblen Programmen, Menüs und Dialoge in der örtlichen Sprache darzustellen. Dies beeinflusst Unicode-Kompatible Programme nicht, wird aber für alle Nutzer des Computers angewendet.", -1, 14, 18, 223, 33 + LTEXT "Wählen Sie eine Sprache aus, die der Sprachversion des Programmes entspricht, das Sie nutzen wollen:", -1, 14, 55, 223, 18 GROUPBOX "Codepage Konvertierungstabellen", -1, 5, 101, 234, 88 CONTROL "", IDC_CONV_TABLES, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP, 14, 114, 217, 70 GROUPBOX "Standardeinstellungen für Benutzerkonten", -1, 5, 193, 234, 30 - CHECKBOX "Einstellungen &auf das aktive und Standardkonto anwenden.", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22, BS_MULTILINE + CHECKBOX "Einstellungen &auf das aktive und das Standardkonto anwenden.", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22, BS_MULTILINE END IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 234 @@ -143,7 +143,7 @@ CAPTION "Datum" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Kalender", -1, 7, 7, 230, 74 - LTEXT "Eine Zweistellige Jahreszahl in folgendem Zeitraum interpretieren:", -1, 13, 18, 215, 8 + LTEXT "Eine zweistellige Jahreszahl in folgendem Zeitraum interpretieren:", -1, 13, 18, 215, 8 EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED LTEXT "und", -1, 55, 32, 17, 8 EDITTEXT IDC_SECONDYEAR_EDIT, 77, 30, 36, 12, ES_LEFT | ES_NUMBER | WS_GROUP @@ -178,7 +178,7 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Sortierung", -1, 7, 7, 230, 74 LTEXT "Sortiermethoden definieren die Sortierreihenfolge von Zeichen, Wörtern, Dateien und Ordnern.", -1, 14, 17, 220, 25 - LTEXT "Wählen Sie eine Sortiermethode für Ihre Sprache:", -1, 14, 37, 220, 22 + LTEXT "Wählen Sie eine Sortiermethode für Ihre Sprache aus:", -1, 14, 37, 220, 22 COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL END diff --git a/reactos/dll/cpl/joy/lang/de-DE.rc b/reactos/dll/cpl/joy/lang/de-DE.rc index 1d8ae576c14..e80697d6778 100644 --- a/reactos/dll/cpl/joy/lang/de-DE.rc +++ b/reactos/dll/cpl/joy/lang/de-DE.rc @@ -3,12 +3,12 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_PROPPAGEMAIN DIALOGEX 0, 0, 252, 205 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Gamecontroller" +CAPTION "Spielcontroller" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLSYSTEM, -1, 7, 7, 20, 20 - LTEXT "Über diese Einstellungen können an den PC angeschlossene Gamecontroller konfiguriert werden.", -1, 33, 7, 214, 20, NOT WS_GROUP - GROUPBOX "I&nstallierte Gamecontroller", -1, 7, 34, 238, 117 + LTEXT "Über diese Einstellungen können an den PC angeschlossene Spielcontroller konfiguriert werden.", -1, 33, 7, 214, 20, NOT WS_GROUP + GROUPBOX "I&nstallierte Spielcontroller", -1, 7, 34, 238, 117 CONTROL "List1", IDC_CONTROLLER_LIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | 0x0000808D, 14, 44, 224, 80 PUSHBUTTON "&Hinzufügen...", IDC_ADD_BUTTON, 35, 129, 65, 14 PUSHBUTTON "&Entfernen", IDC_REMOVE_BUTTON, 104, 129, 65, 14, WS_DISABLED @@ -21,15 +21,15 @@ END IDD_ADD DIALOGEX 0, 0, 265, 200 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Gamecontroller hinzufügen" +CAPTION "Spielcontroller hinzufügen" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLSYSTEM, -1, 8, 7, 20, 20 - LTEXT "Wählen Sie einen Gamecontroller aus der Liste und klicken Sie auf OK. Wenn ihr Gamecontroller nicht in der Liste erscheint, klicken Sie auf Benutzerdefiniert.", -1, 35, 7, 210, 33 - LTEXT "&Gamecontroller:", -1, 8, 45, 126, 8 + LTEXT "Wählen Sie einen Spielcontroller aus der Liste und klicken Sie auf OK. Wenn ihr Spielcontroller nicht in der Liste erscheint, klicken Sie auf Benutzerdefiniert.", -1, 35, 7, 210, 33 + LTEXT "&Spielcontroller:", -1, 8, 45, 126, 8 LISTBOX IDC_GAME_CONTROLLERS_LIST, 7, 55, 251, 57, LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_HSCROLL | WS_TABSTOP AUTOCHECKBOX "&Ruder und Pedale aktivieren", IDC_ENABLE_RUDDERS_CHECKBOX, 7, 114, 105, 10, WS_GROUP - LTEXT "&Game Port:", -1, 7, 134, 38, 8, NOT WS_VISIBLE + LTEXT "&Gameport:", -1, 7, 134, 38, 8, NOT WS_VISIBLE COMBOBOX IDC_GAME_PORT_COMBO, 7, 147, 140, 50, CBS_DROPDOWNLIST | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL PUSHBUTTON "&Benutzerdefiniert...", IDC_CUSTOM_BUTTON, 195, 147, 63, 14 CONTROL "", -25525, "STATIC", SS_ETCHEDHORZ, 7, 170, 251, 1 @@ -40,7 +40,7 @@ END IDD_CUSTOM DIALOGEX 0, 0, 265, 183, 0 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Benutzerdefinierter Gamecontroller" +CAPTION "Benutzerdefinierter Spielcontroller" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Spezielle Eigenschaften", -1, 7, 7, 245, 52 @@ -51,10 +51,10 @@ BEGIN GROUPBOX "&Achsen", -1, 7, 67, 116, 44, WS_GROUP COMBOBOX IDC_AXES_COMBO, 37, 79, 48, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL AUTORADIOBUTTON "Ruder/Pedale", IDC_RUDDER_PEDALS_RADIO, 14, 97, 63, 10, NOT WS_VISIBLE - AUTORADIOBUTTON "Z Achse", IDC_Z_AXIS_RADIO, 81, 97, 40, 10, NOT WS_VISIBLE + AUTORADIOBUTTON "Z-Achse", IDC_Z_AXIS_RADIO, 81, 97, 40, 10, NOT WS_VISIBLE GROUPBOX "&Tasten", -1, 137, 67, 116, 44 COMBOBOX IDC_BUTTONS_COMBO, 178, 79, 48, 50, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL, WS_EX_CLIENTEDGE - AUTOCHECKBOX "Beinhaltet eine &Point of View Steuerung", IDC_INC_POINT_CHECKBOX, 7, 123, 140, 10 + AUTOCHECKBOX "Beinhaltet eine &Point-of-View-Steuerung", IDC_INC_POINT_CHECKBOX, 7, 123, 140, 10 LTEXT "C&ontrollername:", -1, 7, 139, 200, 9 EDITTEXT IDC_CONTROLLER_NAME_EDIT, 7, 150, 116, 15, ES_AUTOHSCROLL, WS_EX_CLIENTEDGE | WS_EX_STATICEDGE DEFPUSHBUTTON "OK", IDOK, 137, 150, 50, 14 @@ -77,8 +77,8 @@ END STRINGTABLE BEGIN - IDS_CPLSYSTEMNAME "Gamecontroller" - IDS_CPLSYSTEMDESCRIPTION "Hinzufügen, Entfernen und Konfigurieren von Gamecontroller Hardware, wie Joysticks und Gamepads." + IDS_CPLSYSTEMNAME "Spielcontroller" + IDS_CPLSYSTEMDESCRIPTION "Hinzufügen, Entfernen und Konfigurieren von Spielcontrollerhardware wie Joysticks und Gamepads." IDS_CONTROLLER "Controller" IDS_STATUS "Status" END diff --git a/reactos/dll/cpl/liccpa/lang/de-DE.rc b/reactos/dll/cpl/liccpa/lang/de-DE.rc index cdb2910f528..b5d68134899 100644 --- a/reactos/dll/cpl/liccpa/lang/de-DE.rc +++ b/reactos/dll/cpl/liccpa/lang/de-DE.rc @@ -4,11 +4,11 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_PROPPAGE1 DIALOGEX DISCARDABLE 20, 40, 315, 104 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU -CAPTION "Chose Licensing Mode" +CAPTION "Wählen sie den Lizenzmodus aus" FONT 8, "Helv" BEGIN - CONTROL "Client Lizenzierungs Modus", 100, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 4, 4, 239, 94 - CONTROL "Per Gerät oder Per Benutzer", 102, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 79, 107, 12 + CONTROL "Client-Lizenzierungsmodus", 100, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 4, 4, 239, 94 + CONTROL "Per Gerät oder per Benutzer", 102, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 79, 107, 12 CONTROL "Per Server. Nummer der gleichzeitigen Verbindungen:", 103, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 38, 163, 9 CONTROL "Produkt:", 105, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 13, 20, 31, 8 CONTROL "", 106, "COMBOBOX", CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP, 49, 20, 171, 12 @@ -23,7 +23,7 @@ END STRINGTABLE BEGIN - IDS_CPLNAME_1 "Lizenz Manager" - IDS_CPLDESCRIPTION_1 "Lizenz Manager" + IDS_CPLNAME_1 "Lizenzmanager" + IDS_CPLDESCRIPTION_1 "Lizenzmanager" IDS_REACTOS "ReactOS - Freie Software" END diff --git a/reactos/dll/cpl/main/lang/de-DE.rc b/reactos/dll/cpl/main/lang/de-DE.rc index 97ed969f8b1..cc63724e1f1 100644 --- a/reactos/dll/cpl/main/lang/de-DE.rc +++ b/reactos/dll/cpl/main/lang/de-DE.rc @@ -91,7 +91,7 @@ STYLE DS_SHELLFONT | WS_CAPTION | WS_SYSMENU CAPTION "Schema speichern" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Cursorschema speichern unter:", -1, 5, 5, 100, 10 + LTEXT "Zeigerschema speichern unter:", -1, 5, 5, 100, 10 EDITTEXT IDC_EDIT_SCHEME_NAME, 5, 15, 180, 15, WS_CHILD | WS_VISIBLE | WS_GROUP PUSHBUTTON "&OK", IDOK, 60, 45, 50, 15 PUSHBUTTON "&Abbrechen", IDCANCEL, 115, 45, 50, 15 @@ -169,7 +169,7 @@ BEGIN IDS_REMOVE_TITLE "Löschen des Cursorschemas bestätigen" IDS_REMOVE_TEXT "Soll das Cursorschema '%s' wirklich gelöscht werden?" IDS_OVERWRITE_TITLE "Cursorschema überscheiben" - IDS_OVERWRITE_TEXT "Ein Cursorschema mit diesem Namen existiert bereits. Möchen Sie das existierende Cursorschema überscheiben?" + IDS_OVERWRITE_TEXT "Ein Cursorschema mit diesem Namen existiert bereits. Möchten Sie das existierende Cursorschema überscheiben?" IDS_ANIMATE_CURSOR "Animierter Cursor" END diff --git a/reactos/dll/cpl/mmsys/lang/de-DE.rc b/reactos/dll/cpl/mmsys/lang/de-DE.rc index cfcfb47cbaf..81e3d437828 100644 --- a/reactos/dll/cpl/mmsys/lang/de-DE.rc +++ b/reactos/dll/cpl/mmsys/lang/de-DE.rc @@ -12,10 +12,10 @@ BEGIN CONTROL "",IDC_VOLUME_TRACKBAR, "msctls_trackbar32", TBS_AUTOTICKS | TBS_ENABLESELRANGE | TBS_BOTTOM | TBS_HORZ | WS_TABSTOP, 65, 45, 140, 14 LTEXT "Niedrig",-1,62,66,30,17 LTEXT "Hoch",-1,195,66,30,17 - CHECKBOX "Stu&mmschalten", IDC_MUTE_CHECKBOX, 50, 78, 140, 10 + CHECKBOX "Stu&mm schalten", IDC_MUTE_CHECKBOX, 50, 78, 140, 10 CHECKBOX "Lautstärkeregelungs-&Icon in der Taskleiste zeigen", IDC_ICON_IN_TASKBAR, 50, 92, 170, 10 PUSHBUTTON "Er&weitert", IDC_ADVANCED_BTN, 150,105,75,15 - GROUPBOX "Lautsprechereintellungen", IDC_SPEAKER_SET_BTN, 7,140,230,80 + GROUPBOX "Lautsprechereinstellungen", IDC_SPEAKER_SET_BTN, 7,140,230,80 CONTROL "", IDC_SPEAKIMG, "Static", SS_OWNERDRAW, 4, 160, 70, 70 LTEXT "Verwenden Sie die unteren Einstellungen um die Lautstäre einzelner Geräte und andere Einstellungen zu verändern.",-1,70,155,150,36 PUSHBUTTON "&Lautstärke...", IDC_SPEAKER_VOL_BTN, 70,195,75,15 @@ -24,18 +24,18 @@ END IDD_SOUNDS DIALOGEX 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Sounds" +CAPTION "Klänge" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Ein Soundschema ist eine Kollektion von Sounds, die bestimmten Programmereignissen in ReactOS zugordnet sind. Sie können ein existierendes Schema anwählen oder ein modifiziertes speichern.",-1,8,7,230,40 - LTEXT "Sounds&chema:",-1,8,42,150,17 + LTEXT "Ein Klangschema ist eine Sammlung von Klängen, die bestimmten Programmereignissen in ReactOS zugordnet sind. Sie können ein existierendes Schema auswählen oder ein modifiziertes speichern.",-1,8,7,230,40 + LTEXT "Klang&schema:",-1,8,42,150,17 COMBOBOX IDC_SOUND_SCHEME, 8, 53, 230, 46, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Sp&eichern unter...", IDC_SAVEAS_BTN, 120,70,65,15 PUSHBUTTON "&Löschen", IDC_DELETE_BTN, 188,70,50,15 - LTEXT "Um Sounds zu ändern, klicken Sie auf ein Programmereignis in der folgenden Liste und wählen Sie einen Sound. Sie können Änderungen als neue Soundschemata speichern.",-1,8,90,230,40 - LTEXT "&Pogrammereignisse:",-1,8,118,150,17 + LTEXT "Um Klänge zu ändern, klicken Sie auf ein Programmereignis in der folgenden Liste und wählen Sie einen Klang aus. Sie können Änderungen als neue Klangschemata speichern.",-1,8,90,230,40 + LTEXT "&Programmereignisse:",-1,8,118,150,17 CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE - LTEXT "&Sounds:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED + LTEXT "&Klänge:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 188,205,81,15, WS_DISABLED @@ -52,7 +52,7 @@ BEGIN COMBOBOX IDC_DEVICE_PLAY_LIST, 50, 30, 180, 46, CBS_DROPDOWNLIST PUSHBUTTON "&Lautstärke...", IDC_VOLUME1_BTN, 85,47,70,15 PUSHBUTTON "&Erweitert...", IDC_ADV2_BTN, 160,47,70,15 - GROUPBOX "Soundaufnahme", -1, 7,75,230,60 + GROUPBOX "Tonaufnahme", -1, 7,75,230,60 ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,88,32,32 LTEXT "S&tandardgerät:",-1,50,88,80,17 COMBOBOX IDC_DEVICE_REC_LIST, 50, 98, 180, 46, CBS_DROPDOWNLIST @@ -101,7 +101,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBL CAPTION "Schema speichern unter" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Dieses Soundschema speichern unter:", -1, 7, 7, 212, 9 + LTEXT "&Dieses Klangschema speichern unter:", -1, 7, 7, 212, 9 EDITTEXT 8960, 7, 17, 211, 14, ES_AUTOHSCROLL DEFPUSHBUTTON "OK", IDOK, 93, 36, 60, 14 PUSHBUTTON "Abbrechen", IDCANCEL, 157, 36, 60, 14 @@ -136,8 +136,8 @@ BEGIN LTEXT "Voll", 8498, 214, 56, 21, 9 LTEXT "Gut", 8499, 128, 123, 21, 10 LTEXT "Beste", 8500, 214, 123, 23, 9 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture Gerät", 5399, 13, 145, 227, 21 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render Gerät", 5398, 13, 78, 227, 22 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture-Gerät", 5399, 13, 145, 227, 21 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render-Gerät", 5398, 13, 78, 227, 22 END IDD_PERFORMANCE2 DIALOG 0, 0, 257, 218 @@ -157,8 +157,8 @@ BEGIN LTEXT "Voll", 8498, 217, 46, 19, 9 LTEXT "Gut", 8499, 125, 103, 24, 10 LTEXT "Beste", 8500, 217, 103, 19, 9 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture Gerät", 5399, 13, 125, 222, 21 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render Gerät", 5398, 13, 68, 218, 24 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture-Gerät", 5399, 13, 125, 222, 21 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render-Gerät", 5398, 13, 68, 218, 24 END IDD_SETUP1 DIALOG 0, 0, 227, 206 @@ -168,11 +168,11 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "ReactOS Audio", 10243, 7, 5, 213, 192 ICON 4393, 10241, 26, 26, 20, 20 - LTEXT "Dieser Computer kann keine Audiodaten abspielen, da der ReactOS Audio-Dienst nicht aktiviert ist.", 10245, 60, 25, 150, 40 + LTEXT "Dieser Computer kann keine Audiodaten abspielen, da der ReactOS-Audiodienst nicht aktiviert ist.", 10245, 60, 25, 150, 40 AUTOCHECKBOX "&ReactOS Audio aktivieren", 10253, 60, 68, 150, 9 LTEXT "Informationen", 10246, 58, 87, 150, 11 LTEXT "1. Sie müssen Administrator sein, um diesen Dienst aktivieren zu können. Wenn Sie nicht als Administrator angemeldet sind, werden Sie nach dem Administaratornamen und Passwort gefragt.", 10247, 60, 100, 150, 40 - LTEXT "2. Nach Aktivierung des ReactOS Audio Dienstes müssen Sie den Computer neustarten.", 10248, 60, 140, 150, 40 + LTEXT "2. Nach Aktivierung des ReactOS-Audiodienstes müssen Sie den Computer neu starten.", 10248, 60, 140, 150, 40 END IDD_MULTICHANNEL DIALOG 0, 0, 227, 218 @@ -224,17 +224,17 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "ReactOS Audio", 10259, 7, 5, 213, 192 ICON 4394, 10257, 25, 25, 20, 20 - LTEXT "Der ReactOS Audio Dienst ist nun aktiviert. Dennoch kann es sein, dass die Audiowiedergabe nicht richtig funktioniert, bis Sie ReactOS neugestartet haben. Wenn Sie jetzt neustarten wollen, speichern Sie Ihre Arbeit und beenden Sie alle Programme.", 10261, 60, 25, 150, 50 - LTEXT "Um ReactOS neuzustarten, klicken Sie OK.", 10262, 60, 75, 150, 20 - LTEXT "Wenn Sie abbrechen, müssen Sie später neustarten, um sichergehen zu können, dass die Audiowiedergabe richtig funktioniert.", 10263, 60, 100, 150, 40 + LTEXT "Der ReactOS-Audiodienst ist nun aktiviert. Dennoch kann es sein, dass die Audiowiedergabe nicht richtig funktioniert, bis Sie ReactOS neu gestartet haben. Wenn Sie jetzt neu starten wollen, speichern Sie Ihre Arbeit und beenden Sie alle Programme.", 10261, 60, 25, 150, 50 + LTEXT "Um ReactOS neu zu starten, klicken Sie auf OK.", 10262, 60, 75, 150, 20 + LTEXT "Wenn Sie abbrechen, müssen Sie später neu starten, um sichergehen zu können, dass die Audiowiedergabe richtig funktioniert.", 10263, 60, 100, 150, 40 END STRINGTABLE BEGIN - IDS_CPLNAME "Sounds und Audio Geräte" - IDS_CPLDESCRIPTION "Ändert das Sound-Schema Ihres Computers, oder konfiguriert die Einstellungen für Ihre Lautsprecher und Aufnahmegeräte." + IDS_CPLNAME "Klänge und Audiogeräte" + IDS_CPLDESCRIPTION "Ändert das Klangschema Ihres Computers oder konfiguriert die Einstellungen für Ihre Lautsprecher und Aufnahmegeräte." IDS_NO_SOUND "(Kein)" - IDS_NO_DEVICES "No Devices" + IDS_NO_DEVICES "Keine Geräte" 5825 "Programmfehler" 5826 "Programm schließen" diff --git a/reactos/dll/cpl/powercfg/lang/de-DE.rc b/reactos/dll/cpl/powercfg/lang/de-DE.rc index ff72ddebaa9..b209830224f 100644 --- a/reactos/dll/cpl/powercfg/lang/de-DE.rc +++ b/reactos/dll/cpl/powercfg/lang/de-DE.rc @@ -47,7 +47,7 @@ BEGIN CONTROL "Slider1",IDC_ALARMBAR1,"msctls_trackbar32",TBS_HORZ | TBS_AUTOTICKS | WS_TABSTOP,30,40,170,15 LTEXT "100%",-1,215,40,25,10 - PUSHBUTTON "Alar&m Action...",-1,20,70,70,15,WS_DISABLED + PUSHBUTTON "Alar&maktion...",-1,20,70,70,15,WS_DISABLED LTEXT "Benachrichtigung:",-1,95,70,60,10 LTEXT "Unbekannt",IDC_ALARMMSG1,155,70,95,10 LTEXT "Aktion:",-1,95,80,45,10 @@ -63,7 +63,7 @@ BEGIN CONTROL "Slider1",IDC_ALARMBAR2,"msctls_trackbar32",TBS_HORZ | TBS_AUTOTICKS | WS_TABSTOP,30,140,170,15 LTEXT "100%",-1,215,140,25,10 - PUSHBUTTON "Alar&m Action...",-1,20,170,70,15,WS_DISABLED + PUSHBUTTON "Alar&maktion...",-1,20,170,70,15,WS_DISABLED LTEXT "Benachrichtigung:",-1,95,170,60,10 LTEXT "Unbekannt",IDC_ALARMMSG2,155,170,95,10 LTEXT "Aktion:",-1,95,180,45,10 @@ -122,7 +122,7 @@ BEGIN IDS_CPLNAME_1 "Energieoptionen" IDS_CPLDESCRIPTION_1 "Konfiguriert die Energiespareinstellungen für den Computer." IDS_PROCENT "%i%%" - IDS_SOUND "Sound" + IDS_SOUND "Klang" IDS_TEXT "Text" IDS_CONFIG1 "Einstellungen für Energieschema %s." IDS_CONFIG2 "Erweiterte Einstellungen für %s." @@ -134,7 +134,7 @@ BEGIN IDS_PowerActionNone1 "Keine Aktion" IDS_PowerActionUnknown "Unbekannt" - IDS_PowerActionSleep "In den Standbymodus wechseln" + IDS_PowerActionSleep "In den Stromsparmodus wechseln" IDS_PowerActionHibernate "In den Ruhezustand wechseln" IDS_PowerActionShutdown "Computer herunterfahren" IDS_PowerActionRestart "Computer neu starten" @@ -159,6 +159,6 @@ BEGIN IDS_TIMEOUT15 "Nach 5 Stunden" IDS_TIMEOUT16 "Nie" - IDS_DEL_SCHEME "Sind Sie sicher, dass Sie das Energieschema löschen wollen?" + IDS_DEL_SCHEME "Sind Sie sich sicher, dass Sie das Energieschema löschen wollen?" IDS_DEL_SCHEME_TITLE "Schema löschen" END diff --git a/reactos/dll/cpl/sysdm/lang/de-DE.rc b/reactos/dll/cpl/sysdm/lang/de-DE.rc index e87d23df567..92282242d97 100644 --- a/reactos/dll/cpl/sysdm/lang/de-DE.rc +++ b/reactos/dll/cpl/sysdm/lang/de-DE.rc @@ -53,12 +53,12 @@ END IDD_SYSSETTINGS DIALOGEX 0, 0, 221, 106 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION -CAPTION "System Einstellungen" +CAPTION "Systemeinstellungen" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Versions Info",IDC_STATIC,6,3,210,73 + GROUPBOX "Versionsinfo",IDC_STATIC,6,3,210,73 CONTROL "Als Workstation identifizieren",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,110,10 - LTEXT "ReactOS ist als Server OS konzipiert und identifiziert sich auch als solches. Diese Einstellung ändert das Verhalten für Anwendungen.",IDC_STATIC,15,15,183,41 + LTEXT "ReactOS ist als Serversystem konzipiert worden und identifiziert sich auch als solches. Diese Einstellung ändert das Verhalten für Anwendungen.",IDC_STATIC,15,15,183,41 PUSHBUTTON "OK",IDOK,166,83,50,14 END @@ -68,9 +68,9 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Erweitert" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Administrator-Rechte werden für die meisten dieser Einstellungen benötigt.", IDC_STATIC, 12, 5, 242, 8 + LTEXT "Administratorrechte werden für die meisten dieser Einstellungen benötigt.", IDC_STATIC, 12, 5, 242, 8 GROUPBOX "Leistung", IDC_STATIC, 6, 18, 244, 50 - LTEXT "Mit Leistungs-Optionen können Sie einstellen, wie Programme Speicher benutzen sollen. Diese Einstellungen beeinflussen die Leistung ihres Computers.", IDC_STATIC, 16, 29, 210, 24 + LTEXT "Mit Leistungsoptionen können Sie einstellen, wie Programme Speicher benutzen sollen. Diese Einstellungen beeinflussen die Leistung ihres Computers.", IDC_STATIC, 16, 29, 210, 24 PUSHBUTTON "Einstellungen", IDC_PERFOR, 194, 48, 50, 14 GROUPBOX "Benutzerprofile", IDC_STATIC, 6,75,244,48 @@ -78,7 +78,7 @@ BEGIN PUSHBUTTON "Einstellungen", IDC_USERPROFILE, 194, 103, 50, 14 GROUPBOX "Starten und Wiederherstellen", IDC_STATIC, 6, 131, 244, 52 - LTEXT "Start- und Wiederherstellungs-Einstellungen regeln, wie der Computer gestartet werden soll und was passieren soll, wenn ein Fehler auftritt.", IDC_STATIC, 16, 144, 210, 27 + LTEXT "Start- und Wiederherstellungseinstellungen regeln, wie der Computer gestartet werden soll und was passieren soll, wenn ein Fehler auftritt.", IDC_STATIC, 16, 144, 210, 27 PUSHBUTTON "Einstellungen", IDC_STAREC, 194, 162, 50, 14 PUSHBUTTON "Umgebungsvariablen", IDC_ENVVAR, 84, 192, 80, 14 @@ -88,12 +88,12 @@ END IDD_HARDWAREPROFILES DIALOGEX 6, 18, 254, 234 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware-Profile" +CAPTION "Hardwareprofile" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_HARDPROF, IDC_STATIC, 8, 11, 18, 20, SS_ICON - LTEXT "Sie können Hardware-Profile für verschiedene Hardware-Konfigurationen einrichten. Beim Starten können Sie dann das Profil auswählen, welches benutzt werden soll.", IDC_STATIC, 46, 11, 200, 25 - LTEXT "Verfügbare Hardware-Profile:", IDC_STATIC, 8, 41, 120, 8 + LTEXT "Sie können Hardwareprofile für verschiedene Hardware-Konfigurationen einrichten. Beim Starten können Sie dann das Profil auswählen, welches benutzt werden soll.", IDC_STATIC, 46, 11, 200, 25 + LTEXT "Verfügbare Hardwareprofile:", IDC_STATIC, 8, 41, 120, 8 LISTBOX IDC_HRDPROFLSTBOX, 8, 52, 215, 54, LBS_NOTIFY PUSHBUTTON "", IDC_HRDPROFUP, 232, 59, 15, 14, BS_ICON PUSHBUTTON "", IDC_HRDPROFDWN, 232, 79, 15, 14, BS_ICON @@ -102,11 +102,11 @@ BEGIN PUSHBUTTON "&Umbenennen", IDC_HRDPROFRENAME, 118, 106, 50, 14 PUSHBUTTON "&Löschen", IDC_HRDPROFDEL, 173, 106, 50, 14 - GROUPBOX "Hardware-Profil Auswahl", IDC_STATIC, 7, 130, 240, 75 + GROUPBOX "Hardwareprofil-Auswahl", IDC_STATIC, 7, 130, 240, 75 LTEXT "Wenn ReactOS startet:", IDC_STATIC, 14, 142, 210, 8 - AUTORADIOBUTTON "&Warten, bis ein Hardware-Profil gewählt wird", IDC_HRDPROFWAIT, 14, 158, 170, 8, WS_GROUP - AUTORADIOBUTTON "&Das erste Profil aus der Liste wählen, wenn ich kein Profil innerhalb von", IDC_HRDPROFSELECT, 14, 173, 200, 8 - LTEXT "Sekunden gewählt wird", IDC_STATIC, 65, 187, 80, 8 + AUTORADIOBUTTON "&Warten, bis ein Hardwareprofil gewählt wird", IDC_HRDPROFWAIT, 14, 158, 170, 8, WS_GROUP + AUTORADIOBUTTON "&Das erste Profil aus der Liste auswählen, wenn ich kein Profil innerhalb von", IDC_HRDPROFSELECT, 14, 173, 200, 8 + LTEXT "Sekunden gewählt habe", IDC_STATIC, 65, 187, 80, 8 EDITTEXT IDC_HRDPROFEDIT, 25, 185, 35, 12 CONTROL "", IDC_HRDPROFUPDWN, "msctls_updown32", UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 25, 185, 7, 10 @@ -136,7 +136,7 @@ CAPTION "Benutzerprofile" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_USERPROF, IDC_STATIC, 6, 11, 16, 16, SS_ICON - LTEXT "Benutzerprofile enthalten Desktop-Einstellungen und andere Informationen bezüglich ihrer Anmeldung. Sie können unterschiedliche Profile, für jeden Computer, den Sie benutzen, einrichten, oder aber auch ein einziges Profil wählen, welches auf jedem Computer gleich ist.", + LTEXT "Benutzerprofile enthalten Desktopeinstellungen und andere Informationen bezüglich ihrer Anmeldung. Sie können unterschiedliche Profile, für jeden Computer, den Sie benutzen, einrichten, oder aber auch ein einziges Profil wählen, welches auf jedem Computer gleich ist.", IDC_STATIC, 40, 7, 204, 40 LTEXT "Auf diesem Computer gespeicherte Profile:", IDC_STATIC, 16, 51, 204, 9 CONTROL "", IDC_USERPROFILE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, @@ -157,8 +157,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS CAPTION "Starten und Wiederherstellen" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "System-Start", IDC_STATIC, 7, 12, 238, 95 - LTEXT "Standard Betriebs&system:", IDC_STATIC, 14, 26, 100, 8 + GROUPBOX "Systemstart", IDC_STATIC, 7, 12, 238, 95 + LTEXT "Standard-Betriebs&system:", IDC_STATIC, 14, 26, 100, 8 COMBOBOX IDC_STRECOSCOMBO, 14, 37, 224, 46, CBS_DROPDOWNLIST AUTOCHECKBOX "&Anzeigedauer der Betriebssystem-Liste:", IDC_STRECLIST, 14, 56, 150, 8 EDITTEXT IDC_STRRECLISTEDIT, 185, 54, 30, 12, ES_NUMBER @@ -168,10 +168,10 @@ BEGIN EDITTEXT IDC_STRRECRECEDIT, 185, 68, 30, 12, ES_NUMBER CONTROL "", IDC_STRRECRECUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13 LTEXT "Sek.", IDC_STATIC, 221, 70, 14, 8 - LTEXT "Um die Start-Optionen manuell zu bearbeiten, klicken Sie auf ""Bearbeiten"".", IDC_STATIC, 14, 84, 170, 18 + LTEXT "Um die Startoptionen manuell zu bearbeiten, klicken Sie auf ""Bearbeiten"".", IDC_STATIC, 14, 84, 170, 18 PUSHBUTTON "Be&arbeiten", IDC_STRRECEDIT, 188, 87, 50, 14 - GROUPBOX "System-Fehler", IDC_STATIC, 7, 111, 238, 140 + GROUPBOX "Systemfehler", IDC_STATIC, 7, 111, 238, 140 AUTOCHECKBOX "Ereignis in das Systemprotokoll &eintragen", IDC_STRRECWRITEEVENT, 14, 124, 148, 10 AUTOCHECKBOX "Administrator-Warnmeldung &senden", IDC_STRRECSENDALERT, 14, 138, 148, 10 AUTOCHECKBOX "Automatisch &neu starten", IDC_STRRECRESTART, 14, 152, 145, 10 @@ -234,7 +234,7 @@ BEGIN PUSHBUTTON "&Neu...", IDC_USER_VARIABLE_NEW, 80, 90, 50, 14 PUSHBUTTON "Be&arbeiten...", IDC_USER_VARIABLE_EDIT, 134, 90, 50, 14 PUSHBUTTON "&Löschen", IDC_USER_VARIABLE_DELETE, 188, 90, 50, 14 - GROUPBOX "System-Variablen", IDC_STATIC, 7, 116, 238, 100 + GROUPBOX "Systemvariablen", IDC_STATIC, 7, 116, 238, 100 CONTROL "", IDC_SYSTEM_VARIABLE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOSORTHEADER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 14, 129, 224, 58, WS_EX_CLIENTEDGE diff --git a/reactos/dll/cpl/timedate/lang/de-DE.rc b/reactos/dll/cpl/timedate/lang/de-DE.rc index 5b0e99f3c48..7221427d49f 100644 --- a/reactos/dll/cpl/timedate/lang/de-DE.rc +++ b/reactos/dll/cpl/timedate/lang/de-DE.rc @@ -40,11 +40,11 @@ END IDD_INETTIMEPAGE DIALOGEX 0, 0, 252, 146 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Internet Zeit" +CAPTION "Internetzeit" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN COMBOBOX IDC_SERVERLIST, 65, 22, 117, 136, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Automatisch mit einem Internet Zeitserver synchronisieren", IDC_AUTOSYNC, + CONTROL "Automatisch mit einem Internetzeitserver synchronisieren", IDC_AUTOSYNC, "Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,11,7,241,10 LTEXT "Server:", -1, 34, 22, 28, 13 PUSHBUTTON "Jetzt updaten", IDC_UPDATEBUTTON, 187, 22, 49, 14 diff --git a/reactos/dll/cpl/usrmgr/lang/de-DE.rc b/reactos/dll/cpl/usrmgr/lang/de-DE.rc new file mode 100644 index 00000000000..c8fa221989d --- /dev/null +++ b/reactos/dll/cpl/usrmgr/lang/de-DE.rc @@ -0,0 +1,223 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +/* + * Attention Translators: + * DO NOT TRANSLATE THESE RESOURCES YET! + */ + +/* Dialogs */ + +IDD_USERS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Benutzer" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_GROUPS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Gruppen" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_EXTRA DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Extra" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Dieser Platz wurde absichtlich leer gelassen.", IDC_STATIC, 66, 90, 112, 8 +END + + +IDD_USER_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Allgemein" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8 + LTEXT "Voller Name:", -1, 7, 46, 63, 8 + EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL + LTEXT "Beschreibung:", -1, 7, 64, 63, 8 + EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL + AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10 + AUTOCHECKBOX "Benutzer kann das Passwort nicht ändern",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10 + AUTOCHECKBOX "Passwort läuft nie ab",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10 + AUTOCHECKBOX "Konto ist deativiert",IDC_USER_GENERAL_DISABLED,7,121,210,10 + AUTOCHECKBOX "Konto ist gesperrt",IDC_USER_GENERAL_LOCKED,7,134,210,10 +END + + +IDD_USER_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Mitgliedschaft" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Mitglied von:", -1, 7, 7, 56, 8 + CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 18, 238, 173, WS_EX_CLIENTEDGE + PUSHBUTTON "Hzfg...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14 + PUSHBUTTON "Entfernen", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED +END + + +IDD_USER_PROFILE DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Profil" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Benutzerprofil", -1, 7, 7, 238, 54 + LTEXT "Profilpfad:", -1, 16, 22, 55, 8 + EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL + LTEXT "Anmeldeskript:", -1, 16, 40, 55, 8 + EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL + + GROUPBOX "Benutzerverzeichnis", -1, 7, 68, 238, 54 + AUTORADIOBUTTON "Lokaler Pfad:", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10 + AUTORADIOBUTTON "Verbinden:", IDC_USER_PROFILE_REMOTE, 16, 100, 60, 10 + EDITTEXT IDC_USER_PROFILE_LOCAL_PATH, 78, 81, 160, 13, ES_AUTOHSCROLL + COMBOBOX IDC_USER_PROFILE_DRIVE, 78, 99, 26, 160, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL + LTEXT "to:", -1, 112, 101, 12, 8 + EDITTEXT IDC_USER_PROFILE_REMOTE_PATH, 130, 99, 108, 13, ES_AUTOHSCROLL +END + + +IDD_GROUP_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Allgemein" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8 + LTEXT "Beschreibung:", -1, 7, 45, 46, 8 + EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL + LTEXT "Mitglieder:", -1, 7, 63, 45, 8 + CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 74, 238, 117, WS_EX_CLIENTEDGE + PUSHBUTTON "Hzfg...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14 + PUSHBUTTON "Entfernen", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED +END + + +IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Passwort ändern" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Neues Passwort!", -1,7,10,96,8 + EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Passwort wiederholen:", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,210,53,50,14 +END + + +IDD_USER_NEW DIALOGEX DISCARDABLE 0, 0, 267, 200 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Neuer Benutzer" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "Benutzername:", -1,7,10,96,8 + EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL + RTEXT "Vollständiger Name:", -1,7,28,96,8 + EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL + RTEXT "Beschreibung:", -1,7,46,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Passwort:", -1,7,70,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Passwort wiederholen:", -1,7,88,96,8 + AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10 + AUTOCHECKBOX "Benutzer kann das Passwort nicht ändern",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED + AUTOCHECKBOX "Passwort läuft nie ab",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED + AUTOCHECKBOX "Konto ist deaktiviert",IDC_USER_NEW_DISABLED,7,151,200,10 + DEFPUSHBUTTON "OK",IDOK,156,179,50,14,WS_DISABLED + PUSHBUTTON "Abbrechen",IDCANCEL,210,179,50,14 +END + + +IDD_GROUP_NEW DIALOGEX DISCARDABLE 0, 0, 267, 74 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Neue Gruppe" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "Gruppenname:", -1,7,10,96,8 + EDITTEXT IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL + RTEXT "Beschreibung:", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14,WS_DISABLED + PUSHBUTTON "Abbrechen",IDCANCEL,210,53,50,14 +END + + +IDD_USER_ADD_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Gruppenmitgliedschaft" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Mitglied von:", -1, 7, 7, 56, 8 + CONTROL "", IDC_USER_ADD_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 18, 238, 173, WS_EX_CLIENTEDGE + DEFPUSHBUTTON "OK",IDOK,141,197,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,195,197,50,14 +END + + +/* Menus */ + +IDM_POPUP_GROUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Neue Gruppe...", IDM_GROUP_NEW + END + POPUP "" + BEGIN + MENUITEM "Mitglied hinzufügen", IDM_GROUP_ADD_MEMBER, GRAYED + MENUITEM SEPARATOR + MENUITEM "Löschen", IDM_GROUP_DELETE + MENUITEM "Umbenennen", IDM_GROUP_RENAME + MENUITEM SEPARATOR + MENUITEM "Eigenschaften", IDM_GROUP_PROPERTIES + END +END + + +IDM_POPUP_USER MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Neuer Benutzer...", IDM_USER_NEW + END + POPUP "" + BEGIN + MENUITEM "Passwort ändern", IDM_USER_CHANGE_PASSWORD + MENUITEM SEPARATOR + MENUITEM "Löschen", IDM_USER_DELETE + MENUITEM "Umbenennen", IDM_USER_RENAME + MENUITEM SEPARATOR + MENUITEM "Eigenschaften", IDM_USER_PROPERTIES + END +END + + +/* Strings */ + +STRINGTABLE +BEGIN + IDS_CPLNAME "Benutzerkonten" + IDS_CPLDESCRIPTION "Verwaltet Benutzer und Gruppen" +END + +STRINGTABLE +BEGIN + IDS_NAME "Name" + IDS_FULLNAME "Voller Name" + IDS_DESCRIPTION "Beschreibung" +END diff --git a/reactos/dll/cpl/usrmgr/rsrc.rc b/reactos/dll/cpl/usrmgr/rsrc.rc index 2102d74add8..5e400c134c0 100644 --- a/reactos/dll/cpl/usrmgr/rsrc.rc +++ b/reactos/dll/cpl/usrmgr/rsrc.rc @@ -1,6 +1,7 @@ #include #include "resource.h" +#include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" diff --git a/reactos/dll/shellext/deskadp/lang/de-DE.rc b/reactos/dll/shellext/deskadp/lang/de-DE.rc index 0ccade07207..a7881428f7c 100644 --- a/reactos/dll/shellext/deskadp/lang/de-DE.rc +++ b/reactos/dll/shellext/deskadp/lang/de-DE.rc @@ -8,7 +8,7 @@ BEGIN GROUPBOX "Adaptertyp", -1, 7, 3, 237, 50 LTEXT "", IDC_ADAPTERNAME, 40, 17, 190, 20 PUSHBUTTON "&Einstellungen", IDC_ADAPTERPROPERTIES, 177, 33, 59, 14 - GROUPBOX "Adapter Information", -1, 7, 56, 237, 75 + GROUPBOX "Adapter-Informationen", -1, 7, 56, 237, 75 LTEXT "Chiptyp:", -1, 13, 68, 58, 8 LTEXT "", IDC_CHIPTYPE, 71, 68, 160, 8, SS_NOPREFIX LTEXT "DAC Typ:", -1, 13, 80, 58, 8 @@ -17,7 +17,7 @@ BEGIN LTEXT "", IDC_MEMORYSIZE, 71, 92, 160, 8, SS_NOPREFIX LTEXT "Zeichenfolge:", -1, 13, 104, 58, 8 LTEXT "", IDC_ADAPTERSTRING, 71, 104, 160, 8, SS_NOPREFIX - LTEXT "BIOS Informationen:", -1, 13, 116, 58, 8 + LTEXT "BIOS-Informationen:", -1, 13, 116, 58, 8 LTEXT "", IDC_BIOSINFORMATION, 71, 116, 160, 8, SS_NOPREFIX PUSHBUTTON "Alle Modi auf&listen...", IDC_LISTALLMODES, 7, 139, 75, 14 END diff --git a/reactos/dll/shellext/deskmon/lang/de-DE.rc b/reactos/dll/shellext/deskmon/lang/de-DE.rc index dc394c8b281..e6d7bd82492 100644 --- a/reactos/dll/shellext/deskmon/lang/de-DE.rc +++ b/reactos/dll/shellext/deskmon/lang/de-DE.rc @@ -17,6 +17,6 @@ END STRINGTABLE BEGIN - IDS_USEDEFFRQUENCY "Verwende Hardware Standardeinstellung." + IDS_USEDEFFRQUENCY "Verwende Hardware-Standardeinstellung." IDS_FREQFMT "%u Hertz" END diff --git a/reactos/dll/win32/devmgr/lang/de-DE.rc b/reactos/dll/win32/devmgr/lang/de-DE.rc index 72fa774af72..91769ff11f5 100644 --- a/reactos/dll/win32/devmgr/lang/de-DE.rc +++ b/reactos/dll/win32/devmgr/lang/de-DE.rc @@ -41,7 +41,7 @@ BEGIN IDS_DEV_ENTRY_IS_WRONG_TYPE "Dieses Gerät arbeitet nicht korrekt, weil einer seiner Treiber oder die Registry beschädigt ist." IDS_DEV_LACKED_ARBITRATOR "Der Treiber dieses Gerätes hat eine Ressource angefragt, die ReactOS nicht behandeln kann." IDS_DEV_BOOT_CONFIG_CONFLICT "Ein anderes Gerät benutzt bereits die Ressourcen, die dieses Gerät benötigt." - IDS_DEV_FAILED_FILTER "Die Treiber für dieses Gerät müssen neuinstalliert werden." + IDS_DEV_FAILED_FILTER "Die Treiber für dieses Gerät müssen neu installiert werden." IDS_DEV_DEVLOADER_NOT_FOUND "Dieses Gerät arbeitet nicht korrekt, weil ReactOS die Datei $1 nicht laden kann, die die Treiber für dieses Gerät lädt." IDS_DEV_DEVLOADER_NOT_FOUND2 "Dieses Gerät arbeitet nicht korrekt, weil die Datei $1, die die Treiber für dieses Gerät lädt, defekt ist." IDS_DEV_DEVLOADER_NOT_FOUND3 "Gerätefehler: Versuchen Sie, den Treiber für dieses Gerät auszutauschen. Wenn das nicht hilft, sehen Sie in die Gerätedokumentation." @@ -101,20 +101,20 @@ BEGIN IDS_PROP_SERVICE "Dienst" IDS_PROP_ENUMERATOR "Enumerator" IDS_PROP_CAPABILITIES "Eigenschaften" - IDS_PROP_DEVNODEFLAGS "DevNode Flags" - IDS_PROP_CONFIGFLAGS "Config Flags" - IDS_PROP_CSCONFIGFLAGS "CSConfig Flags" + IDS_PROP_DEVNODEFLAGS "DevNode-Flags" + IDS_PROP_CONFIGFLAGS "Config-Flags" + IDS_PROP_CSCONFIGFLAGS "CSConfig-Flags" IDS_PROP_EJECTIONRELATIONS "Auswurfsrichtlinien" IDS_PROP_REMOVALRELATIONS "Entfernungsrichtlinen" - IDS_PROP_BUSRELATIONS "Bus Richtlinien" + IDS_PROP_BUSRELATIONS "Busrichtlinien" IDS_PROP_DEVUPPERFILTERS "Obere Gerätefilter" IDS_PROP_DEVLOWERFILTERS "Untere Gerätefilter" IDS_PROP_CLASSUPPERFILTERS "Obere Klassenfilter" IDS_PROP_CLASSLOWERFILTERS "Untere Klassenfilter" - IDS_PROP_CLASSINSTALLER "Klassen Installationsprogramm" - IDS_PROP_CLASSCOINSTALLER "Klassen Co-Installationsprogramm" - IDS_PROP_DEVICECOINSTALLER "Geräte Co-Installationsprogramm" - IDS_PROP_FIRMWAREREVISION "Firmware Revision" + IDS_PROP_CLASSINSTALLER "Klasseninstallationsprogramm" + IDS_PROP_CLASSCOINSTALLER "Klassen-Coinstallationsprogramm" + IDS_PROP_DEVICECOINSTALLER "Geräte-Coinstallationsprogramm" + IDS_PROP_FIRMWAREREVISION "Firmwarerevision" IDS_PROP_CURRENTPOWERSTATE "Aktueller Energiezustand" IDS_PROP_POWERCAPABILITIES "Energie-Eigenschaften" IDS_PROP_POWERSTATEMAPPINGS "Energiezustandszuordnungen" @@ -213,7 +213,7 @@ END IDD_DEVICERESOURCES DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Resourcen" +CAPTION "Ressourcen" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 diff --git a/reactos/dll/win32/kernel32/lang/de-DE.mc b/reactos/dll/win32/kernel32/lang/de-DE.mc index 246460f87d0..04d9f804689 100644 --- a/reactos/dll/win32/kernel32/lang/de-DE.mc +++ b/reactos/dll/win32/kernel32/lang/de-DE.mc @@ -221,7 +221,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_LENGTH Language=German -ERROR_BAD_LENGTH - Das Programm veranlasste einen Befehl aber dessen Länge ist falsch. +ERROR_BAD_LENGTH - Das Programm veranlasste einen Befehl, aber dessen Länge ist falsch. . MessageId=25 @@ -285,7 +285,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SHARING_VIOLATION Language=German -ERROR_SHARING_VIOLATION - Der Prozess kann nicht auf die Datei zugreifen, weil sie von einem andern Prozess verwendet wird. +ERROR_SHARING_VIOLATION - Der Prozess kann nicht auf die Datei zugreifen, weil sie von einem anderen Prozess verwendet wird. . MessageId=33 @@ -341,7 +341,7 @@ Severity=Success Facility=System SymbolicName=ERROR_REM_NOT_LIST Language=German -ERROR_REM_NOT_LIST - ReactOS konnte den Netzwerkpfad nicht finden. Stellen Sie sicher, dass der Netzwerkpfad korrekt ist und der Ziel-Computer nicht belegt oder aus ist. Wenn ReactOS den Netzwerkpfad immer noch nicht finden kann, kontaktieren Sie den Netzwerk Administrator. +ERROR_REM_NOT_LIST - ReactOS konnte den Netzwerkpfad nicht finden. Stellen Sie sicher, dass der Netzwerkpfad korrekt ist und der Zielcomputer nicht belegt oder aus ist. Wenn ReactOS den Netzwerkpfad immer noch nicht finden kann, kontaktieren Sie den Netzwerkadministrator. . MessageId=52 @@ -349,7 +349,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DUP_NAME Language=German -ERROR_DUP_NAME - Sie wurden nicht verbunden weil der Computername schon im Netzwerk existiert. Gehen Sie zu System in der Systemsteuerung um den Computernamem zu ändern und versuchen Sie es erneut. +ERROR_DUP_NAME - Sie wurden nicht verbunden, weil der Computername schon im Netzwerk existiert. Gehen Sie zu System in der Systemsteuerung, um den Computernamen zu ändern, und versuchen Sie es erneut. . MessageId=53 @@ -373,7 +373,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DEV_NOT_EXIST Language=German -ERROR_DEV_NOT_EXIST - Die angegebene Netzwerk Resource oder Gerät ist nicht länger verfügbar. +ERROR_DEV_NOT_EXIST - Die angegebene Netzwerkressource oder das Gerät ist nicht länger verfügbar. . MessageId=56 @@ -381,7 +381,7 @@ Severity=Success Facility=System SymbolicName=ERROR_TOO_MANY_CMDS Language=German -ERROR_TOO_MANY_CMDS - Das Netzwerk BIOS-Befehlslimit wurde erreicht. +ERROR_TOO_MANY_CMDS - Das Netzwerk-BIOS-Befehlslimit wurde erreicht. . MessageId=57 @@ -437,7 +437,7 @@ Severity=Success Facility=System SymbolicName=ERROR_PRINT_CANCELLED Language=German -ERROR_PRINT_CANCELLED - Ihre Datei, die gedruchkt werden sollte, wurde gelöscht. +ERROR_PRINT_CANCELLED - Ihre Datei, die gedruckt werden sollte, wurde gelöscht. . MessageId=64 @@ -461,7 +461,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_DEV_TYPE Language=German -ERROR_BAD_DEV_TYPE - Der Netzwerkresourcentyp ist falsch. +ERROR_BAD_DEV_TYPE - Der Netzwerkressourcentyp ist falsch. . MessageId=67 @@ -469,7 +469,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_NET_NAME Language=German -ERROR_BAD_NET_NAME - The Netzwerkname kann nicht gefunden werden. +ERROR_BAD_NET_NAME - Der Netzwerkname kann nicht gefunden werden. . MessageId=68 @@ -477,7 +477,7 @@ Severity=Success Facility=System SymbolicName=ERROR_TOO_MANY_NAMES Language=German -ERROR_TOO_MANY_NAMES - Das Nameslimit für die Netzwerkkarte im lokalen Computer wurde überschritten. +ERROR_TOO_MANY_NAMES - Das Namenslimit für die Netzwerkkarte im lokalen Computer wurde überschritten. . MessageId=69 @@ -485,7 +485,7 @@ Severity=Success Facility=System SymbolicName=ERROR_TOO_MANY_SESS Language=German -ERROR_TOO_MANY_SESS - Das Limit für die Netzwerk-BIOS-Session wurde überschritten. +ERROR_TOO_MANY_SESS - Das Limit für die Netzwerk-BIOS-Sitzung wurde überschritten. . MessageId=70 @@ -581,7 +581,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NO_PROC_SLOTS Language=German -ERROR_NO_PROC_SLOTS - Das System kann zur Zeit keine weitere Prozesse starten. +ERROR_NO_PROC_SLOTS - Das System kann zur Zeit keine weiteren Prozesse starten. . MessageId=100 @@ -589,7 +589,7 @@ Severity=Success Facility=System SymbolicName=ERROR_TOO_MANY_SEMAPHORES Language=German -ERROR_TOO_MANY_SEMAPHORES - Es kann keine weitere System-Semaphores erstellt werden. +ERROR_TOO_MANY_SEMAPHORES - Es kann keine weitere System-Semaphore erstellt werden. . MessageId=101 @@ -629,7 +629,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SEM_OWNER_DIED Language=German -ERROR_SEM_OWNER_DIED - Der vorherige Eigentümer von dieser Semaphore wurde beendet. +ERROR_SEM_OWNER_DIED - Der vorherige Eigentümer dieser Semaphore wurde beendet. . MessageId=106 @@ -709,7 +709,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_CATEGORY Language=German -ERROR_INVALID_CATEGORY - Der IOCTL Aufruf ist ungültig. +ERROR_INVALID_CATEGORY - Der IOCTL-Aufruf ist ungültig. . MessageId=118 @@ -757,7 +757,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_NAME Language=German -ERROR_INVALID_NAME - Die Syntax des Dateinames, Verzeichnissnames, oder Datenträgernames ist falsch. +ERROR_INVALID_NAME - Die Syntax für den Datei- oder Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch. . MessageId=124 @@ -765,7 +765,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_LEVEL Language=German -ERROR_INVALID_LEVEL - Das Level des Systemausfrufes ist ungültig. +ERROR_INVALID_LEVEL - Das Level des Systemaufrufes ist ungültig. . MessageId=125 @@ -773,7 +773,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NO_VOLUME_LABEL Language=German -ERROR_NO_VOLUME_LABEL - The Datenträger hat keinen Datenträgernamen. +ERROR_NO_VOLUME_LABEL - Der Datenträger hat keinen Datenträgernamen. . MessageId=126 @@ -805,7 +805,7 @@ Severity=Success Facility=System SymbolicName=ERROR_CHILD_NOT_COMPLETE Language=German -ERROR_CHILD_NOT_COMPLETE - Das %1 Programm kann im Win32 Modus nicht ausgeführt werden. +ERROR_CHILD_NOT_COMPLETE - Das Programm %1 kann im Win32-Modus nicht ausgeführt werden. . MessageId=130 @@ -829,7 +829,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SEEK_ON_DEVICE Language=German -ERROR_SEEK_ON_DEVICE - Der Dateizeiger kann nicht auf dem angegebenen Gerät oder der Datei gesetzt werden. +ERROR_SEEK_ON_DEVICE - Der Dateizeiger kann nicht auf das angegebene Gerät oder die Datei gesetzt werden. . MessageId=133 @@ -837,7 +837,7 @@ Severity=Success Facility=System SymbolicName=ERROR_IS_JOIN_TARGET Language=German -ERROR_IS_JOIN_TARGET - Ein JOIN oder SUBST Befehl kann nicht für ein Laufwerk verwendet werden, das vereinigte Laufwerke enthält. +ERROR_IS_JOIN_TARGET - Ein JOIN- oder SUBST-Befehl kann nicht für ein Laufwerk verwendet werden, das vereinigte Laufwerke enthält. . MessageId=134 @@ -845,7 +845,7 @@ Severity=Success Facility=System SymbolicName=ERROR_IS_JOINED Language=German -ERROR_IS_JOINED - Ein JOIN oder SUBST Befehl kann nicht für ein Laufwerk verwendet werden, das schon vereinigt ist. +ERROR_IS_JOINED - Ein JOIN- oder SUBST-Befehl kann nicht für ein Laufwerk verwendet werden, das schon vereinigt ist. . MessageId=135 @@ -853,7 +853,7 @@ Severity=Success Facility=System SymbolicName=ERROR_IS_SUBSTED Language=German -ERROR_IS_SUBSTED - Ein JOIN oder SUBST Befehl kann nicht für ein Laufwerk benutzt werden, das schon gesubst ist. +ERROR_IS_SUBSTED - Ein JOIN- oder SUBST-Befehl kann nicht für ein Laufwerk benutzt werden, das schon gesubst ist. . MessageId=136 @@ -869,7 +869,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NOT_SUBSTED Language=German -ERROR_NOT_SUBSTED - Das System versuchte ein SUBST von einem Laufwerk zu löschen das nicht gesubst ist. +ERROR_NOT_SUBSTED - Das System versuchte ein SUBST von einem Laufwerk zu löschen, das nicht gesubst ist. . MessageId=138 @@ -909,7 +909,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BUSY_DRIVE Language=German -ERROR_BUSY_DRIVE - Das System kann zur Zeit kein JOIN oder SUBST ausführen. +ERROR_BUSY_DRIVE - Das System kann zurzeit kein JOIN oder SUBST ausführen. . MessageId=143 @@ -925,7 +925,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DIR_NOT_ROOT Language=German -ERROR_DIR_NOT_ROOT - The Verzeichnis ist kein Unterverzeichnis vom Stammverzeichnis. +ERROR_DIR_NOT_ROOT - Das Verzeichnis ist kein Unterverzeichnis vom Stammverzeichnis. . MessageId=145 @@ -933,7 +933,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DIR_NOT_EMPTY Language=German -ERROR_DIR_NOT_EMPTY - The Verzeichnis ist nicht leer. +ERROR_DIR_NOT_EMPTY - Das Verzeichnis ist nicht leer. . MessageId=146 @@ -965,7 +965,7 @@ Severity=Success Facility=System SymbolicName=ERROR_IS_SUBST_TARGET Language=German -ERROR_IS_SUBST_TARGET - Es wurde versucht von einem Laufwerk zu substen oder zu joinen das schon gesubst ist. +ERROR_IS_SUBST_TARGET - Es wurde versucht, von einem Laufwerk zu substen oder zu joinen das schon gesubst ist. . MessageId=150 @@ -973,7 +973,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SYSTEM_TRACE Language=German -ERROR_SYSTEM_TRACE - Systemtracking Information wurden nicht in Ihrer CONFIG.SYS Datei angeben, oder Tracking ist verboten. +ERROR_SYSTEM_TRACE - Systemtracking-Informationen wurden nicht in Ihrer CONFIG.SYS-Datei angegeben oder Tracking ist verboten. . MessageId=151 @@ -997,7 +997,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_LIST_FORMAT Language=German -ERROR_INVALID_LIST_FORMAT - Die DosMuxSemWait Liste ist ungültig. +ERROR_INVALID_LIST_FORMAT - Die DosMuxSemWait-Liste ist ungültig. . MessageId=154 @@ -1021,7 +1021,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SIGNAL_REFUSED Language=German -ERROR_SIGNAL_REFUSED - The Prozess hat das Signal zurückgewiesen. +ERROR_SIGNAL_REFUSED - Der Prozess hat das Signal zurückgewiesen. . MessageId=157 @@ -1037,7 +1037,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NOT_LOCKED Language=German -ERROR_NOT_LOCKED - Das Segment ist schon freigebenen. +ERROR_NOT_LOCKED - Das Segment ist schon freigegeben. . MessageId=159 @@ -1045,7 +1045,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_THREADID_ADDR Language=German -ERROR_BAD_THREADID_ADDR - DIe Adresse für den Thread ID ist falsch. +ERROR_BAD_THREADID_ADDR - Die Adresse für die Thread-ID ist falsch. . MessageId=160 @@ -1093,7 +1093,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BUSY Language=German -ERROR_BUSY - Die angeforderte Ressorce wird beutzt. +ERROR_BUSY - Die angeforderte Ressource wird beutzt. . MessageId=173 @@ -1101,7 +1101,7 @@ Severity=Success Facility=System SymbolicName=ERROR_CANCEL_VIOLATION Language=German -ERROR_CANCEL_VIOLATION - Es gibt keine Aufforderung den Bereich zu sperren. +ERROR_CANCEL_VIOLATION - Es gibt keine Aufforderung, den Bereich zu sperren. . MessageId=174 @@ -1181,7 +1181,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_EXE_SIGNATURE Language=German -ERROR_INVALID_EXE_SIGNATURE - %1 kann nicht im Win32 Modus ausgeführt werden. +ERROR_INVALID_EXE_SIGNATURE - %1 kann nicht im Win32-Modus ausgeführt werden. . MessageId=192 @@ -1197,7 +1197,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_EXE_FORMAT Language=German -ERROR_BAD_EXE_FORMAT - %1 ist kein gültiges Win32 Programm. +ERROR_BAD_EXE_FORMAT - %1 ist kein gültiges Win32-Programm. . MessageId=194 @@ -1301,7 +1301,7 @@ Severity=Success Facility=System SymbolicName=ERROR_RING2_STACK_IN_USE Language=German -ERROR_RING2_STACK_IN_USE - Der Ring 2 Stack wird benutzt. +ERROR_RING2_STACK_IN_USE - Der Ring-2-Stack wird benutzt. . MessageId=208 @@ -1309,7 +1309,7 @@ Severity=Success Facility=System SymbolicName=ERROR_META_EXPANSION_TOO_LONG Language=German -ERROR_META_EXPANSION_TOO_LONG - Es wurden zu viele Platzhalter, wie ? oder *, eingeben. +ERROR_META_EXPANSION_TOO_LONG - Es wurden zu viele Platzhalter, wie ? oder *, eingegeben. . MessageId=209 @@ -1341,7 +1341,7 @@ Severity=Success Facility=System SymbolicName=ERROR_TOO_MANY_MODULES Language=German -ERROR_TOO_MANY_MODULES - Es werden zu viele DLLs von diesem Programm oder DLL bentzt. +ERROR_TOO_MANY_MODULES - Es werden zu viele DLLs von diesem Programm oder DLL benutzt. . MessageId=215 @@ -1365,7 +1365,7 @@ Severity=Success Facility=System SymbolicName=ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY Language=German -ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY - Die ausführbare Datei %1 ist signiert, es es nicht möglich sie zu ändern. +ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY - Die ausführbare Datei %1 ist signiert, es ist nicht möglich, sie zu ändern. . MessageId=218 @@ -1373,7 +1373,7 @@ Severity=Success Facility=System SymbolicName=ERRO_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY Language=German -ERRO_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY - Die ausführbare Datei %1 ist stark signiert, es es nicht möglich sie zu ändern. +ERRO_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY - Die ausführbare Datei %1 ist stark signiert, es ist nicht möglich, sie zu ändern. . MessageId=230 @@ -1421,7 +1421,7 @@ Severity=Success Facility=System SymbolicName=ERROR_VC_DISCONNECTED Language=German -ERROR_VC_DISCONNECTED - Die Session wurde abgebrochen. +ERROR_VC_DISCONNECTED - Die Sitzung wurde abgebrochen. . MessageId=254 @@ -1461,7 +1461,7 @@ Severity=Success Facility=System SymbolicName=ERROR_CANNOT_COPY Language=German -ERROR_CANNOT_COPY - Die Kopierfuntionen können nicht benutzt werden. +ERROR_CANNOT_COPY - Die Kopierfunktionen können nicht benutzt werden. . MessageId=267 @@ -1477,7 +1477,7 @@ Severity=Success Facility=System SymbolicName=ERROR_EAS_DIDNT_FIT Language=German -ERROR_EAS_DIDNT_FIT - Die erweiterte Attribute passten nicht in den Buffer. +ERROR_EAS_DIDNT_FIT - Die erweiterten Attribute passten nicht in den Puffer. . MessageId=276 @@ -1501,7 +1501,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_EA_HANDLE Language=German -ERROR_INVALID_EA_HANDLE - Der angegebene erweiterte Attribut-Handle ist ungültig. +ERROR_INVALID_EA_HANDLE - Das angegebene erweiterte Attribut-Handle ist ungültig. . MessageId=282 @@ -1509,7 +1509,7 @@ Severity=Success Facility=System SymbolicName=ERROR_EAS_NOT_SUPPORTED Language=German -ERROR_EAS_NOT_SUPPORTED - Das benutzte Dateisystem unterstützt keine erweiterte Attribute. +ERROR_EAS_NOT_SUPPORTED - Das benutzte Dateisystem unterstützt keine erweiterten Attribute. . MessageId=288 @@ -1517,7 +1517,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NOT_OWNER Language=German -ERROR_NOT_OWNER - Es wurde versucht, ein Mutex freizugeben das nicht dem Aufrufer gehört. +ERROR_NOT_OWNER - Es wurde versucht, ein Mutex freizugeben, das nicht dem Aufrufer gehört. . MessageId=298 @@ -1533,7 +1533,7 @@ Severity=Success Facility=System SymbolicName=ERROR_PARTIAL_COPY Language=German -ERROR_PARTIAL_COPY - Es wurde nur ein Teil von einer ReadProcessMemory oder WriteProcessMemory Anforderung fertiggestellt. +ERROR_PARTIAL_COPY - Es wurde nur ein Teil einer ReadProcessMemory- oder WriteProcessMemory-Anforderung fertiggestellt. . MessageId=300 @@ -1541,7 +1541,7 @@ Severity=Success Facility=System SymbolicName=ERROR_OPLOCK_NOT_GRANTED Language=German -ERROR_OPLOCK_NOT_GRANTED - Die Oplock Anforderung ist verboten. +ERROR_OPLOCK_NOT_GRANTED - Die Oplock-Anforderung ist verboten. . MessageId=301 @@ -1549,7 +1549,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_OPLOCK_PROTOCOL Language=German -ERROR_INVALID_OPLOCK_PROTOCOL - Eine ungültige Oplock Bestätigung wurde vom System empfangen. +ERROR_INVALID_OPLOCK_PROTOCOL - Eine ungültige Oplock-Bestätigung wurde vom System empfangen. . MessageId=302 @@ -1557,7 +1557,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DISK_TOO_FRAGMENTED Language=German -ERROR_DISK_TOO_FRAGMENTED - Der Datenträger ist zu fragmentiert um diese Operation fertigzustellen. +ERROR_DISK_TOO_FRAGMENTED - Der Datenträger ist zu stark fragmentiert, um diese Operation fertigzustellen. . MessageId=303 @@ -1629,7 +1629,7 @@ Severity=Success Facility=System SymbolicName=ERROR_ABIOS_ERROR Language=German -ERROR_ABIOS_ERROR - Es ist ein Fehler im ABIOS System aufgetreten. +ERROR_ABIOS_ERROR - Es ist ein Fehler im ABIOS-System aufgetreten. . MessageId=539 @@ -1637,7 +1637,7 @@ Severity=Success Facility=System SymbolicName=ERROR_WX86_WARNING Language=German -ERROR_WX86_WARNING - Es ist eine Warnung im WX86 System aufgetreten. +ERROR_WX86_WARNING - Es ist eine Warnung im WX86-System aufgetreten. . MessageId=540 @@ -1645,7 +1645,7 @@ Severity=Success Facility=System SymbolicName=ERROR_WX86_ERROR Language=German -ERROR_WX86_ERROR - Es ist ein Fehler im WX86 System aufgetreten. +ERROR_WX86_ERROR - Es ist ein Fehler im WX86-System aufgetreten. . MessageId=541 @@ -1653,7 +1653,7 @@ Severity=Success Facility=System SymbolicName=ERROR_TIMER_NOT_CANCELED Language=German -ERROR_TIMER_NOT_CANCELED - Es wurde der Versuch gemacht einen Timer zu setzen oder zu löschen der nicht dem Aufrufer gehört. +ERROR_TIMER_NOT_CANCELED - Es wurde der Versuch gemacht, einen Timer zu setzen oder zu löschen, der nicht dem Aufrufer gehört. . MessageId=542 @@ -1661,7 +1661,7 @@ Severity=Success Facility=System SymbolicName=ERROR_UNWIND Language=German -ERROR_UNWIND - Unwind Ausnahme Code. +ERROR_UNWIND - Unwind-Ausnahmecode. . MessageId=543 @@ -1669,7 +1669,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_STACK Language=German -ERROR_BAD_STACK - Während einer Unwind-Operation wurde ein ungültiger oder unaligned Stack angetroffen. +ERROR_BAD_STACK - Während einer Unwind-Operation wurde ein ungültiger oder unausgeglichener Stack angetroffen. . MessageId=544 @@ -1685,7 +1685,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_PORT_ATTRIBUTES Language=German -ERROR_INVALID_PORT_ATTRIBUTES - Es wurden ungültige Portparameter angeben. +ERROR_INVALID_PORT_ATTRIBUTES - Es wurden ungültige Portparameter angegeben. . MessageId=546 @@ -1693,7 +1693,7 @@ Severity=Success Facility=System SymbolicName=ERROR_PORT_MESSAGE_TOO_LONG Language=German -ERROR_PORT_MESSAGE_TOO_LONG - Die Länge der Nachricht war zu lang. +ERROR_PORT_MESSAGE_TOO_LONG - Die Nachricht war zu lang. . MessageId=547 @@ -1701,7 +1701,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_QUOTA_LOWER Language=German -ERROR_INVALID_QUOTA_LOWER - Es wurde versucht, das Quote-Limit unter der derzeitgen Benutzung zu setzen. +ERROR_INVALID_QUOTA_LOWER - Es wurde versucht, das Quote-Limit unter die derzeitige Belegung zu setzen. . MessageId=548 @@ -1709,7 +1709,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DEVICE_ALREADY_ATTACHED Language=German -ERROR_DEVICE_ALREADY_ATTACHED - Es wurde versucht, ein Gerät anzuschliesen das schon an einem anderen Gerät angeschlossen ist. +ERROR_DEVICE_ALREADY_ATTACHED - Es wurde versucht, ein Gerät anzuschließen, das schon an einem anderen Gerät angeschlossen ist. . MessageId=549 @@ -1717,7 +1717,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INSTRUCTION_MISALIGNMENT Language=German -ERROR_INSTRUCTION_MISALIGNMENT - Es wurde versucht, einen Befehl an einer unaligned Adresse auzuführen, was dieses System nicht unterstützt. +ERROR_INSTRUCTION_MISALIGNMENT - Es wurde versucht, einen Befehl an einer nicht angeschlossenen Adresse auzuführen, was dieses System nicht unterstützt. . MessageId=550 @@ -1741,7 +1741,7 @@ Severity=Success Facility=System SymbolicName=ERROR_COULD_NOT_INTERPRET Language=German -ERROR_COULD_NOT_INTERPRET - Der übergebene ACL hatte nicht die minimalen notwenigen Informationen. +ERROR_COULD_NOT_INTERPRET - Der übergebene ACL hatte nicht die minimalen notwendigen Informationen. . MessageId=553 @@ -1773,7 +1773,7 @@ Severity=Success Facility=System SymbolicName=ERROR_UNEXPECTED_MM_CREATE_ERR Language=German -ERROR_UNEXPECTED_MM_CREATE_ERR - Wenn ein nicht im Standard FsRtl Filter definierter Fehler zurückgeben wird, wird es in einen der folgenden Fehler konvertiert, die garantiert im Filter sind. In diesem Fall geht Information verloren, aber der Filter behandelt den Fehler richtig. +ERROR_UNEXPECTED_MM_CREATE_ERR - Wenn ein nicht im Standard-FsRtl-Filter definierter Fehler zurückgeben wird, wird es in einen der folgenden Fehler konvertiert, die garantiert im Filter sind. In diesem Fall geht Information verloren, aber der Filter behandelt den Fehler richtig. . MessageId=557 @@ -1781,7 +1781,7 @@ Severity=Success Facility=System SymbolicName=ERROR_UNEXPECTED_MM_MAP_ERROR Language=German -ERROR_UNEXPECTED_MM_MAP_ERROR - Wenn ein nicht im Standart FsRtl Filter definierter Fehler zurückgeben wird, wird es in einen der folgenden Fehlern konvertiert, die garantiert im Filter sind. In diesem Fall geht Information verloren, aber der Filter behandelt den Fehler richtig. +ERROR_UNEXPECTED_MM_MAP_ERROR - Wenn ein nicht im Standard-FsRtl-Filter definierter Fehler zurückgeben wird, wird es in einen der folgenden Fehlern konvertiert, die garantiert im Filter sind. In diesem Fall geht Information verloren, aber der Filter behandelt den Fehler richtig. . MessageId=558 @@ -1789,7 +1789,7 @@ Severity=Success Facility=System SymbolicName=ERROR_UNEXPECTED_MM_EXTEND_ERR Language=German -ERROR_UNEXPECTED_MM_EXTEND_ERR - Wenn ein nicht im Standard FsRtl Filter definierter Fehler zurückgeben wird, wird es in einen der folgenden Fehler konvertiert, die garantiert im Filter sind. In diesem Fall geht Information verloren, aber der Filter behandelt den Fehler richtig. +ERROR_UNEXPECTED_MM_EXTEND_ERR - Wenn ein nicht im Standard-FsRtl-Filter definierter Fehler zurückgeben wird, wird es in einen der folgenden Fehler konvertiert, die garantiert im Filter sind. In diesem Fall geht Information verloren, aber der Filter behandelt den Fehler richtig. . MessageId=559 @@ -1797,7 +1797,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_FUNCTION_TABLE Language=German -ERROR_BAD_FUNCTION_TABLE - A malformed function table was encountered during an unwind Operation. +ERROR_BAD_FUNCTION_TABLE - Während einer Unwind-Operation wurde eine fehlerhafte Funktionstabelle angetroffen. . MessageId=560 @@ -1813,7 +1813,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_LDT_SIZE Language=German -ERROR_INVALID_LDT_SIZE - Es wurde ein Versuch gemacht eine LDT größer zu machen, oder die Größe ist keine gerade Zahl von Auswählern. +ERROR_INVALID_LDT_SIZE - Es wurde ein Versuch unternommen, eine LDT größer zu machen, oder die Größe ist keine gerade Zahl von Auswählern. . MessageId=563 @@ -1821,7 +1821,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_LDT_OFFSET Language=German -ERROR_INVALID_LDT_OFFSET - Der Startwert für die LDT Information war kein ganzzahliges Vielfaches von der Auswahlgröße. +ERROR_INVALID_LDT_OFFSET - Der Startwert für die LDT-Information war kein ganzzahliges Vielfaches von der Auswahlgröße. . MessageId=564 @@ -1829,7 +1829,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_LDT_DESCRIPTOR Language=German -ERROR_INVALID_LDT_DESCRIPTOR - Der Benutzer hat eine ungültige Bezeichnung angegeben, wenn verucht wurde LDT Bezeichnungen zu erstellen. +ERROR_INVALID_LDT_DESCRIPTOR - Der Benutzer hat eine ungültige Bezeichnung angegeben, wenn versucht wurde, LDT-Bezeichnungen zu erstellen. . MessageId=565 @@ -1845,7 +1845,7 @@ Severity=Success Facility=System SymbolicName=ERROR_THREAD_NOT_IN_PROCESS Language=German -ERROR_THREAD_NOT_IN_PROCESS - Der Thread ist nicht im angebenen Prozess. +ERROR_THREAD_NOT_IN_PROCESS - Der Thread ist nicht im angegebenen Prozess. . MessageId=567 @@ -1869,7 +1869,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SYNCHRONIZATION_REQUIRED Language=German -ERROR_SYNCHRONIZATION_REQUIRED - Die SAM Datenbank in einem Windows Server ist nicht synchrom mit der Kopie auf dem Domänenkontroller, wesewegen eine Syncronisation benötigt wird. +ERROR_SYNCHRONIZATION_REQUIRED - Die SAM-Datenbank in einem Windows-Server ist nicht synchron mit der Kopie auf dem Domänenkontroller, weswegen eine Synchronisation benötigt wird. . MessageId=570 @@ -1877,7 +1877,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NET_OPEN_FAILED Language=German -ERROR_NET_OPEN_FAILED - Die NtCreateFile API schlug fehl. Dieser Fehler sollte nie einem Programm zurückgegeben werden, es ist ein Platzhalter für den ReactOS Lan Manager Redirector zur verwendung in dessen internen Fehlerbehandlungsroutinen. +ERROR_NET_OPEN_FAILED - Die NtCreateFile-API schlug fehl. Dieser Fehler sollte nie einem Programm zurückgegeben werden, es ist ein Platzhalter für den ReactOS Lan Manager Redirector zur verwendung in dessen internen Fehlerbehandlungsroutinen. . MessageId=571 @@ -1885,7 +1885,7 @@ Severity=Success Facility=System SymbolicName=ERROR_IO_PRIVILEGE_FAILED Language=German -ERROR_IO_PRIVILEGE_FAILED - Die I/O Rechte könnten für den Prozess nicht geändert werden. +ERROR_IO_PRIVILEGE_FAILED - Die I/O-Rechte könnten für den Prozess nicht geändert werden. . MessageId=572 @@ -1893,7 +1893,7 @@ Severity=Success Facility=System SymbolicName=ERROR_CONTROL_C_EXIT Language=German -ERROR_CONTROL_C_EXIT - Das Proamm wurde wegen einer Eingabe von Strg+C beendet. +ERROR_CONTROL_C_EXIT - Das Programm wurde wegen einer Eingabe von Strg+C beendet. . MessageId=573 @@ -1901,7 +1901,7 @@ Severity=Success Facility=System SymbolicName=ERROR_MISSING_SYSTEMFILE Language=German -ERROR_MISSING_SYSTEMFILE - Die benötigte System Datei %hs ist falsch oder fehlt. +ERROR_MISSING_SYSTEMFILE - Die benötigte Systemdatei %hs ist falsch oder fehlt. . MessageId=574 @@ -1917,7 +1917,7 @@ Severity=Success Facility=System SymbolicName=ERROR_APP_INIT_FAILURE Language=German -ERROR_APP_INIT_FAILURE - Das Programm konnte nicht richtig initalisiert werden (0x%lx). Klicken Sie auf OK um das Programm zu beenden. +ERROR_APP_INIT_FAILURE - Das Programm konnte nicht richtig initalisiert werden (0x%lx). Klicken Sie auf OK, um das Programm zu beenden. . MessageId=576 @@ -1941,7 +1941,7 @@ Severity=Success Facility=System SymbolicName=ERROR_ILLEGAL_FLOAT_CONTEXT Language=German -ERROR_ILLEGAL_FLOAT_CONTEXT - Ein Programm im Realmodus veranlasste einen Fließkommabefehl aber es ist keine Fließkomma Hardware vorhanden. +ERROR_ILLEGAL_FLOAT_CONTEXT - Ein Programm im Realmodus veranlasste einen Fließkommabefehl, aber es ist keine Fließkomma-Hardware vorhanden. . MessageId=580 @@ -1949,7 +1949,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NO_EVENT_PAIR Language=German -ERROR_NO_EVENT_PAIR - Eine Ereignispaarsynchronisation wurde unter Benutzung des Client/Server Ereignispaares des Threads angefordert, es wurde aber kein Ereignispaarobjekt mit dem Thread verbunden. +ERROR_NO_EVENT_PAIR - Eine Ereignispaarsynchronisation wurde unter Benutzung des Client/Server-Ereignispaares des Threads angefordert, es wurde aber kein Ereignispaarobjekt mit dem Thread verbunden. . MessageId=581 @@ -1957,7 +1957,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DOMAIN_CTRLR_CONFIG_ERROR Language=German -ERROR_DOMAIN_CTRLR_CONFIG_ERROR - Ein Windows Server hat eine falsche Konfiguration. +ERROR_DOMAIN_CTRLR_CONFIG_ERROR - Ein Windows-Server hat eine falsche Konfiguration. . MessageId=582 @@ -1965,7 +1965,7 @@ Severity=Success Facility=System SymbolicName=ERROR_ILLEGAL_CHARACTER Language=German -ERROR_ILLEGAL_CHARACTER - Es wurde ein illegales Zeichen gefunden. For ein multi-byte Zeichensatz schließt dies ein Führungs-Byte ohne ein fogendes Anschluss-Byte ein. Für den Unicode Zeichensatz schließt dies die Zeichen 0xFFFF und 0xFFFE ein. +ERROR_ILLEGAL_CHARACTER - Es wurde ein illegales Zeichen gefunden. Für einen Multi-Byte-Zeichensatz schließt dies ein Führungs-Byte ohne ein fogendes Anschluss-Byte ein. Für den Unicode-Zeichensatz schließt dies die Zeichen 0xFFFF und 0xFFFE ein. . MessageId=583 @@ -1973,7 +1973,7 @@ Severity=Success Facility=System SymbolicName=ERROR_UNDEFINED_CHARACTER Language=German -ERROR_UNDEFINED_CHARACTER - Das Unicodezeichen ist nicht im Unicode Zeichensatz definiert. +ERROR_UNDEFINED_CHARACTER - Das Unicodezeichen ist nicht im Unicode-Zeichensatz definiert. . MessageId=584 @@ -1989,7 +1989,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BIOS_FAILED_TO_CONNECT_INTERRUPT Language=German -ERROR_BIOS_FAILED_TO_CONNECT_INTERRUPT - Das System BIOS konnte einen Systeminterupt nicht an das Gerät oder dessen Bus verbinden. +ERROR_BIOS_FAILED_TO_CONNECT_INTERRUPT - Das System-BIOS konnte einen Systeminterupt nicht an das Gerät oder dessen Bus verbinden. . MessageId=586 @@ -2021,7 +2021,7 @@ Severity=Success Facility=System SymbolicName=ERROR_CANNOT_LOAD_REGISTRY_FILE Language=German -ERROR_CANNOT_LOAD_REGISTRY_FILE - Die Registrierungsdatenbank kann die Hive (Datei) nicht laden: %hs, sein Log oder die Alternative. Sie ist korrupt, fehlt oder ist nicht beschreibbar. +ERROR_CANNOT_LOAD_REGISTRY_FILE - Die Registrierungsdatenbank kann den Zweig nicht laden: %hs, sein Log oder die Alternative. Sie ist korrupt, fehlt oder ist nicht beschreibbar. . MessageId=590 @@ -2029,7 +2029,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DEBUG_ATTACH_FAILED Language=German -ERROR_DEBUG_ATTACH_FAILED - Es ist während der Abarbeitung einer DebugActiveProcess API Anforderung ein unerwarteter Fehler aufgetreten. Wählen Sie OK, um den Prozess zu beenden oder Abbrechen, um den Fehler zu ignorieren +ERROR_DEBUG_ATTACH_FAILED - Es ist während der Abarbeitung einer DebugActiveProcess-API-Anforderung ein unerwarteter Fehler aufgetreten. Wählen Sie OK, um den Prozess zu beenden oder Abbrechen, um den Fehler zu ignorieren . MessageId=591 @@ -2037,7 +2037,7 @@ Severity=Success Facility=System SymbolicName=ERROR_SYSTEM_PROCESS_TERMINATED Language=German -ERROR_SYSTEM_PROCESS_TERMINATED - Der %hs System Prozess wurde mit dem Status 0x%08x (0x%08x 0x%08x) unerwartet beendet. Das System wurde heruntergefahren. +ERROR_SYSTEM_PROCESS_TERMINATED - Der %hs-Systemprozess wurde mit dem Status 0x%08x (0x%08x 0x%08x) unerwartet beendet. Das System wurde heruntergefahren. . MessageId=592 @@ -2045,7 +2045,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DATA_NOT_ACCEPTED Language=German -ERROR_DATA_NOT_ACCEPTED - The TDI konnte die empfangenen Daten während einer Andeutung nicht bearbeiten. +ERROR_DATA_NOT_ACCEPTED - Das TDI konnte die empfangenen Daten während einer Andeutung nicht bearbeiten. . MessageId=593 @@ -2061,7 +2061,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DRIVER_CANCEL_TIMEOUT Language=German -ERROR_DRIVER_CANCEL_TIMEOUT - Das Laufwerk %hs konnte eine abgebroche I/O Operation nicht in der vorhergesehenen Zeit fertigstellen. +ERROR_DRIVER_CANCEL_TIMEOUT - Das Laufwerk %hs konnte eine abgebrochene I/O-Operation nicht in der vorhergesehenen Zeit fertigstellen. . MessageId=595 @@ -2069,7 +2069,7 @@ Severity=Success Facility=System SymbolicName=ERROR_REPLY_MESSAGE_MISMATCH Language=German -ERROR_REPLY_MESSAGE_MISMATCH - Es wurde versucht, auf eine LPC Nachricht zu antowrten, aber der vom Thread in der Nachricht angegebene Klient wartete nicht auf diese Nachricht. +ERROR_REPLY_MESSAGE_MISMATCH - Es wurde versucht, auf eine LPC-Nachricht zu antowrten, aber der vom Thread in der Nachricht angegebene Klient wartete nicht auf diese Nachricht. . MessageId=596 @@ -2109,7 +2109,7 @@ Severity=Success Facility=System SymbolicName=ERROR_CONVERT_TO_LARGE Language=German -ERROR_CONVERT_TO_LARGE - Internal OFS status codes indicating how ein allocation Operation ist Handled. Either es ist retried after the containing onode ist moved oder the extent Stream ist converted to ein lang Stream. +ERROR_CONVERT_TO_LARGE - Interne OFS-Statuscodes zeigen an, dass eine Allokation behandelt wird. Either es ist retried after the containing onode ist moved oder the extent Stream ist converted to ein lang Stream. . MessageId=601 @@ -2141,7 +2141,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_VARIANT Language=German -ERROR_INVALID_VARIANT - Die übergebene Variant Struktur enthält ungültige Daten. +ERROR_INVALID_VARIANT - Die übergebene Variant-Struktur enthält ungültige Daten. . MessageId=605 @@ -2173,7 +2173,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INSUFFICIENT_LOGON_INFO Language=German -ERROR_INSUFFICIENT_LOGON_INFO - Es gibt zu wenig Account Informationen um sich einzuloggen. +ERROR_INSUFFICIENT_LOGON_INFO - Es gibt zu wenig Account-Informationen um sich einzuloggen. . MessageId=609 @@ -2189,7 +2189,7 @@ Severity=Success Facility=System SymbolicName=ERROR_BAD_SERVICE_ENTRYPOINT Language=German -ERROR_BAD_SERVICE_ENTRYPOINT - Der %hs Dienst wurde nicht korrekt geschrieben. Der Stack-Zeiger wurde in einem unvereinbaren Status gelassen. The callback entrypoint should be declared as WINAPI oder STDCALL. Selecting OK will cause the service to continue Operation. However, the service Prozess may operate incorrectly. +ERROR_BAD_SERVICE_ENTRYPOINT - Der %hs-Dienst wurde nicht korrekt geschrieben. Der Stack-Zeiger wurde in einem unvereinbaren Status gelassen. The callback entrypoint should be declared as WINAPI oder STDCALL. Selecting OK will cause the service to continue Operation. However, the service Prozess may operate incorrectly. . MessageId=611 @@ -2221,7 +2221,7 @@ Severity=Success Facility=System SymbolicName=ERROR_NO_CALLBACK_ACTIVE Language=German -ERROR_NO_CALLBACK_ACTIVE - Es ist keine Callback Funktion aktiv, weswegen der Callbackrückgabedienst nicht gestartet werden kann. +ERROR_NO_CALLBACK_ACTIVE - Es ist keine Callback-Funktion aktiv, weswegen der Callbackrückgabedienst nicht gestartet werden kann. . MessageId=615 @@ -2229,7 +2229,7 @@ Severity=Success Facility=System SymbolicName=ERROR_PWD_TOO_SHORT Language=German -ERROR_PWD_TOO_SHORT - Das Passwort ist zu kurz für Ihr Richtlinie. Wählen Sie bitte ein längeres Passwort +ERROR_PWD_TOO_SHORT - Das Passwort ist zu kurz für Ihre Richtlinie. Wählen Sie bitte ein längeres Passwort . MessageId=616 @@ -2269,7 +2269,7 @@ Severity=Success Facility=System SymbolicName=ERROR_INVALID_PLUGPLAY_DEVICE_PATH Language=German -ERROR_INVALID_PLUGPLAY_DEVICE_PATH - Der angegebene Plug und Play Gerätepfad in der Registry ist falsch. +ERROR_INVALID_PLUGPLAY_DEVICE_PATH - Der angegebene Plug-and-Play-Gerätepfad in der Registry ist falsch. . MessageId=621 @@ -2277,7 +2277,7 @@ Severity=Success Facility=System SymbolicName=ERROR_QUOTA_LIST_INCONSISTENT Language=German -ERROR_QUOTA_LIST_INCONSISTENT - Die angegebene Quota Liste ist intern unvereinbar mit Ihrem Beschreiber. +ERROR_QUOTA_LIST_INCONSISTENT - Die angegebene Quotaliste ist intern unvereinbar mit Ihrem Beschreiber. . MessageId=622 @@ -2285,7 +2285,7 @@ Severity=Success Facility=System SymbolicName=ERROR_EVALUATION_EXPIRATION Language=German -ERROR_EVALUATION_EXPIRATION - ReactOS ist ein freien Open-Source Betriebsystem und lizensiert under der GNU GPL. Daher gibt es auch keine Evaluation-Zeit die ablaufen könnte. Wenn Sie diesen Fehler sehen, dann lesen Sie vermutlich den Quellcode. +ERROR_EVALUATION_EXPIRATION - ReactOS ist ein freies Open-Source-Betriebsystem und lizenziert under der GNU GPL. Daher gibt es auch keine Evaluationszeit, die ablaufen könnte. Wenn Sie diesen Fehler sehen, dann lesen Sie vermutlich den Quellcode. . MessageId=623 @@ -2293,7 +2293,7 @@ Severity=Success Facility=System SymbolicName=ERROR_ILLEGAL_DLL_RELOCATION Language=German -ERROR_ILLEGAL_DLL_RELOCATION - The system DLL %hs was relocated in memory. The application will not run properly. The relocation occurred because the DLL %hs occupied an address range reserved for ReactOS system DLLs. The vendor supplying the DLL should be contacted for a new DLL. +ERROR_ILLEGAL_DLL_RELOCATION - Die System-DLL %hs wurde im Speicher neu adressiert. Die Anwendung wird nicht korrekt funktionieren. Die Neuadressierung wurde durchgeführt, weil die DLL %hs einen Adressbereich belegte, der für ReactOS-System-DLLs reserviert ist. Der Entwickler sollte wegen Auslieferung einer neuen DLL kontaktiert werden. . MessageId=624 @@ -2301,7 +2301,7 @@ Severity=Success Facility=System SymbolicName=ERROR_DLL_INIT_FAILED_LOGOFF Language=German -ERROR_DLL_INIT_FAILED_LOGOFF - The application failed to initialize because the window station is shutting down. +ERROR_DLL_INIT_FAILED_LOGOFF - Die Anwendung konnte nicht initialisiert werden, da das System gerade heruntergefahren wird. . MessageId=625 @@ -2309,7 +2309,7 @@ Severity=Success Facility=System SymbolicName=ERROR_VALIDATE_CONTINUE Language=German -ERROR_VALIDATE_CONTINUE - The validation process needs to continue on to the next step. +ERROR_VALIDATE_CONTINUE - Der Validierungsprozess wird mit dem nächsten Schritt fortgesetzt. . MessageId=626 @@ -2653,7 +2653,7 @@ Severity=Success Facility=System SymbolicName=ERROR_MEDIA_CHECK Language=German -ERROR_MEDIA_CHECK - The media may have changed. +ERROR_MEDIA_CHECK - Das Medium könnte geändert worden sein. . MessageId=680 diff --git a/reactos/dll/win32/modemui/lang/de-DE.rc b/reactos/dll/win32/modemui/lang/de-DE.rc index 2564f5f2c45..0c3a27b2c3a 100644 --- a/reactos/dll/win32/modemui/lang/de-DE.rc +++ b/reactos/dll/win32/modemui/lang/de-DE.rc @@ -25,10 +25,10 @@ BEGIN LTEXT "Auf &Kreditkartensignal:", 1007, 16, 55, 109, 8, NOT WS_VISIBLE EDITTEXT 1008, 133, 52, 26, 12, ES_RIGHT | NOT WS_VISIBLE | WS_GROUP CONTROL "", 1009, "MSCTLS_UPDOWN32", NOT WS_VISIBLE | WS_BORDER | WS_GROUP | 0x00000036, 159, 52, 12, 12 - LTEXT "Sekuden warten", 1010, 165, 54, 60, 8, NOT WS_VISIBLE + LTEXT "Sekunden warten", 1010, 165, 54, 60, 8, NOT WS_VISIBLE GROUPBOX "&Länder-/Regionauswahl", 1012, 6, 80, 225, 75 COMBOBOX 1013, 18, 99, 203, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | NOT WS_TABSTOP - PUSHBUTTON "&Port Einstellungen...", 1100, 107, 170, 125, 14 + PUSHBUTTON "&Porteinstellungen...", 1100, 107, 170, 125, 14 DEFPUSHBUTTON "&Standardeinstellungen ändern...", 3, 107, 188, 125, 14 END @@ -87,11 +87,11 @@ BEGIN AUTOCHECKBOX "&Telefonleitung verfügt über verschiedene Rufsignale", 1069, 19, 7, 177, 10 CTEXT "Rufsignalfolge", -1, 20, 21, 74, 8 CTEXT "Art des Anrufs", -1, 96, 21, 65, 8 - LTEXT "&Einfaches klingeln:", 1088, 20, 37, 65, 8 + LTEXT "&Einfaches Klingeln:", 1088, 20, 37, 65, 8 COMBOBOX 1091, 96, 37, 65, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "&Doppeltes klingeln:", 1089, 20, 57, 65, 8 + LTEXT "&Doppeltes Klingeln:", 1089, 20, 57, 65, 8 COMBOBOX 1092, 96, 55, 65, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "D&reifaches klingeln:", 1090, 20, 76, 65, 8 + LTEXT "D&reifaches Klingeln:", 1090, 20, 76, 65, 8 COMBOBOX 1093, 96, 73, 65, 61, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP END @@ -106,7 +106,7 @@ BEGIN AUTOCHECKBOX "&Log mitschneiden", 1020, 18, 187, 98, 10 PUSHBUTTON "L&og ansehen", 1094, 138, 184, 75, 14, WS_DISABLED GROUPBOX "Modeminformation", 1047, 10, 6, 217, 164 - GROUPBOX "Logging", -1, 10, 173, 217, 32 + GROUPBOX "Loggen", -1, 10, 173, 217, 32 END IDD_PLEASE_WAIT DIALOGEX 0, 0, 195, 72 @@ -231,8 +231,8 @@ BEGIN 181 "Externes Modem" 182 "Internes Modem" 183 "PCMCIA Modem" - 184 "Parallel Modem" - 185 "Parallel Port" + 184 "Parallelmodem" + 185 "Parallelport" 200 "110" 201 "1200" 202 "2400" @@ -283,7 +283,7 @@ BEGIN 460 "Es ist nicht genügend Arbeitsspeicher verfügbar, um das allgemeine Eigenschaftenfenster anzuzeigen.\nSchließen Sie einige Dateien, und wiederholen Sie den Vorgang." 461 "Es ist nicht genügend Arbeitsspeicher verfügbar, um das Eigenschaftenfenster für Modemeinstellungen anzuzeigen.\nSchließen Sie einige Dateien, und wiederholen Sie den Vorgang." 463 "Jede Anrufadresse muss auf \"Automatisch\" gesetzt oder einem eindeutigen Rufsignal zugeordnet werden.\n\nÄndern Sie die doppelt vergebene Rufsignale in andere." - 465 "Standard EC" + 465 "Standard-EC" 466 "Erzwungenes EC" 467 "Mobil" 468 "Deaktiviert" @@ -609,5 +609,5 @@ BEGIN 6602 "Mazedonien, ehemalige jugoslawische Republik" 6603 "Bosnien und Herzegowina" 6604 "Serbien und Montenegro" - 20013 "Hardware ID" + 20013 "Hardware-ID" END diff --git a/reactos/dll/win32/msgina/lang/de-DE.rc b/reactos/dll/win32/msgina/lang/de-DE.rc index 5cdd6656a81..9d3704138b5 100644 --- a/reactos/dll/win32/msgina/lang/de-DE.rc +++ b/reactos/dll/win32/msgina/lang/de-DE.rc @@ -50,7 +50,7 @@ STRINGTABLE BEGIN IDS_LOGGEDOUTSAS "Willkommen!" IDS_LOCKEDSAS "Der Computer ist derzeit gesperrt." - IDS_PRESSCTRLALTDELETE "Drücken Sie Strg+Alt+Entf um sich anzumelden." + IDS_PRESSCTRLALTDELETE "Drücken Sie Strg+Alt+Entf, um sich anzumelden." IDS_ASKFORUSER "Benutzername: " IDS_ASKFORPASSWORD "Passwort: " IDS_FORCELOGOFF "Dies wird den derzeitigen Benutzer abmelden. Alle ungespeicherten Daten gehen verloren. Fortsetzen?" diff --git a/reactos/dll/win32/netcfgx/lang/de-DE.rc b/reactos/dll/win32/netcfgx/lang/de-DE.rc index 3408403aad9..5327c201fb5 100644 --- a/reactos/dll/win32/netcfgx/lang/de-DE.rc +++ b/reactos/dll/win32/netcfgx/lang/de-DE.rc @@ -129,7 +129,7 @@ BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 100, 15, 80, 12 LTEXT "Gateway:", -1, 5, 15, 70, 12 CHECKBOX "Automatische Metrik", IDC_USEMETRIC, 15, 30, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - LTEXT "&Metric:", IDC_METRICTXT, 5, 45, 45, 12, WS_DISABLED + LTEXT "&Metrik:", IDC_METRICTXT, 5, 45, 45, 12, WS_DISABLED EDITTEXT IDC_METRIC, 100, 45, 50, 12, WS_TABSTOP | ES_NUMBER | WS_DISABLED PUSHBUTTON "", IDC_OK, 50, 60, 50, 14, WS_TABSTOP PUSHBUTTON "Abbrechen", IDCANCEL, 110, 60, 50, 14, WS_TABSTOP @@ -199,10 +199,10 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_NET_CONNECT "LAN-Verbindung" - IDS_NO_IPADDR_SET "Der Adapter erfordert mindestens eine IP-Addresse. Geben Sie eine IP-Addresse ein." - IDS_NO_SUBMASK_SET "Sie haben eine Addresse eingegeben, für die keine Subnetmaske vorhanden ist. Fügen Sie eine Subnetzmaske hinzu." + IDS_NO_IPADDR_SET "Der Adapter erfordert mindestens eine IP-Addresse. Geben Sie eine IP-Adresse ein." + IDS_NO_SUBMASK_SET "Sie haben eine Adresse eingegeben, für die keine Subnetzmaske vorhanden ist. Fügen Sie eine Subnetzmaske hinzu." IDS_TCPFILTERDESC "Mit der TCP/IP-Filterung können Sie die Art der TCP/IP-Netzwerkdaten, die den Windows-Computer erreichen sollen, steuern." - IDS_TCPFILTER "TCP/IP Filterung" + IDS_TCPFILTER "TCP/IP-Filterung" IDS_IPADDR "IP-Adresse" IDS_SUBMASK "Subnetzmaske" IDS_GATEWAY "Gateway" diff --git a/reactos/dll/win32/netid/lang/de-DE.rc b/reactos/dll/win32/netid/lang/de-DE.rc index 7889891a99b..efc72ba41ae 100644 --- a/reactos/dll/win32/netid/lang/de-DE.rc +++ b/reactos/dll/win32/netid/lang/de-DE.rc @@ -51,7 +51,7 @@ END IDD_PROPPAGEDNSANDNETBIOS DIALOGEX 0, 0, 266, 125 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_CAPTION -CAPTION "DNS Suffix und NetBIOS Computername" +CAPTION "DNS-Suffix und NetBIOS-Computername" FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Primäres DNS Suffix dieses Computers:", -1, 7, 5, 253, 8 @@ -68,13 +68,13 @@ STRINGTABLE BEGIN 1 "* Unbekannt *" 2 "ARBEITSGRUPPE" - 3 "Bei dem Versuch Domänenmitgliedschaftsinformationen zu lesen trat folgender Fehler auf:" + 3 "Bei dem Versuch, Domänenmitgliedschaftsinformationen zu lesen, trat folgender Fehler auf:" 4 "Computernamen ändern" 5 "Arbeitsgruppe:" 6 "Domäne:" 22 "Willkommen in der Arbeitsgruppe %1" 23 "Willkommen in der Domäne %1" - 24 "Sie müssen den Computer neustarten, damit die Änderungen wirksam werden." + 24 "Sie müssen den Computer neu starten, damit die Änderungen wirksam werden." 25 "Sie können den Namen und die Zugehörigkeit dieses Computers ändern. Änderungen können sich auf den Zugriff auf Netzwerkressourcen auswirken." 1021 "Hinweis: Nur Administratoren können die Identifikation des Computers ändern." 1022 "Hinweis: Die Identifikation des Computers kann aus folgendem Grund nicht geändert werden:" diff --git a/reactos/dll/win32/netshell/lang/de-DE.rc b/reactos/dll/win32/netshell/lang/de-DE.rc index 5026f25ae39..3192b29f977 100644 --- a/reactos/dll/win32/netshell/lang/de-DE.rc +++ b/reactos/dll/win32/netshell/lang/de-DE.rc @@ -70,27 +70,27 @@ END IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Network Connection Details" +CAPTION "Netzwerkverbindungsdetails" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Network Connection &Details:", -1, 15, 9, 170, 12 + LTEXT "Netzwerkverbindungs&details:", -1, 15, 9, 170, 12 CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130 PUSHBUTTON "&Close", IDC_CLOSE, 125, 165, 62, 14 END STRINGTABLE DISCARDABLE BEGIN - IDS_PHYSICAL_ADDRESS "Physical Address" - IDS_IP_ADDRESS "IP Address" - IDS_SUBNET_MASK "Subnet Mask" - IDS_DEF_GATEWAY "Default Gateway" - IDS_DHCP_SERVER "DHCP Server" + IDS_PHYSICAL_ADDRESS "Physikalische Adresse" + IDS_IP_ADDRESS "IP-Adresse" + IDS_SUBNET_MASK "Subnetzmaske" + IDS_DEF_GATEWAY "Standardgateway" + IDS_DHCP_SERVER "DHCP-Server" IDS_LEASE_OBTAINED "Lease Obtained" IDS_LEASE_EXPIRES "Lease Expires" - IDS_DNS_SERVERS "DNS Servers" - IDS_WINS_SERVERS "WINS Servers" - IDS_PROPERTY "Property" - IDS_VALUE "Value" + IDS_DNS_SERVERS "DNS-Server" + IDS_WINS_SERVERS "WINS-Server" + IDS_PROPERTY "Eigenschaft" + IDS_VALUE "Wert" IDS_NETWORKCONNECTION "Netzwerkverbindungen" IDS_SHV_COLUMN_NAME "Name" IDS_SHV_COLUMN_TYPE "Typ" diff --git a/reactos/dll/win32/newdev/lang/de-DE.rc b/reactos/dll/win32/newdev/lang/de-DE.rc index 31e33874ff0..561282fd468 100644 --- a/reactos/dll/win32/newdev/lang/de-DE.rc +++ b/reactos/dll/win32/newdev/lang/de-DE.rc @@ -9,7 +9,7 @@ BEGIN LTEXT "Willkommen",IDC_WELCOMETITLE,120,8,195,24 LTEXT "Dieser Assistent installiert einen neuen Gerätetreiber für:", IDC_STATIC,120,21,195,16 - LTEXT "Klicken Sie auf Weiter um fortzufahren.",IDC_STATIC,120,169,195,17 + LTEXT "Klicken Sie auf Weiter, um fortzufahren.",IDC_STATIC,120,169,195,17 LTEXT "UNKNOWN DEVICE",IDC_DEVICE,134,36,164,11 LTEXT "WARNUNG! DAS INSTALLIEREN VON TREIBERN KANN IHREN PC ZUM ABSTURZ BRINGEN ODER AM BOOTEN HINDERN!",IDC_STATIC,120,59,195,16 CONTROL "Treiber automatisch installieren",IDC_RADIO_AUTO,"Button", diff --git a/reactos/dll/win32/rasdlg/lang/de-DE.rc b/reactos/dll/win32/rasdlg/lang/de-DE.rc index 06bbc901d14..0b3c35bc9d2 100644 --- a/reactos/dll/win32/rasdlg/lang/de-DE.rc +++ b/reactos/dll/win32/rasdlg/lang/de-DE.rc @@ -64,7 +64,7 @@ BEGIN AUTOCHECKBOX "&Shiva Password Authentication Protocol (SPAP)", 1496, 28, 119, 214, 10, BS_TOP | BS_MULTILINE AUTOCHECKBOX "&Challenge Handshake Authentication Protocol (CHAP)", 1494, 28, 133, 215, 10, BS_TOP | BS_MULTILINE AUTOCHECKBOX "&MS CHAP (MS-CHAP)", 1493, 28, 148, 212, 10, BS_TOP | BS_MULTILINE - AUTOCHECKBOX "Ältere MS-CHAP Versionen von &Win 95 Servern erlauben", 200, 46, 162, 198, 10, BS_TOP | BS_MULTILINE + AUTOCHECKBOX "Ältere MS-CHAP-Versionen von &Win 95 Servern erlauben", 200, 46, 162, 198, 10, BS_TOP | BS_MULTILINE AUTOCHECKBOX "M&icrosoft CHAP Version 2 (MS-CHAP v2)", 1492, 28, 176, 200, 10, BS_TOP | BS_MULTILINE CONTROL "", -1, "STATIC", SS_LEFTNOWORDWRAP | SS_SUNKEN | WS_GROUP, 28, 189, 208, 1 AUTOCHECKBOX "&Für MS-CHAP basierte Protokolle, automatisch den ReactOS Anmeldename und Passwort verwenden (und Domäne wenn vorhanden)", 1549, 28, 195, 213, 24, BS_TOP | BS_MULTILINE @@ -223,7 +223,7 @@ CAPTION "Verbinden mit %1" FONT 8, "MS Shell Dlg" BEGIN CONTROL 1678, 1100, "STATIC", SS_BITMAP, 0, 0, 265, 50 - LTEXT "Be&nutername:", 1413, 8, 60, 88, 8 + LTEXT "Be&nutzername:", 1413, 8, 60, 88, 8 EDITTEXT 1104, 103, 57, 154, 14, ES_AUTOHSCROLL LTEXT "&Passwort:", 1112, 8, 79, 88, 8 EDITTEXT 1103, 103, 76, 154, 14, ES_PASSWORD | ES_AUTOHSCROLL @@ -313,7 +313,7 @@ END 121 DIALOGEX 6, 18, 230, 131 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "ISDN Konfiguration" +CAPTION "ISDN-Konfiguration" FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Leitungstyp:", 1155, 9, 9, 65, 8 @@ -330,7 +330,7 @@ END 122 DIALOGEX 6, 18, 220, 68 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "ISDN Konfiguration" +CAPTION "ISDN-Konfiguration" FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Leitungstyp:", 1155, 9, 11, 55, 8 @@ -345,7 +345,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION FONT 8, "MS Shell Dlg" BEGIN EDITTEXT 1161, 5, 5, 338, 236, ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | WS_GROUP - LTEXT "I&P Adresse:", 1163, 7, 253, 68, 8 + LTEXT "I&P-Adresse:", 1163, 7, 253, 68, 8 CONTROL "", 1160, "RASIPADDRESS", WS_TABSTOP, 76, 250, 117, 14 DEFPUSHBUTTON "", 1162, 197, 252, 16, 13, NOT WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP PUSHBUTTON "&Fertig", 1, 219, 252, 60, 14, WS_GROUP @@ -364,7 +364,7 @@ END 125 DIALOGEX 12, 16, 261, 190 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Modem Konfiguration" +CAPTION "Modem-Konfiguration" FONT 8, "MS Shell Dlg" BEGIN ICON 15102, 1238, 7, 7, 20, 20 @@ -412,7 +412,7 @@ END 128 DIALOGEX 7, 22, 236, 90 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Manuelles wählen" +CAPTION "Manuelles Wählen" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Nehmen Sie den Hörer und wählen Sie (oder bitten Sie die Vermittlung). Nach vollendetem Wählvorgang, klicken Sie auf OK. Warten Sie, bis kein Ton mehr zu hören ist und dann legen Sie auf.", 1281, 8, 8, 219, 32 @@ -436,7 +436,7 @@ END 133 DIALOGEX 6, 18, 231, 211 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "X.25 Anmeldeeinstellungen" +CAPTION "X.25-Anmeldeeinstellungen" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Wählen Sie ihren X.25 Netzwerkanbieter and und geben Sie ihre X.121 Adresse des Remoteservers ein:", 1408, 7, 4, 220, 27 @@ -583,10 +583,10 @@ FONT 8, "MS Shell Dlg" BEGIN AUTOCHECKBOX "&Telefonnummern vor dem Wählen anzeigen", 1142, 8, 10, 224, 10, WS_GROUP AUTOCHECKBOX "Standorteinste&llungen vor dem Wählen anzeigen", 1139, 8, 27, 224, 10 - AUTOCHECKBOX "Standortänderungen während dem &Wählen zulassen", 1140, 21, 43, 212, 10 - AUTOCHECKBOX "Verbindungsforts&chritt während dem Wählen anzeigen", 1143, 8, 59, 224, 10 - AUTOCHECKBOX "Beim Wählvorgang schlie&ssen", 1137, 8, 76, 224, 10 - AUTOCHECKBOX "Telef&onbuchänderungen während dem Wählen zulassen", 1141, 8, 94, 224, 10 + AUTOCHECKBOX "Standortänderungen während des &Wählens zulassen", 1140, 21, 43, 212, 10 + AUTOCHECKBOX "Verbindungsforts&chritt während des Wählens anzeigen", 1143, 8, 59, 224, 10 + AUTOCHECKBOX "Beim Wählvorgang schlie&ßen", 1137, 8, 76, 224, 10 + AUTOCHECKBOX "Telef&onbuchänderungen während des Wählens zulassen", 1141, 8, 94, 224, 10 AUTOCHECKBOX "&Zum Erstellen neuer Einträge den Assistenten verwenden", 1144, 22, 111, 210, 10 END @@ -598,10 +598,10 @@ BEGIN AUTOCHECKBOX "&Telefonnummern vor dem Wählen anzeigen", 1142, 8, 10, 223, 10, WS_GROUP AUTOCHECKBOX "Standorteinste&llungen vor dem Wählen anzeigen", 1139, 8, 27, 206, 10 AUTOCHECKBOX "DFÜ-Netz&werk-Monitor vor dem Wählen starten", 1138, 8, 44, 226, 10 - AUTOCHECKBOX "Verbindungsforts&chritt während dem Wählen anzeigen", 1143, 8, 61, 224, 10 - AUTOCHECKBOX "Beim Wählvorgang schlie&ssen", 1137, 8, 79, 220, 10 + AUTOCHECKBOX "Verbindungsforts&chritt während des Wählens anzeigen", 1143, 8, 61, 224, 10 + AUTOCHECKBOX "Beim Wählvorgang schlie&ßen", 1137, 8, 79, 220, 10 AUTOCHECKBOX "&Zum Erstellen neuer Einträge den Assistenten verwenden", 1144, 8, 97, 220, 10 - AUTOCHECKBOX "Vo&r automatischen Wählvorgang immer fragen", 1136, 8, 114, 220, 10 + AUTOCHECKBOX "Vo&r automatischem Wählvorgang immer fragen", 1136, 8, 114, 220, 10 END 160 DIALOGEX 6, 18, 320, 145 @@ -619,7 +619,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Sicherheit" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Sicherhetseinstellungen", 1580, 8, 3, 215, 139 + GROUPBOX "Sicherheitseinstellungen", 1580, 8, 3, 215, 139 AUTORADIOBUTTON "&Typisch (Empfohlen)", 1540, 14, 16, 201, 9, BS_NOTIFY | WS_GROUP AUTORADIOBUTTON "E&rweitert (Benutzerdefiniert)", 1541, 14, 102, 198, 8, BS_NOTIFY LTEXT "&Identität folgendermaßen bestätigen:", 1537, 26, 29, 187, 8, NOT WS_GROUP @@ -667,9 +667,9 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION FONT 8, "MS Shell Dlg" BEGIN LTEXT "Geben Sie die IP-Adresse eines DNS- oder WINS- Servers im Remotenetzwerk an. Behalten Sie 0.0.0.0 bei, wenn der Remoterouter die Adressen zur Verfügung stellt oder wenn Sie sich der Adressen nicht sicher sind.", 1275, 7, 2, 311, 25 - LTEXT "&DNS Server:", 1274, 7, 29, 160, 8, NOT WS_GROUP + LTEXT "&DNS-Server:", 1274, 7, 29, 160, 8, NOT WS_GROUP CONTROL "", 1272, "RASIPADDRESS", WS_TABSTOP, 21, 41, 85, 12 - LTEXT "&WINS Server:", 1276, 7, 65, 166, 8, NOT WS_GROUP + LTEXT "&WINS-Server:", 1276, 7, 65, 166, 8, NOT WS_GROUP CONTROL "", 1273, "RASIPADDRESS", WS_TABSTOP, 21, 77, 85, 12 END @@ -739,7 +739,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION FONT 8, "MS Shell Dlg" BEGIN LTEXT "Geben Sie die IP-Adresse des Routers im Remotenetzwerk an, oder setzen Sie sie auf 0.0.0.0., wenn der Server die Adresse zur Verfügung stellt. Der Administrator des Remotenetzwerks gibt gewöhnlich Anweisungen für die Eingabe.", 1331, 5, 4, 308, 35 - LTEXT "Meine &IP Adresse:", 1332, 4, 51, 100, 8, NOT WS_GROUP + LTEXT "Meine &IP-Adresse:", 1332, 4, 51, 100, 8, NOT WS_GROUP CONTROL "", 1330, "RASIPADDRESS", WS_TABSTOP, 21, 62, 104, 12 LTEXT "Anmerkung: Wenn Sie einen Adapter installiert haben, sollten Sie NICHT die gleiche Adresse wie der Adapter wählen.", 1333, 5, 94, 306, 36, NOT WS_GROUP END @@ -749,7 +749,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION FONT 8, "MS Shell Dlg" BEGIN LTEXT "Bei einigen DFÜ-Servern oder Routern ist nach der Verbindungsherstellung eine interaktive Anmeldung erforderlich. Sie können ein Skript automatisch ausführen, das das Antworten für Sie übernimmt.", 1339, 5, 3, 309, 27 - AUTOCHECKBOX "&Terminal Fenster anzeigen", 1462, 15, 31, 162, 10 + AUTOCHECKBOX "&Terminalfenster anzeigen", 1462, 15, 31, 162, 10 AUTOCHECKBOX "&Skript starten:", 1463, 15, 45, 58, 10 COMBOBOX 1334, 30, 60, 275, 88, CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | NOT WS_TABSTOP PUSHBUTTON "Bea&rbeiten...", 1335, 180, 77, 60, 14 @@ -911,7 +911,7 @@ END 502 DIALOGEX 20, 60, 215, 73 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION -CAPTION "PPP Einstellungen" +CAPTION "PPP-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN AUTOCHECKBOX "&LCP Erweiterungen aktivieren", 1423, 9, 7, 200, 10, BS_TOP | BS_MULTILINE @@ -953,7 +953,7 @@ END 532 DIALOGEX 0, 0, 263, 263 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Router Rückruf" +CAPTION "Router-Rückruf" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Ein Router kann beim Einwählen die Möglichkeit des Rückrufs anbieten, um Telefonkosten zu reduzieren und gleichzeitig die Sicherheit zu erhöhen. Geben Sie an, ob Sie die Rückrufoption verwenden möchten.", 1043, 7, 5, 253, 24 @@ -1080,7 +1080,7 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Willkommen zum Assistenten.", 1530, 122, 8, 192, 32 LTEXT "Mit diesem Assistenten können Sie eine Schnittstelle für Wählen bei Bedarf erstellen, um eine Verbindung von diesem Router zu anderen Routern herzustellen.", 1531, 122, 43, 192, 37 - LTEXT "Klicken Sie auf Weiter um den Vorgang fortzusetzen.", 1532, 122, 85, 191, 29 + LTEXT "Klicken Sie auf Weiter, um den Vorgang fortzusetzen.", 1532, 122, 85, 191, 29 END 548 DIALOGEX 0, 0, 317, 143 @@ -1301,12 +1301,12 @@ BEGIN AUTOCHECKBOX "Daten&verschlüsselung ist zwingend erforderlich", 1169, 26, 83, 182, 10, BS_TOP | BS_MULTILINE LTEXT "Diese Einstellungen erfordern Kenntnisse über Sicherheitsprotokolle.", 1539, 26, 111, 136, 20 PUSHBUTTON "&Einstellungen...", 1180, 151, 134, 60, 14 - PUSHBUTTON "I&PSec Einstellungen...", 1598, 126, 163, 85, 14 + PUSHBUTTON "I&PSec-Einstellungen...", 1598, 126, 163, 85, 14 END 570 DIALOGEX 0, 0, 265, 126 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION -CAPTION "IPSec Einstellungen" +CAPTION "IPSec-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "OK", 1, 151, 104, 50, 14 @@ -1325,10 +1325,10 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION CAPTION "Sicherheitslogging" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Logging Optionen:", -1, 6, 8, 216, 47 + GROUPBOX "Logging-Optionen:", -1, 6, 8, 216, 47 AUTOCHECKBOX "&Fehlgeschlagene eingeh. Verbindungsversuche loggen", 1642, 14, 22, 201, 10 AUTOCHECKBOX "&Erfolgreiche eingehende Verbindungsversuche loggen", 1641, 14, 37, 200, 10 - GROUPBOX "Logdatei Optionen:", -1, 7, 64, 215, 91 + GROUPBOX "Logdatei-Optionen:", -1, 7, 64, 215, 91 LTEXT "&Name:", -1, 14, 78, 199, 8 EDITTEXT 1674, 14, 90, 199, 14, ES_READONLY PUSHBUTTON "&Durchsuchen...", 1639, 153, 108, 60, 14 @@ -1343,7 +1343,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION CAPTION "ICMP" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Das &Internet Control Message-Protokoll (ICMP) ermöglicht Computern eines Netzwerks die gemeinsame Nutzung von Fehler- und Statusinformationen. Wählen Sie Informationsanfragen aus dem Internet, auf die dieser Computer antworten soll:", -1, 7, 5, 215, 37 + LTEXT "Das &Internet-Control-Message-Protokoll (ICMP) ermöglicht Computern eines Netzwerks die gemeinsame Nutzung von Fehler- und Statusinformationen. Wählen Sie Informationsanfragen aus dem Internet, auf die dieser Computer antworten soll:", -1, 7, 5, 215, 37 CONTROL "IList1", 1644, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000440D, 7, 45, 215, 100, WS_EX_CLIENTEDGE GROUPBOX "Beschreibung:", -1, 7, 153, 215, 55 LTEXT "", 1645, 14, 171, 199, 32 @@ -1622,11 +1622,11 @@ END 1660 DIALOGEX 0, 0, 258, 78 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Internetverbindungs Firewall" +CAPTION "Internetverbindungsfirewall" FONT 8, "MS Shell Dlg" BEGIN ICON 32515, -1, 7, 7, 20, 20 - LTEXT "Durch Deaktivieren des Internetverbindungsfirewalls wird der Computer eventuell nicht autorisierten Zugriffen aus dem Internet ausgesetzt. Soll der Firewall deaktiviert werden?", -1, 44, 5, 212, 24 + LTEXT "Durch Deaktivieren der Internetverbindungsfirewall wird der Computer eventuell nicht autorisierten Zugriffen aus dem Internet ausgesetzt. Soll die Firewall deaktiviert werden?", -1, 44, 5, 212, 24 AUTOCHECKBOX "&Diesen Dialog nicht mehr anzeigen", 1662, 42, 40, 210, 10 DEFPUSHBUTTON "&Ja", 6, 74, 60, 50, 14 PUSHBUTTON "&Nein", 7, 128, 60, 50, 14 @@ -1678,7 +1678,7 @@ END 7016 DIALOGEX 0, 0, 265, 190 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_CAPTION -CAPTION "TCP/IP Eigenschaften eingehender Verbindungen" +CAPTION "TCP/IP-Eigenschaften eingehender Verbindungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Netzwerkzugriff", -1, 6, 5, 252, 32 @@ -1699,7 +1699,7 @@ END 7025 DIALOGEX 0, 0, 250, 157 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_CAPTION -CAPTION "IPX Eigenschaften eingehender Verbindungen" +CAPTION "IPX-Eigenschaften eingehender Verbindungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Netzwerkzugriff", -1, 8, 6, 234, 32 @@ -1735,7 +1735,7 @@ BEGIN PUSHBUTTON "&Deinstallieren", 7038, 80, 110, 67, 14, WS_GROUP PUSHBUTTON "&Eigenschaften", 7039, 153, 110, 67, 14, WS_GROUP GROUPBOX "Beschreibung", -1, 7, 138, 213, 69 - LTEXT "", 7040, 17, 150, 193, 48 + LTEXT "", 7040, 17, 150, 193, 48 END 7042 DIALOGEX 0, 0, 230, 215 @@ -1785,7 +1785,7 @@ BEGIN PUSHBUTTON "&Installieren...", 7037, 108, 71, 60, 14, WS_GROUP PUSHBUTTON "&Deinstallieren", 7038, 172, 71, 60, 14, WS_GROUP PUSHBUTTON "&Eigenschaften", 7039, 236, 71, 60, 14, WS_GROUP - LTEXT "", 7040, 21, 105, 273, 38 + LTEXT "", 7040, 21, 105, 273, 38 LTEXT "Beschreibung:", -1, 21, 95, 275, 8 END @@ -1818,7 +1818,7 @@ END 19900 DIALOGEX 0, 0, 156, 44 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "DFÜ Netzwerk" +CAPTION "DFÜ-Netzwerk" FONT 8, "MS Shell Dlg" BEGIN ICON 563, 19901, 10, 10, 18, 20 @@ -1834,7 +1834,7 @@ BEGIN 191 "Alle Geräte wählen" 192 "Geräte nur falls erforderlich wählen" 193 "Geben Sie den Namen und das Passwort eines Benutzers mit Zugriff auf die Remotenetzwerkdomäne ein." - 194 "NAT (Network Address Translation) ist derzeit als Routing Protokoll installiert\nund muss vor Aktivierung der Internetverbindungsfreigabe entfernt werden.\nUm NAT zu entfernen, öffnen Sie das Routing und Remote Access Manager\nSnapIn und öffnen Sie den Eintrag des Routers im linken Panel.\nLöschen Sie das NAT Routing Protokoll von der Liste der IP\nRouting Protokolle." + 194 "NAT (Network Address Translation) ist derzeit als Routingprotokoll installiert\nund muss vor Aktivierung der Internetverbindungsfreigabe entfernt werden.\nUm NAT zu entfernen, öffnen Sie das Routing und Remote Access Manager\nSnapIn und öffnen Sie den Eintrag des Routers im linken Panel.\nLöschen Sie das NAT Routing Protokoll von der Liste der IP\nRouting Protokolle." 195 "Die Vorwahl darf nur Ziffern von 0 bis 9 enthalten." 196 "Der Eintragsname muss mindestens ein nicht leeres Zeichen enthalten und darf nicht mit einem Punkt beginnen. Wählen Sie einen anderen Namen." 197 "Sie müssen für dieses Feld einen Wert zwischen %1 und %2 wählen." @@ -1902,7 +1902,7 @@ BEGIN 260 "%1 erfolgreich verbunden.\n" 261 "Sie können wählen, welches DFÜ-Protokoll verwendet werden soll." 262 "DFÜ-Protokoll wählen" - 263 "Klicken Sie auf Fertig stellen, um '%1' zu speichern." + 263 "Klicken Sie auf Fertigstellen, um '%1' zu speichern." 264 "netcfg.hlp" 265 "Bei &Verbindung erfolgreiche Nummer an den Listenanfang verschieben." 266 "&Neue Telefonnummer:" @@ -2078,7 +2078,7 @@ BEGIN 470 "Manuelles Modembefehlterminal" 471 "Terminal nach dem Wählen" 472 "Terminal vor dem Wählen" - 473 "SLIP Anmeldeterminal" + 473 "SLIP-Anmeldeterminal" 474 "10 Minuten" 475 "10 Sekunden" 476 "1 Stunde" @@ -2146,9 +2146,9 @@ BEGIN 538 "Klicken Sie auf Einstellungen, um die benutzerdefinierte Authentifizierung und die Datenverschlüsselung anzugeben." 539 "Die Anschlussnummer wird bereits von einem anderen Eintrag verwendet.\nGeben Sie eine eindeutige Anschlussnummer ein." 540 "Geben Sie einen oder mehrere Ports für eingehende Antworten ein." - 541 "Wählen Sie den Eintrag der gelöscht werden soll." + 541 "Wählen Sie den Eintrag, der gelöscht werden soll." 542 "1 Sekunde" - 543 "Wählen Sie den Eintrag der geändert werden soll." + 543 "Wählen Sie den Eintrag, der geändert werden soll." 549 "Wie lautet der Name des Computers, mit dem eine Verbindung hergestellt werden soll?" 576 "20 Minuten" 579 "Geben einen Namen für die Verbindung mit Ihrem Arbeitsplatz an." diff --git a/reactos/dll/win32/serialui/lang/de-DE.rc b/reactos/dll/win32/serialui/lang/de-DE.rc index dc9c3565c9a..2bd540716f3 100644 --- a/reactos/dll/win32/serialui/lang/de-DE.rc +++ b/reactos/dll/win32/serialui/lang/de-DE.rc @@ -27,7 +27,7 @@ BEGIN CONTROL "",IDC_GRP1,"Button",0x50000007,6,5,210,146,0x00000000 CONTROL "OK",IDC_OKBTN,"Button",0x50010000,98,156,56,13,0x00000000 CONTROL "Abbrechen",IDC_CANCELBTN,"Button",0x50010000,158,156,56,13,0x00000000 - CONTROL "Baud Rate:",IDC_STC1,"Static",0x50000000,24,31,42,9,0x00000000 + CONTROL "Baudrate:",IDC_STC1,"Static",0x50000000,24,31,42,9,0x00000000 CONTROL "Bytegröße:",IDC_STC2,"Static",0x50000000,24,53,42,9,0x00000000 CONTROL "Parität:",IDC_STC3,"Static",0x50000000,24,73,42,9,0x00000000 CONTROL "Stopbits:",IDC_STC4,"Static",0x50000000,24,96,42,9,0x00000000 diff --git a/reactos/dll/win32/setupapi/lang/de-DE.rc b/reactos/dll/win32/setupapi/lang/de-DE.rc index f8ae2a22925..70edaa82d07 100644 --- a/reactos/dll/win32/setupapi/lang/de-DE.rc +++ b/reactos/dll/win32/setupapi/lang/de-DE.rc @@ -35,7 +35,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_QUERY_REBOOT_TEXT "Ihr Computer muss zum Beenden der Installation neugestartet werden. Wollen Sie fortfahren?" - IDS_QUERY_REBOOT_CAPTION "Neustarten" + IDS_QUERY_REBOOT_TEXT "Ihr Computer muss zum Beenden der Installation neu gestartet werden. Wollen Sie fortfahren?" + IDS_QUERY_REBOOT_CAPTION "Neu starten" IDS_INF_FILE "Setup-Informationen" END diff --git a/reactos/dll/win32/shdoclc/De.rc b/reactos/dll/win32/shdoclc/De.rc index c2027732375..253b6fc0007 100644 --- a/reactos/dll/win32/shdoclc/De.rc +++ b/reactos/dll/win32/shdoclc/De.rc @@ -110,8 +110,8 @@ IDR_BROWSE_CONTEXT_MENU MENU } MENUITEM SEPARATOR MENUITEM SEPARATOR - MENUITEM "&Zellen Eigenschaften", IDM_CELLPROPERTIES - MENUITEM "&Tabellen Eigenschaften", IDM_TABLEPROPERTIES + MENUITEM "&Zellen-Eigenschaften", IDM_CELLPROPERTIES + MENUITEM "&Tabellen-Eigenschaften", IDM_TABLEPROPERTIES } POPUP "1DSeiten Auswahl" diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index cb3cb1bdb9c..db0fa82a369 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -348,7 +348,7 @@ END BITBUCKET_PROPERTIES_DLG DIALOGEX 0, 0, 240, 190 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Papierkorb Einstellungen" +CAPTION "Papierkorb-Einstellungen" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 10, 10, 220, 50 @@ -587,12 +587,12 @@ CAPTION "Anderes Symbol" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN LTEXT "Dateiname:", -1, 7, 14, 208, 10 - PUSHBUTTON "Browse...",IDC_BUTTON_PATH, 148, 24,67,14 + PUSHBUTTON "Durchsuchen...",IDC_BUTTON_PATH, 148, 24,67,14 EDITTEXT IDC_EDIT_PATH, 6, 24, 135, 15, ES_AUTOHSCROLL LTEXT "Symbole:", -1, 7, 47, 208, 10 LISTBOX IDC_PICKICON_LIST,7,57,208,119,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,WS_EX_STATICEDGE DEFPUSHBUTTON "OK",IDOK, 107, 181,50, 14 - PUSHBUTTON "Cancel",IDCANCEL, 167, 181, 50, 14 + PUSHBUTTON "Abbrechen",IDCANCEL, 167, 181, 50, 14 END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/shimgvw/lang/de-DE.rc b/reactos/dll/win32/shimgvw/lang/de-DE.rc index 7cf930eec19..32c716beafa 100644 --- a/reactos/dll/win32/shimgvw/lang/de-DE.rc +++ b/reactos/dll/win32/shimgvw/lang/de-DE.rc @@ -2,14 +2,14 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN - IDS_APPTITLE "ReactOS Picture und Fax Viewer" - IDS_SETASDESKBG "Als Desktop Hintergrund einstellen" + IDS_APPTITLE "ReactOS-Bild- und Faxansicht" + IDS_SETASDESKBG "Als Desktophintergrund setzen" /* Tooltips */ IDS_TOOLTIP_NEXT_PIC "Nächstes Bild" IDS_TOOLTIP_PREV_PIC "Vorheriges Bild" - IDS_TOOLTIP_ZOOM_IN "Zoom In (+)" - IDS_TOOLTIP_ZOOM_OUT "Zoom Out (-)" + IDS_TOOLTIP_ZOOM_IN "Vergrößern (+)" + IDS_TOOLTIP_ZOOM_OUT "Verkleinern (-)" IDS_TOOLTIP_ROT_CLOCKW "Drehen im Uhrzeigersinn (Strg+K)" IDS_TOOLTIP_ROT_COUNCW "Drehen gegen den Uhrzeigersinn (Strg+L)" IDS_TOOLTIP_PRINT "Drucken (Strg+P)" diff --git a/reactos/dll/win32/syssetup/lang/de-DE.rc b/reactos/dll/win32/syssetup/lang/de-DE.rc index d5c0cb77019..e895338c6ed 100644 --- a/reactos/dll/win32/syssetup/lang/de-DE.rc +++ b/reactos/dll/win32/syssetup/lang/de-DE.rc @@ -22,23 +22,23 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_WELCOMEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Willkommen beim ReactOS Setup Assistenten.", IDC_WELCOMETITLE, 115, 9, 189, 31 + LTEXT "Willkommen beim ReactOS-Setupassistenten.", IDC_WELCOMETITLE, 115, 9, 189, 31 LTEXT "Dieser Assistent wird ReactOS auf Ihrem Computer installieren. "\ - "Der Assistent benötigt einige Informationen um ReactOS "\ + "Der Assistent benötigt einige Informationen, um ReactOS "\ "installieren zu können.", IDC_STATIC, 115, 50, 189, 100 - LTEXT "Klicken Sie auf Weiter um fortzufahren.", IDC_STATIC, 115, 160, 189, 31 + LTEXT "Klicken Sie auf Weiter, um fortzufahren.", IDC_STATIC, 115, 160, 189, 31 END IDD_ACKPAGE DIALOGEX 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Die ReactOS Programmierer möchten folgende Open Source Projekte anerkennen, "\ + LTEXT "Die ReactOS-Programmierer möchten folgende Open-Source-Projekte anerkennen, "\ "die (teils) verwendet wurden, um ReactOS zu erstellen:", IDC_STATIC,15,7,286,19 LISTBOX IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS | @@ -46,15 +46,15 @@ BEGIN LTEXT "ReactOS ist unter der GPL veröffentlicht, wenn Sie (Teile von) ReactOS wiederverwenden "\ "oder wiederveröffentlichen wollen, müssen Sie die Bestimmungen der GPL anerkennen.", IDC_STATIC,15,110,227,24 - PUSHBUTTON "&GPL &ansehen...",IDC_VIEWGPL,251,110,55,19 - LTEXT "Klicken Sie auf Weiter, um mit dem Setup fortzufahren.",IDC_STATIC,15,136, + PUSHBUTTON "GPL &ansehen...",IDC_VIEWGPL,251,110,55,19 + LTEXT "Klicken Sie auf Weiter, um mit der Einrichtung fortzufahren.",IDC_STATIC,15,136, 195,17 END IDD_OWNERPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON2, IDC_STATIC, 21, 7, 20, 20 @@ -69,7 +69,7 @@ END IDD_COMPUTERPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 @@ -84,7 +84,7 @@ BEGIN IDC_STATIC, 54, 57, 250, 25 LTEXT "Geben Sie ein Passwort für das Administratorkonto mit max. 14 Zeichen ein.", IDC_STATIC, 54, 87, 250, 8 - LTEXT "&Administrator Passwort:", IDC_STATIC, 54, 104, 75, 8 + LTEXT "&Administratorpasswort:", IDC_STATIC, 54, 104, 75, 8 EDITTEXT IDC_ADMINPASSWORD1, 132, 101, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD LTEXT "&Passwort bestätigen:", IDC_STATIC, 54, 123, 75, 8 EDITTEXT IDC_ADMINPASSWORD2, 132, 120, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD @@ -93,7 +93,7 @@ END IDD_LOCALEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON4, IDC_STATIC, 21, 7, 20, 20 @@ -115,7 +115,7 @@ END IDD_DATETIMEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON3, IDC_STATIC, 21, 10, 20, 20 @@ -134,7 +134,7 @@ END IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDC_ACTIVITY, 53, 7, 253, 20 @@ -145,11 +145,11 @@ END IDD_FINISHPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Fertigstellung des ReactOS Setups" +CAPTION "Fertigstellung des ReactOS-Setups" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Fertigstellung des ReactOS Setup Assistenten",IDC_FINISHTITLE,115,9,195,37 - LTEXT "Das ReactOS Setup wurde erfolgreich fertiggestellt.\n\n" \ + LTEXT "Fertigstellung des ReactOS-Setupassistenten",IDC_FINISHTITLE,115,9,195,37 + LTEXT "Das ReactOS-Setup wurde erfolgreich fertiggestellt.\n\n" \ "Wenn Sie auf Beenden klicken, wird der Computer neu gestartet.", IDC_STATIC, 115, 58, 195, 100 CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 115, 138, 188, 12 LTEXT "Entfernen Sie die CD, wenn vorhanden. Danach klicken Sie "\ @@ -180,7 +180,7 @@ END STRINGTABLE BEGIN IDS_ACKTITLE "Anerkennungen" - IDS_ACKSUBTITLE "Das Fundament, auf dem ReactOS gebaut ist und Lizenzinformationen" + IDS_ACKSUBTITLE "Das Fundament, auf dem ReactOS gebaut ist, und Lizenzinformationen" IDS_OWNERTITLE "Personalisieren Sie ihre Software" IDS_OWNERSUBTITLE "Das Setup nutzt diese Informationen über Sie, um ReactOS zu personalisieren." IDS_COMPUTERTITLE "Computername und Administratorpasswort" @@ -195,7 +195,7 @@ END STRINGTABLE BEGIN - IDS_CMT_DOWNLOADER "Downloaden und installieren verschiedener Anwendungen" + IDS_CMT_DOWNLOADER "Herunterladen und Installieren verschiedener Anwendungen" END STRINGTABLE @@ -206,14 +206,14 @@ BEGIN IDS_CMT_EXPLORER "Starte Explorer" IDS_CMT_NOTEPAD "Starte Texteditor" IDS_CMT_REGEDIT "Starte Registrierungseditor" - IDS_CMT_WORDPAD "Starte Dokument Editor" + IDS_CMT_WORDPAD "Starte Dokumenteneditor" IDS_CMT_SCREENSHOT "Screenshot erstellen" - IDS_CMT_DEVMGMT "Starte Geräte-Manager" - IDS_CMT_SERVMAN "Starte Dienst-Manager" + IDS_CMT_DEVMGMT "Starte Gerätemanager" + IDS_CMT_SERVMAN "Starte Dienstmanager" IDS_CMT_RDESKTOP "Starte Remote Desktop" IDS_CMT_EVENTVIEW "Starte Ereignisanzeige" - IDS_CMT_MSCONFIG "Starte Systemkonfigurations Programm" - IDS_CMT_PAINT "Launch Paint" + IDS_CMT_MSCONFIG "Starte Systemkonfigurationsprogramm" + IDS_CMT_PAINT "Starte Paint" END STRINGTABLE @@ -229,7 +229,7 @@ BEGIN IDS_SYS_TOOLS "Systemprogramme" IDS_CMT_CHARMAP "Zeichentabelle" IDS_CMT_KBSWITCH "Tastaturlayout-Umschalter" - IDS_CMT_DXDIAG "Launch ReactX-Diagnostic program" + IDS_CMT_DXDIAG "Starte ReactX-Diagnoseprogramm" END @@ -241,15 +241,15 @@ END STRINGTABLE BEGIN - IDS_SYS_ENTERTAINMENT "Entertainment" - IDS_CMT_MPLAY32 "Launch Multimedia Player" - IDS_CMT_SNDVOL32 "Launch Volume Control" - IDS_CMT_SNDREC32 "Launch Sound Recorder" + IDS_SYS_ENTERTAINMENT "Unterhaltung" + IDS_CMT_MPLAY32 "Starte Multimedia-Player" + IDS_CMT_SNDVOL32 "Starte Lautstärkeregelung" + IDS_CMT_SNDREC32 "Starte Audiorekorder" END STRINGTABLE BEGIN - IDS_REACTOS_SETUP "ReactOS Setup" + IDS_REACTOS_SETUP "ReactOS-Setup" IDS_UNKNOWN_ERROR "Unbekannter Fehler" IDS_REGISTERING_COMPONENTS "Registriere Komponenten..." IDS_LOADLIBRARY_FAILED "LoadLibrary fehlgeschlagen: " @@ -267,7 +267,7 @@ BEGIN IDS_SHORT_DOWNLOADER "ReactOS Anwendungsmanager.lnk" IDS_SHORT_SERVICE "Dienste-Manager.lnk" IDS_SHORT_DEVICE "Geräte-Manager.lnk" - IDS_SHORT_MPLAY32 "Multimedia Player.lnk" + IDS_SHORT_MPLAY32 "Multimedia-Player.lnk" IDS_SHORT_CALC "Rechner.lnk" IDS_SHORT_REGEDIT "Registrierungseditor.lnk" IDS_SHORT_NOTEPAD "Editor.lnk" @@ -281,21 +281,21 @@ BEGIN IDS_SHORT_KBSWITCH "Tastaturlayout-Umschalter.lnk" IDS_SHORT_EVENTVIEW "Ereignisanzeige.lnk" IDS_SHORT_MSCONFIG "Systemkonfiguration.lnk" - IDS_SHORT_SNDVOL32 "Volume Control.lnk" - IDS_SHORT_SNDREC32 "Audiorecorder.lnk" - IDS_SHORT_DXDIAG "ReactX Diagnostic.lnk" + IDS_SHORT_SNDVOL32 "Lautstärkeregelung.lnk" + IDS_SHORT_SNDREC32 "Audiorekorder.lnk" + IDS_SHORT_DXDIAG "ReactX-Diagnose.lnk" IDS_SHORT_PAINT "Paint.lnk" IDS_SHORT_SPIDER "Spider Solitaire.lnk" END STRINGTABLE BEGIN - IDS_WZD_NAME "Setup kann erst fortgesetzt werden kann, wenn ein Name eingegeben wurde." + IDS_WZD_NAME "Setup kann erst fortgesetzt werden, wenn ein Name eingegeben wurde." IDS_WZD_SETCOMPUTERNAME "Setup konnte den Computernamen nicht setzen." - IDS_WZD_COMPUTERNAME "Setup kann erst fortgesetzt werden kann, wenn ein Computername eingegeben wurde." + IDS_WZD_COMPUTERNAME "Setup kann erst fortgesetzt werden, wenn ein Computername eingegeben wurde." IDS_WZD_PASSWORDEMPTY "Sie müssen ein Passwort setzen!" IDS_WZD_PASSWORDMATCH "Die Passwörter sind nicht gleich. Bitte setzen Sie die Passwörter erneut." - IDS_WZD_PASSWORDCHAR "Das Passwort das sie setzten enthält ungültige Zeichen. Bitte setzen Sie ein gültiges Passwort." + IDS_WZD_PASSWORDCHAR "Das Passwort, das Sie setzten, enthält ungültige Zeichen. Bitte setzen Sie ein gültiges Passwort." IDS_WZD_LOCALTIME "Setup konnte die lokale Zeit nicht setzen." END diff --git a/reactos/dll/win32/tapiui/lang/de-DE.rc b/reactos/dll/win32/tapiui/lang/de-DE.rc index f38e4c6baab..0074796fe16 100644 --- a/reactos/dll/win32/tapiui/lang/de-DE.rc +++ b/reactos/dll/win32/tapiui/lang/de-DE.rc @@ -99,7 +99,7 @@ BEGIN EDITTEXT 1018, 7, 46, 116, 14, ES_AUTOHSCROLL LTEXT "&PIN:", -1, 7, 68, 238, 8 EDITTEXT 1019, 7, 79, 116, 14, ES_AUTOHSCROLL - LTEXT "Diese Callingcard wird verwendet wenn:", 1056, 14, 117, 224, 8 + LTEXT "Diese Callingcard wird verwendet, wenn:", 1056, 14, 117, 224, 8 GROUPBOX "Callingcarddetails", 2001, 7, 105, 238, 66 LTEXT "", 1000, 22, 131, 216, 8 LTEXT "", 1001, 22, 143, 216, 8 @@ -420,15 +420,15 @@ BEGIN 1065 "Anbieter entfernen" 15800 "23" 15801 "0,\"Keine (Direktwahl)\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",1" - 15802 "1,\"AT&T Direktwahl via 1010ATT1\",\"\",\"G\",\"J1FG\",\"J011EFG\",\"\",\"\",\"1010288\",\"1010288\",1" + 15802 "1,\"AT&T-Direktwahl via 1010ATT1\",\"\",\"G\",\"J1FG\",\"J011EFG\",\"\",\"\",\"1010288\",\"1010288\",1" 15803 "2,\"AT&T via 1010ATT0\",\"\",\"G\",\"J0FG$TH\",\"J01EFG$TH\",\"\",\"\",\"1010288\",\"1010288\",1" 15804 "3,\"AT&T via 1-800-321-0288\",\"\",\"G\",\"J$TFG$TH\",\"J$T01EFG$TH\",\"\",\"\",\"18003210288\",\"18003210288\",1" - 15805 "4,\"MCI Direktwahl via 10102221\",\"\",\"G\",\"J1FG\",\"J011EFG\",\"\",\"\",\"1010222\",\"1010222\",1" + 15805 "4,\"MCI-Direktwahl via 10102221\",\"\",\"G\",\"J1FG\",\"J011EFG\",\"\",\"\",\"1010222\",\"1010222\",1" 15806 "5,\"MCI via 10102220\",\"\",\"G\",\"J0FG$TH\",\"J01EFG$TH\",\"\",\"\",\"1010222\",\"1010222\",1" 15807 "6,\"MCI via 1-800-888-8000\",\"\",\"G\",\"J,,,,,,TH,,FG\",\"J,,,,,,TH,,011EFG\",\"\",\"\",\"18008888000\",\"18008888000\",1" 15808 "7,\"MCI via 1-800-674-0700\",\"\",\"G\",\"J,,,,,,TH,,FG\",\"J,,,,,,TH,,011EFG\",\"\",\"\",\"18006740700\",\"18006740700\",1" 15809 "8,\"MCI via 1-800-674-7000\",\"\",\"G\",\"J,,,,,,TH,,FG\",\"J,,,,,,TH,,011EFG\",\"\",\"\",\"18006747000\",\"18006747000\",1" - 15810 "9,\"US Sprint Direktwahl via 10103331\",\"\",\"G\",\"J1FG\",\"J011EFG\",\"\",\"\",\"1010333\",\"1010333\",1" + 15810 "9,\"US-Sprint-Direktwahl via 10103331\",\"\",\"G\",\"J1FG\",\"J011EFG\",\"\",\"\",\"1010333\",\"1010333\",1" 15811 "10,\"US Sprint via 10103330\",\"\",\"G\",\"J0FG$TH\",\"J01EFG$TH\",\"\",\"\",\"1010333\",\"1010333\",1" 15812 "11,\"US Sprint via 1-800-877-8000\",\"\",\"G\",\"J,,,T0FG,,H\",\"J,,,T01EFG#,H\",\"\",\"\",\"18008778000\",\"18008778000\",1" 15813 "12,\"Callingcard via 0\",\"\",\"G\",\"0FG$TH\",\"01EFG$TH\",\"\",\"\",\"\",\"\",1" diff --git a/reactos/dll/win32/user32/lang/de-DE.rc b/reactos/dll/win32/user32/lang/de-DE.rc index acd96cec3d5..d245f2f7283 100644 --- a/reactos/dll/win32/user32/lang/de-DE.rc +++ b/reactos/dll/win32/user32/lang/de-DE.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "Mi&nimieren", SC_MINIMIZE MENUITEM "Ma&ximieren", SC_MAXIMIZE MENUITEM SEPARATOR - MENUITEM "S&chließen\tAlt-F4", SC_CLOSE + MENUITEM "S&chließen\tAlt+F4", SC_CLOSE END ///////////////////////////////////////////////////////////////////////////// From fa51458191481eb3cc215a575e1837c35d79e6ac Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 01:44:26 +0000 Subject: [PATCH 24/97] [ARMLLB]: Fix typo. svn path=/trunk/; revision=45504 --- reactos/boot/armllb/hw/versatile/hwclcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/boot/armllb/hw/versatile/hwclcd.c b/reactos/boot/armllb/hw/versatile/hwclcd.c index 438804d2b24..3131880338f 100755 --- a/reactos/boot/armllb/hw/versatile/hwclcd.c +++ b/reactos/boot/armllb/hw/versatile/hwclcd.c @@ -32,7 +32,7 @@ LlbHwVersaClcdInitialize(VOID) WRITE_REGISTER_ULONG(PL110_LCDUPBASE, (ULONG)LlbHwGetFrameBuffer()); WRITE_REGISTER_ULONG(PL110_LCDLPBASE, (ULONG)LlbHwGetFrameBuffer()); - /* Initialize timings to 1024x720 */ + /* Initialize timings to 720x400 */ WRITE_REGISTER_ULONG(PL110_LCDTIMING0, LCDTIMING0_PPL(LlbHwGetScreenWidth())); WRITE_REGISTER_ULONG(PL110_LCDTIMING1, LCDTIMING1_LPP(LlbHwGetScreenHeight())); From 68410c584aa4385682f16797a29f3f2856ff0da1 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 01:46:01 +0000 Subject: [PATCH 25/97] [ARMLLB]: PutChar should be a UCHAR routine, this way we can print characters above 127 (extended ASCII). This is needed for the progress bar, for example. svn path=/trunk/; revision=45505 --- reactos/boot/armllb/hw/video.c | 4 ++-- reactos/boot/armllb/inc/video.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/boot/armllb/hw/video.c b/reactos/boot/armllb/hw/video.c index cfe1f60eebc..3e3179aa404 100644 --- a/reactos/boot/armllb/hw/video.c +++ b/reactos/boot/armllb/hw/video.c @@ -274,7 +274,7 @@ ULONG ScreenCursor; VOID NTAPI -LlbVideoDrawChar(IN CHAR c, +LlbVideoDrawChar(IN UCHAR c, IN PUSHORT Buffer, IN USHORT Color, IN USHORT BackColor) @@ -342,7 +342,7 @@ LlbVideoClearScreen(IN BOOLEAN OsLoader) VOID NTAPI -LlbVideoPutChar(IN CHAR c) +LlbVideoPutChar(IN UCHAR c) { ULONG cx, cy, CharsPerLine, BackColor, ScreenWidth; diff --git a/reactos/boot/armllb/inc/video.h b/reactos/boot/armllb/inc/video.h index 0e67123c934..c38ce4278f0 100755 --- a/reactos/boot/armllb/inc/video.h +++ b/reactos/boot/armllb/inc/video.h @@ -15,13 +15,13 @@ LlbVideoClearScreen( VOID NTAPI LlbVideoPutChar( - IN CHAR c + IN UCHAR c ); VOID NTAPI LlbVideoDrawChar( - IN CHAR c, + IN UCHAR c, IN PUSHORT Buffer, IN USHORT Color, IN USHORT BackColor From acb344ee2a21fe4892f35868058e0a8ce495d37e Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 01:47:54 +0000 Subject: [PATCH 26/97] [ARM SDK]: Use real Versatile base addresses instead of the old hacked FreeLDR base addresses. svn path=/trunk/; revision=45506 --- reactos/include/reactos/arm/peripherals/pl011.h | 2 +- reactos/include/reactos/arm/peripherals/pl190.h | 12 ++++++------ reactos/include/reactos/arm/peripherals/sp804.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/include/reactos/arm/peripherals/pl011.h b/reactos/include/reactos/arm/peripherals/pl011.h index 6fa3cdc1fc9..857eab4e188 100644 --- a/reactos/include/reactos/arm/peripherals/pl011.h +++ b/reactos/include/reactos/arm/peripherals/pl011.h @@ -11,7 +11,7 @@ // // UART Registers // -#define UART_BASE (ULONG_PTR)0xE00F1000 /* HACK: freeldr mapped it here */ +#define UART_BASE (ULONG_PTR)0x101F1000 #define UART_PL01x_DR (UART_BASE + 0x00) #define UART_PL01x_RSR (UART_BASE + 0x04) diff --git a/reactos/include/reactos/arm/peripherals/pl190.h b/reactos/include/reactos/arm/peripherals/pl190.h index a6e336a6abf..a452f50abae 100644 --- a/reactos/include/reactos/arm/peripherals/pl190.h +++ b/reactos/include/reactos/arm/peripherals/pl190.h @@ -11,10 +11,10 @@ // // VIC Registers // -#define VIC_BASE (ULONG_PTR)0xE0040000 /* HACK: freeldr mapped it here */ +#define VIC_BASE (ULONG_PTR)0x10140000 -#define VIC_INT_STATUS (VIC_BASE + 0x00) -#define VIC_INT_ENABLE (VIC_BASE + 0x10) -#define VIC_INT_CLEAR (VIC_BASE + 0x14) -#define VIC_SOFT_INT (VIC_BASE + 0x18) -#define VIC_SOFT_INT_CLEAR (VIC_BASE + 0x1C) +#define VIC_INT_STATUS (PULONG)(VIC_BASE + 0x00) +#define VIC_INT_ENABLE (PULONG)(VIC_BASE + 0x10) +#define VIC_INT_CLEAR (PULONG)(VIC_BASE + 0x14) +#define VIC_SOFT_INT (PULONG)(VIC_BASE + 0x18) +#define VIC_SOFT_INT_CLEAR (PULONG)(VIC_BASE + 0x1C) diff --git a/reactos/include/reactos/arm/peripherals/sp804.h b/reactos/include/reactos/arm/peripherals/sp804.h index 68acd91b149..44a09b6f34d 100644 --- a/reactos/include/reactos/arm/peripherals/sp804.h +++ b/reactos/include/reactos/arm/peripherals/sp804.h @@ -11,7 +11,7 @@ // // Timer Registers // -#define TIMER_BASE(x) (ULONG_PTR)(0xE00E2000 + (x * 0x1000)) /* HACK: freeldr mapped it here */ +#define TIMER_BASE(x) (ULONG_PTR)(0x101E2000 + (x * 0x1000)) #define TIMER0_LOAD TIMER_BASE(0) + 0x00 #define TIMER0_VALUE TIMER_BASE(0) + 0x04 #define TIMER0_CONTROL TIMER_BASE(0) + 0x08 From 60fd785e82db87191332f4aeb039958485193f72 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 01:54:14 +0000 Subject: [PATCH 27/97] [NTOS]: Forgot to setup an IRQ stack, the kernel was working by magic since in previous incarnations of the ARM port, 0xFFFFyyyy was mapped, so a stack of 0 worked (going downwards). [NTOS]: Now FreeLDR just calls the KiSystemStartup routine correctly, without any "magic", so fix the code to use a1 instead of a2 (argument 1/2). svn path=/trunk/; revision=45507 --- reactos/ntoskrnl/ke/arm/boot.s | 56 +++++++++++++++------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/boot.s b/reactos/ntoskrnl/ke/arm/boot.s index 48fd667bf9a..bd6e8a80e32 100644 --- a/reactos/ntoskrnl/ke/arm/boot.s +++ b/reactos/ntoskrnl/ke/arm/boot.s @@ -14,61 +14,53 @@ NESTED_ENTRY KiSystemStartup PROLOG_END KiSystemStartup - // - // Put us in FIQ mode - // - b . + /* Put us in FIQ mode */ mrs r3, cpsr orr r3, r1, #CPSR_FIQ_MODE msr cpsr, r3 - // - // Set FIQ stack and registers - // - ldr sp, [a2, #LpbInterruptStack] + /* Set FIQ stack and registers */ + ldr sp, [a1, #LpbInterruptStack] mov r8, #0 mov r9, #0 mov r10, #0 - // - // Put us in ABORT mode - // + /* Repeat for IRQ mode */ + mrs r3, cpsr + orr r3, r1, #CPSR_IRQ_MODE + msr cpsr, r3 + ldr sp, [a1, #LpbInterruptStack] + mov r8, #0 + mov r9, #0 + mov r10, #0 + + /* Put us in ABORT mode */ mrs r3, cpsr orr r3, r1, #CPSR_ABORT_MODE msr cpsr, r3 - // - // Set panic stack - // - ldr sp, [a2, #LpbPanicStack] + /* Set panic stack */ + ldr sp, [a1, #LpbPanicStack] - // - // Put us in UND (Undefined) mode - // + /* Put us in UND (Undefined) mode */ mrs r3, cpsr orr r3, r1, #CPSR_UND_MODE msr cpsr, r3 - // - // Set panic stack - // - ldr sp, [a2, #LpbPanicStack] + /* Set panic stack */ + ldr sp, [a1, #LpbPanicStack] - // - // Put us into SVC (Supervisor) mode - // + /* Put us into SVC (Supervisor) mode */ mrs r3, cpsr orr r3, r1, #CPSR_SVC_MODE msr cpsr, r3 - // - // Switch to boot kernel stack - // - ldr sp, [a2, #LpbKernelStack] + /* Switch to boot kernel stack */ + ldr sp, [a1, #LpbKernelStack] - // - // Go to C code - // + /* Go to C code */ b KiInitializeSystem ENTRY_END KiSystemStartup + +/* EOF */ From d685272dc09be1ba8ac33ebcae1e165717fd9645 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:00:15 +0000 Subject: [PATCH 28/97] [NTOS]: Get rid of fixed TLB entries on ARM, I don't think that idea makes sense (unlike IA64 or MIPS where they are lot more flexible), since they only allow 1MB sections, not pages. svn path=/trunk/; revision=45508 --- reactos/ntoskrnl/ke/arm/cpu.c | 79 +---------------------------------- 1 file changed, 1 insertion(+), 78 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/cpu.c b/reactos/ntoskrnl/ke/arm/cpu.c index a9154ceaad1..275df6c3854 100644 --- a/reactos/ntoskrnl/ke/arm/cpu.c +++ b/reactos/ntoskrnl/ke/arm/cpu.c @@ -24,7 +24,7 @@ ULONG KeProcessorArchitecture; ULONG KeProcessorLevel; ULONG KeProcessorRevision; ULONG KeFeatureBits; -ULONG KeLargestCacheLine = 32; // FIXME: It depends +ULONG KeLargestCacheLine = 64; // FIXME: It depends /* FUNCTIONS ******************************************************************/ @@ -38,83 +38,6 @@ KiFlushSingleTb(IN BOOLEAN Invalid, KeArmInvalidateTlbEntry(Virtual); } -VOID -KeFillFixedEntryTb(IN ARM_PTE Pte, - IN PVOID Virtual, - IN ULONG Index) -{ - ARM_LOCKDOWN_REGISTER LockdownRegister; - ULONG OldVictimCount; - volatile unsigned long Temp; - PARM_TRANSLATION_TABLE TranslationTable; - - // - // Fixed TB entries must be section entries - // - Virtual = (PVOID)((ULONG)Virtual & 0xFFF00000); - - // - // On ARM, we can't set the index ourselves, so make sure that we are not - // locking down more than 8 entries. - // - UNREFERENCED_PARAMETER(Index); - KeFixedTbEntries++; - ASSERT(KeFixedTbEntries <= 8); - - // - // Flush the address - // - KiFlushSingleTb(TRUE, Virtual); - - // - // Read lockdown register and set the preserve bit - // - LockdownRegister = KeArmLockdownRegisterGet(); - LockdownRegister.Preserve = TRUE; - OldVictimCount = LockdownRegister.Victim; - KeArmLockdownRegisterSet(LockdownRegister); - - // - // Map the PTE for this virtual address - // - TranslationTable = (PVOID)KeArmTranslationTableRegisterGet().AsUlong; - TranslationTable->Pte[(ULONG)Virtual >> PDE_SHIFT] = Pte; - - // - // Now force a miss - // - Temp = *(PULONG)Virtual; - - // - // Read lockdown register - // - LockdownRegister = KeArmLockdownRegisterGet(); - if (LockdownRegister.Victim == 0) - { - // - // This can only happen on QEMU or broken CPUs since there *has* - // to have been at least a miss since the system started. For example, - // QEMU doesn't support TLB lockdown. - // - // On these systems, we'll just keep the PTE mapped - // - } - else - { - // - // Clear the preserve bits - // - LockdownRegister.Preserve = FALSE; - ASSERT(LockdownRegister.Victim == OldVictimCount + 1); - KeArmLockdownRegisterSet(LockdownRegister); - - // - // Clear the PTE - // - TranslationTable->Pte[(ULONG)Virtual >> PDE_SHIFT].AsUlong = 0; - } -} - VOID KeFlushTb(VOID) { From bf39d09670054834f8a40f2cca9e49ba0da73f3b Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:00:52 +0000 Subject: [PATCH 29/97] [NTOS]: Sync up KiDispatchException with x86 code (and going back to C comment formatting). svn path=/trunk/; revision=45509 --- reactos/ntoskrnl/ke/arm/exp.c | 122 +++++++++++++++------------------- 1 file changed, 52 insertions(+), 70 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/exp.c b/reactos/ntoskrnl/ke/arm/exp.c index 1a912631246..ddc94a30c70 100644 --- a/reactos/ntoskrnl/ke/arm/exp.c +++ b/reactos/ntoskrnl/ke/arm/exp.c @@ -176,67 +176,51 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, IN BOOLEAN FirstChance) { CONTEXT Context; - - // - // Increase number of Exception Dispatches - // + + /* Increase number of Exception Dispatches */ KeGetCurrentPrcb()->KeExceptionDispatchCount++; - - // - // Set the context flags - // + + /* Set the context flags */ Context.ContextFlags = CONTEXT_FULL; - // - // FIXME-V6: VFP Support - // - - // - // Get a Context - // + /* Check if User Mode or if the kernel debugger is enabled */ + if ((PreviousMode == UserMode) || (KeGetPcr()->KdVersionBlock)) + { + /* FIXME-V6: VFP Support */ + } + + /* Get a Context */ KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Context); - - // - // Look at our exception code - // + + /* Look at our exception code */ switch (ExceptionRecord->ExceptionCode) { - // - // Breakpoint - // + /* Breakpoint */ case STATUS_BREAKPOINT: - - // - // We want the instruction right before the int 3 - // + + /* Decrement PC by four */ Context.Pc -= sizeof(ULONG); break; - - // - // Internal exception - // + + /* Internal exception */ case KI_EXCEPTION_ACCESS_VIOLATION: - - // - // Set correct code - // + + /* Set correct code */ ExceptionRecord->ExceptionCode = STATUS_ACCESS_VIOLATION; + if (PreviousMode == UserMode) + { + /* FIXME: Handle no execute */ + } break; } - - // - // Handle kernel-mode first, it's simpler - // + + /* Handle kernel-mode first, it's simpler */ if (PreviousMode == KernelMode) { - // - // Check if this is a first-chance exception - // + /* Check if this is a first-chance exception */ if (FirstChance == TRUE) { - // - // Break into the debugger for the first time - // + /* Break into the debugger for the first time */ if (KiDebugRoutine(TrapFrame, ExceptionFrame, ExceptionRecord, @@ -244,21 +228,15 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, PreviousMode, FALSE)) { - // - // Exception was handled - // + /* Exception was handled */ goto Handled; } - - // - // If the Debugger couldn't handle it, dispatch the exception - // + + /* If the Debugger couldn't handle it, dispatch the exception */ if (RtlDispatchException(ExceptionRecord, &Context)) goto Handled; } - - // - // This is a second-chance exception, only for the debugger - // + + /* This is a second-chance exception, only for the debugger */ if (KiDebugRoutine(TrapFrame, ExceptionFrame, ExceptionRecord, @@ -266,15 +244,11 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, PreviousMode, TRUE)) { - // - // Exception was handled - // + /* Exception was handled */ goto Handled; } - - // - // Third strike; you're out - // + + /* Third strike; you're out */ KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, ExceptionRecord->ExceptionCode, (ULONG_PTR)ExceptionRecord->ExceptionAddress, @@ -283,19 +257,27 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, } else { - // - // FIXME-USER: Do user-mode exception handling - // - ASSERT(FALSE); + /* FIXME: TODO */ + /* 3rd strike, kill the process */ + DPRINT1("Kill %.16s, ExceptionCode: %lx, ExceptionAddress: %lx\n", + PsGetCurrentProcess()->ImageFileName, + ExceptionRecord->ExceptionCode, + ExceptionRecord->ExceptionAddress); + + ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode); + KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, + ExceptionRecord->ExceptionCode, + (ULONG_PTR)ExceptionRecord->ExceptionAddress, + (ULONG_PTR)TrapFrame, + 0); } - + Handled: - // - // Convert the context back into Trap/Exception Frames - // + /* Convert the context back into Trap/Exception Frames */ KeContextToTrapFrame(&Context, ExceptionFrame, TrapFrame, Context.ContextFlags, PreviousMode); + return; } From 4deb6d8bf417220f2f18c503fa42659ae4edccf7 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:06:29 +0000 Subject: [PATCH 30/97] [ARM DDK]: Use the closest possible approximation to the x86 KPCR/KPRCB (in fact, the public KPCR is identical, just the KIPCR is different, internally), instead of a mashup of PPC and MIPS structures. svn path=/trunk/; revision=45510 --- reactos/include/ndk/arm/ketypes.h | 92 ++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index aa024b1f28f..bbf85af50cb 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -316,9 +316,13 @@ typedef struct _KPRCB UCHAR Reserved; USHORT BuildType; KAFFINITY SetMember; + UCHAR CpuType; + UCHAR CpuID; + USHORT CpuStep; KPROCESSOR_STATE ProcessorState; ULONG KernelReserved[16]; ULONG HalReserved[16]; + UCHAR PrcbPad0[92]; KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; struct _KTHREAD *NpxThread; ULONG InterruptCount; @@ -334,7 +338,6 @@ typedef struct _KPRCB UCHAR NodeColor; UCHAR Spare1; ULONG NodeShiftedColor; - ULONG PcrPage; struct _KNODE *ParentNode; ULONG MultiThreadProcessorSet; struct _KPRCB *MultiThreadSetMaster; @@ -361,19 +364,22 @@ typedef struct _KPRCB LARGE_INTEGER IoReadTransferCount; LARGE_INTEGER IoWriteTransferCount; LARGE_INTEGER IoOtherTransferCount; - ULONG KeContextSwitches; + ULONG SpareCounter1[8]; PP_LOOKASIDE_LIST PPLookasideList[16]; PP_LOOKASIDE_LIST PPNPagedLookasideList[32]; PP_LOOKASIDE_LIST PPPagedLookasideList[32]; volatile ULONG PacketBarrier; volatile ULONG ReverseStall; PVOID IpiFrame; + UCHAR PrcbPad2[52]; volatile PVOID CurrentPacket[3]; volatile ULONG TargetSet; volatile PKIPI_WORKER WorkerRoutine; volatile ULONG IpiFrozen; + UCHAR PrcbPad3[40]; volatile ULONG RequestSummary; volatile struct _KPRCB *SignalDone; + UCHAR PrcbPad4[56]; struct _KDPC_DATA DpcData[2]; PVOID DpcStack; ULONG MaximumDpcQueueDepth; @@ -391,15 +397,19 @@ typedef struct _KPRCB KEVENT DpcEvent; UCHAR ThreadDpcEnable; volatile BOOLEAN QuantumEnd; + UCHAR PrcbPad50; volatile UCHAR IdleSchedule; LONG DpcSetEventRequest; + UCHAR PrcbPad5[18]; LONG TickOffset; KDPC CallDpc; + ULONG PrcbPad7[8]; LIST_ENTRY WaitListHead; ULONG ReadySummary; ULONG QueueIndex; LIST_ENTRY DispatcherReadyListHead[32]; SINGLE_LIST_ENTRY DeferredReadyListHead; + ULONG PrcbPad72[11]; PVOID ChainedInterruptList; LONG LookasideIrpFloat; volatile LONG MmPageFaultCount; @@ -415,13 +425,79 @@ typedef struct _KPRCB volatile LONG MmDirtyWriteIoCount; volatile LONG MmMappedPagesWriteCount; volatile LONG MmMappedWriteIoCount; + ULONG SpareFields0[1]; CHAR VendorString[13]; + UCHAR InitialApicId; + UCHAR LogicalProcessorsPerPhysicalProcessor; ULONG MHz; ULONG FeatureBits; + LARGE_INTEGER UpdateSignature; volatile LARGE_INTEGER IsrTime; + LARGE_INTEGER SpareField1; + //FX_SAVE_AREA NpxSaveArea; PROCESSOR_POWER_STATE PowerState; } KPRCB, *PKPRCB; +// +// Processor Control Region +// +typedef struct _KIPCR +{ + union + { + NT_TIB NtTib; + struct + { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused + PVOID Used_StackBase; // Unused + PVOID PerfGlobalGroupMask; + PVOID TssCopy; // Unused + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; // Unused + PVOID Used_Self; + }; + }; + struct _KPCR *Self; + struct _KPRCB *Prcb; + KIRQL Irql; + ULONG IRR; // Unused + ULONG IrrActive; // Unused + ULONG IDR; // Unused + PVOID KdVersionBlock; + PVOID IDT; // Unused + PVOID GDT; // Unused + PVOID TSS; // Unused + USHORT MajorVersion; + USHORT MinorVersion; + KAFFINITY SetMember; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; + // arm part + UCHAR Spare0[2]; + UCHAR IrqlMask[32]; + ULONG IrqlTable[32]; + PKINTERRUPT_ROUTINE InterruptRoutine[32]; + ULONG ReservedVectors; + ULONG FirstLevelDcacheSize; + ULONG FirstLevelDcacheFillSize; + ULONG FirstLevelIcacheSize; + ULONG FirstLevelIcacheFillSize; + ULONG SecondLevelDcacheSize; + ULONG SecondLevelDcacheFillSize; + ULONG SecondLevelIcacheSize; + ULONG SecondLevelIcacheFillSize; + ULONG DcacheFillSize; + ULONG DcacheAlignment; + ULONG IcacheAlignment; + ULONG IcacheFillSize; + ULONG ProcessorId; + PVOID InterruptStack; + PVOID PanicStack; + PVOID InitialStack; + KPRCB PrcbData; +} KIPCR, *PKIPCR; + // // Macro to get current KPRCB // @@ -432,5 +508,17 @@ KeGetCurrentPrcb(VOID) return PCR->Prcb; } +// +// Just read it from the PCR +// +#define KeGetCurrentProcessorNumber() (int)PCR->Number +#define KeGetCurrentIrql() PCR->Irql +#define _KeGetCurrentThread() KeGetCurrentPrcb()->CurrentThread +#define _KeGetPreviousMode() KeGetCurrentPrcb()->CurrentThread->PreviousMode +#define _KeIsExecutingDpc() (KeGetCurrentPrcb()->DpcRoutineActive != 0) +#define KeGetCurrentThread() _KeGetCurrentThread() +#define KeGetPreviousMode() _KeGetPreviousMode() +#define KeGetDcacheFillSize() PCR->DcacheFillSize + #endif #endif From ba3bc4340e35d163186ab0bea2f2f14d92d609a8 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:08:24 +0000 Subject: [PATCH 31/97] [ARMDDK]: Use the same KPCR structure on ARM as on x86. [ARMDDK]: Use the same addresses for KPCR and KUSER_SHARED_DATA on ARM as on x86. On ARM however, since there are no "segments", the KPCR is also mapped in user-mode, read-only, to have a static structure that can point to the current TEB. svn path=/trunk/; revision=45511 --- reactos/include/reactos/arm/armddk.h | 103 +++++++++------------------ 1 file changed, 33 insertions(+), 70 deletions(-) diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h index 178bb50f3fb..54bfa15c71a 100644 --- a/reactos/include/reactos/arm/armddk.h +++ b/reactos/include/reactos/arm/armddk.h @@ -28,10 +28,10 @@ // // FIXME: mmtypes.h? // -#define KIPCR 0xFFFFF000 -#define KI_USER_SHARED_DATA 0xFFFFE000 +#define KIP0PCRADDRESS 0xFFDFF000 +#define KI_USER_SHARED_DATA 0xFFDF0000 #define USPCR 0x7FFF0000 -#define PCR ((volatile KPCR * const)KIPCR) +#define PCR ((KPCR * const)KIP0PCRADDRESS) #define USERPCR ((volatile KPCR * const)USPCR) #define KeGetPcr() PCR #ifndef _WINNT_H @@ -47,25 +47,13 @@ extern ULONG_PTR MmUserProbeAddress; #define MM_SYSTEM_RANGE_START MmSystemRangeStart #define MM_USER_PROBE_ADDRESS MmUserProbeAddress #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC1400000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 // // Maximum IRQs // #define MAXIMUM_VECTOR 16 -// -// Just read it from the PCR -// -#define KeGetCurrentProcessorNumber() (int)PCR->Number -#define KeGetCurrentIrql() PCR->CurrentIrql -#define _KeGetCurrentThread() PCR->CurrentThread -#define _KeGetPreviousMode() PCR->CurrentThread->PreviousMode -#define _KeIsExecutingDpc() (PCR->DpcRoutineActive != 0) -#define KeGetCurrentThread() _KeGetCurrentThread() -#define KeGetPreviousMode() _KeGetPreviousMode() -#define KeGetDcacheFillSize() PCR->DcacheFillSize - // // Used to contain PFNs and PFN counts @@ -132,7 +120,6 @@ typedef struct _CONTEXT { // // Processor Control Region -// On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA // #ifdef _WINNT_H typedef @@ -141,60 +128,36 @@ VOID #endif typedef struct _KPCR { - ULONG MinorVersion; - ULONG MajorVersion; - PKINTERRUPT_ROUTINE InterruptRoutine[32]; - PVOID XcodeDispatch; - ULONG FirstLevelDcacheSize; - ULONG FirstLevelDcacheFillSize; - ULONG FirstLevelIcacheSize; - ULONG FirstLevelIcacheFillSize; - ULONG SecondLevelDcacheSize; - ULONG SecondLevelDcacheFillSize; - ULONG SecondLevelIcacheSize; - ULONG SecondLevelIcacheFillSize; + union + { + NT_TIB NtTib; + struct + { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused + PVOID Used_StackBase; // Unused + PVOID PerfGlobalGroupMask; + PVOID TssCopy; // Unused + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; // Unused + PVOID Used_Self; + }; + }; + struct _KPCR *Self; struct _KPRCB *Prcb; - struct _TEB *Teb; - PVOID TlsArray; - ULONG DcacheFillSize; - ULONG IcacheAlignment; - ULONG IcacheFillSize; - ULONG ProcessorId; - ULONG ProfileInterval; - ULONG ProfileCount; - ULONG StallExecutionCount; - ULONG StallScaleFactor; - CCHAR Number; - PVOID DataBusError; - PVOID InstructionBusError; - ULONG CachePolicy; - ULONG AlignedCachePolicy; - UCHAR IrqlMask[32]; - ULONG IrqlTable[32]; - UCHAR CurrentIrql; + KIRQL Irql; + ULONG IRR; // Unused + ULONG IrrActive; // Unused + ULONG IDR; // Unused + PVOID KdVersionBlock; + PVOID IDT; // Unused + PVOID GDT; // Unused + PVOID TSS; // Unused + USHORT MajorVersion; + USHORT MinorVersion; KAFFINITY SetMember; - struct _KTHREAD *CurrentThread; - ULONG ReservedVectors; - KAFFINITY NotMember; - ULONG SystemReserved[6]; - ULONG DcacheAlignment; - ULONG HalReserved[64]; - BOOLEAN FirstLevelActive; - BOOLEAN DpcRoutineActive; - ULONG CurrentPid; - BOOLEAN OnInterruptStack; - PVOID SavedInitialStack; - PVOID SavedStackLimit; - PVOID SystemServiceDispatchStart; - PVOID SystemServiceDispatchEnd; - PVOID InterruptStack; - PVOID PanicStack; - PVOID BadVaddr; - PVOID InitialStack; - PVOID StackLimit; - ULONG QuantumEnd; - PVOID PerfGlobalGroupMask; - ULONG ContextSwitches; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; } KPCR, *PKPCR; // @@ -203,7 +166,7 @@ typedef struct _KPCR FORCEINLINE struct _TEB* NtCurrentTeb(VOID) { - return (struct _TEB*)USERPCR->Teb; + return (struct _TEB*)USERPCR->Used_Self; } #ifndef _WINNT_H From 6995f3fca6c6a2227f404f88f3d5c24b60f2855c Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:09:34 +0000 Subject: [PATCH 32/97] [NTOS]: Update code to use new KPCR structure. [NTOS]: Make all trap code currently spin forever, because it has not been reviewed yet. svn path=/trunk/; revision=45512 --- reactos/ntoskrnl/ke/arm/trapc.c | 44 +++++++++++++++++++++--------- reactos/ntoskrnl/ke/arm/usercall.c | 2 +- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c index 51b12f816e4..edfedf42820 100644 --- a/reactos/ntoskrnl/ke/arm/trapc.c +++ b/reactos/ntoskrnl/ke/arm/trapc.c @@ -25,6 +25,9 @@ KiIdleLoop(VOID) // // Loop forever... that's why this is an idle loop // + DPRINT1("[IDLE LOOP]\n"); + while (TRUE); + while (TRUE) { // @@ -117,10 +120,13 @@ BOOLEAN KiSwapContextInternal(IN PKTHREAD OldThread, IN PKTHREAD NewThread) { - PKPCR Pcr = (PKPCR)KeGetPcr(); + PKIPCR Pcr = (PKIPCR)KeGetPcr(); PKPRCB Prcb = Pcr->Prcb; PKPROCESS OldProcess, NewProcess; + DPRINT1("SWAP\n"); + while (TRUE); + // // Increase context switch count // @@ -163,7 +169,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread, // Increase thread context switches // NewThread->ContextSwitches++; - +#if 0 // I don't buy this // // Set us as the current thread // NOTE: On RISC Platforms, there is both a KPCR CurrentThread, and a @@ -175,7 +181,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread, // there as well. // Pcr->CurrentThread = NewThread; - +#endif // // DPCs shouldn't be active // @@ -221,7 +227,9 @@ KiApcInterrupt(VOID) KPROCESSOR_MODE PreviousMode; KEXCEPTION_FRAME ExceptionFrame; PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; - //DPRINT1("[APC]\n"); + + DPRINT1("[APC TRAP]\n"); + while (TRUE); // // Isolate previous mode @@ -257,14 +265,17 @@ KiApcInterrupt(VOID) VOID KiDispatchInterrupt(VOID) { - PKPCR Pcr; + PKIPCR Pcr; PKPRCB Prcb; PKTHREAD NewThread, OldThread; + DPRINT1("[DPC TRAP]\n"); + while (TRUE); + // // Get the PCR and disable interrupts // - Pcr = (PKPCR)KeGetPcr(); + Pcr = (PKIPCR)KeGetPcr(); Prcb = Pcr->Prcb; _disable(); @@ -339,14 +350,14 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame, { KIRQL OldIrql, Irql; ULONG InterruptCause, InterruptMask; - PKPCR Pcr; + PKIPCR Pcr; PKTRAP_FRAME OldTrapFrame; ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); // // Increment interrupt count // - Pcr = (PKPCR)KeGetPcr(); + Pcr = (PKIPCR)KeGetPcr(); Pcr->Prcb->InterruptCount++; // @@ -359,7 +370,7 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame, // Get the interrupt source // InterruptCause = HalGetInterruptSource(); -// DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc); + //DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc); // // Get the new IRQL and Interrupt Mask @@ -421,6 +432,10 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame) ULONG DebugType, Parameter0; EXCEPTION_RECORD ExceptionRecord; + DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n", + KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); + while (TRUE); + // // What we *SHOULD* do is look at the instruction fault status register // and see if it's equal to 2 (debug trap). Unfortunately QEMU doesn't seem @@ -483,8 +498,6 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame) // // Unhandled // - DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n", - KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); UNIMPLEMENTED; ASSERT(FALSE); return STATUS_SUCCESS; @@ -497,6 +510,10 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame) PVOID Address = (PVOID)KeArmFaultAddressRegisterGet(); ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); + DPRINT1("[ABORT] (%x) @ %p/%p/%p\n", + KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); + while (TRUE); + // // Check if this is a page fault // @@ -512,8 +529,6 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame) // // Unhandled // - DPRINT1("[ABORT] (%x) @ %p/%p/%p\n", - KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); UNIMPLEMENTED; ASSERT(FALSE); return STATUS_SUCCESS; @@ -527,6 +542,9 @@ KiSoftwareInterruptHandler(IN PKTRAP_FRAME TrapFrame) ULONG Instruction; ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); + DPRINT1("[SWI] @ %p/%p\n", TrapFrame->SvcLr, TrapFrame->Pc); + while (TRUE); + // // Get the current thread // diff --git a/reactos/ntoskrnl/ke/arm/usercall.c b/reactos/ntoskrnl/ke/arm/usercall.c index 1621983c1c7..3b6ceeaa6dc 100644 --- a/reactos/ntoskrnl/ke/arm/usercall.c +++ b/reactos/ntoskrnl/ke/arm/usercall.c @@ -226,7 +226,7 @@ KiSystemService(IN PKTHREAD Thread, // // Forcibly put us in a sane state // - KeGetPcr()->CurrentIrql = 0; + KeGetPcr()->Irql = 0; _disable(); // From 16ab5464115e8b4b94674665920675dcb5c6f284 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:11:18 +0000 Subject: [PATCH 33/97] [NTOS]: Make system startup match x86 code as closely as possible, instead of mixing MIPS/PPC code. Only rip out parts that are obviously x86-specific. Also fix code to use new KPCR definitions. [NTOS]: Implement a DbgPrintEarly function that directly uses KDCOM to print to the serial console, instead of going through the Debug Service Interrupt. svn path=/trunk/; revision=45513 --- reactos/ntoskrnl/ke/arm/kiinit.c | 609 ++++++++++++++----------------- 1 file changed, 273 insertions(+), 336 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/kiinit.c b/reactos/ntoskrnl/ke/arm/kiinit.c index 9352350349f..4b532ca5ff1 100644 --- a/reactos/ntoskrnl/ke/arm/kiinit.c +++ b/reactos/ntoskrnl/ke/arm/kiinit.c @@ -28,9 +28,7 @@ VOID NTAPI KiInitMachineDependent(VOID) { - // - // There is nothing to do on ARM - // + /* There is nothing to do on ARM */ return; } @@ -43,169 +41,55 @@ KiInitializeKernel(IN PKPROCESS InitProcess, IN CCHAR Number, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { + PKIPCR Pcr = (PKIPCR)KeGetPcr(); ULONG PageDirectory[2]; - PKPCR Pcr; ULONG i; - - // - // Initialize the platform - // - HalInitializeProcessor(Number, LoaderBlock); - // - // Save loader block - // - KeLoaderBlock = LoaderBlock; + /* Set the default NX policy (opt-in) */ + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN; - // - // Setup KPRCB - // - Prcb->MajorVersion = 1; - Prcb->MinorVersion = 1; - Prcb->BuildType = 0; -#ifndef CONFIG_SMP - Prcb->BuildType |= PRCB_BUILD_UNIPROCESSOR; -#endif -#if DBG - Prcb->BuildType |= PRCB_BUILD_DEBUG; -#endif - Prcb->CurrentThread = InitThread; - Prcb->NextThread = NULL; - Prcb->IdleThread = InitThread; - Prcb->Number = Number; - Prcb->SetMember = 1 << Number; - Prcb->PcrPage = LoaderBlock->u.Arm.PcrPage; - - // - // Initialize spinlocks and DPC data - // + /* Initialize spinlocks and DPC data */ KiInitSpinLocks(Prcb, Number); - - // - // Set the PRCB in the processor block - // - KiProcessorBlock[(ULONG)Number] = Prcb; - Pcr = (PKPCR)KeGetPcr(); - - // - // Set processor information - // - KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM; - KeFeatureBits = 0; - KeProcessorLevel = (USHORT)(Pcr->ProcessorId >> 8); - KeProcessorRevision = (USHORT)(Pcr->ProcessorId & 0xFF); - - // - // Set stack pointers - // + + /* Set stack pointers */ Pcr->InitialStack = IdleStack; - Pcr->StackLimit = (PVOID)((ULONG_PTR)IdleStack - KERNEL_STACK_SIZE); - // - // Check if this is the Boot CPU - // + /* Check if this is the Boot CPU */ if (!Number) { - // - // Setup the unexpected interrupt - // + /* Setup the unexpected interrupt */ KxUnexpectedInterrupt.DispatchAddress = KiUnexpectedInterrupt; for (i = 0; i < 4; i++) { - // - // Copy the template code - // + /* Copy the template code */ KxUnexpectedInterrupt.DispatchCode[i] = ((PULONG)KiInterruptTemplate)[i]; } - // - // Set DMA coherency - // + /* Set DMA coherency */ KiDmaIoCoherency = 0; - // - // Sweep D-Cache - // + /* Sweep D-Cache */ HalSweepDcache(); - } - - // - // Set all interrupt routines to unexpected interrupts as well - // - for (i = 0; i < MAXIMUM_VECTOR; i++) - { - // - // Point to the same template - // - Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode; - } - - // - // Setup profiling - // - Pcr->ProfileCount = 0; - Pcr->ProfileInterval = 0x200000; - Pcr->StallScaleFactor = 50; - - // - // Setup software interrupts - // - Pcr->InterruptRoutine[PASSIVE_LEVEL] = KiPassiveRelease; - Pcr->InterruptRoutine[APC_LEVEL] = KiApcInterrupt; - Pcr->InterruptRoutine[DISPATCH_LEVEL] = KiDispatchInterrupt; - Pcr->ReservedVectors = (1 << PASSIVE_LEVEL) | - (1 << APC_LEVEL) | - (1 << DISPATCH_LEVEL) | - (1 << IPI_LEVEL); + + /* Set boot-level flags */ + KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM; + KeFeatureBits = 0; + KeProcessorLevel = (USHORT)(Pcr->ProcessorId >> 8); + KeProcessorRevision = (USHORT)(Pcr->ProcessorId & 0xFF); - // - // Set IRQL and prcessor member/number - // - Pcr->CurrentIrql = APC_LEVEL; - Pcr->SetMember = 1 << Number; - Pcr->NotMember = -Pcr->SetMember; - Pcr->Number = Number; + /* Set the current MP Master KPRCB to the Boot PRCB */ + Prcb->MultiThreadSetMaster = Prcb; - // - // Remember our parent - // - InitThread->ApcState.Process = InitProcess; + /* Lower to APC_LEVEL */ + KeLowerIrql(APC_LEVEL); - // - // Setup the active processor numbers - // - KeActiveProcessors |= 1 << Number; - KeNumberProcessors = Number + 1; - - // - // Check if this is the boot CPU - // - if (!Number) - { - // - // Setup KD - // - KdInitSystem(0, LoaderBlock); - - // - // Check for break-in - // - if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); - - // - // Cleanup the rest of the processor block array - // - for (i = 1; i < MAXIMUM_PROCESSORS; i++) KiProcessorBlock[i] = NULL; - - // - // Initialize portable parts of the OS - // + /* Initialize portable parts of the OS */ KiInitSystem(); - // - // Initialize the Idle Process and the Process Listhead - // + /* Initialize the Idle Process and the Process Listhead */ InitializeListHead(&KiProcessListHead); + PageDirectory[0] = 0; + PageDirectory[1] = 0; KeInitializeProcess(InitProcess, 0, 0xFFFFFFFF, @@ -215,15 +99,11 @@ KiInitializeKernel(IN PKPROCESS InitProcess, } else { - // - // FIXME-V6: See if we want to support MP - // + /* FIXME-V6: See if we want to support MP */ DPRINT1("ARM MPCore not supported\n"); } - - // - // Setup the Idle Thread - // + + /* Setup the Idle Thread */ KeInitializeThread(InitProcess, InitThread, NULL, @@ -239,253 +119,310 @@ KiInitializeKernel(IN PKPROCESS InitProcess, InitThread->WaitIrql = DISPATCH_LEVEL; InitProcess->ActiveProcessors = 1 << Number; - // - // HACK for MmUpdatePageDir - // + /* HACK for MmUpdatePageDir */ ((PETHREAD)InitThread)->ThreadsProcess = (PEPROCESS)InitProcess; - // - // Initialize the Kernel Executive - // + /* Set up the thread-related fields in the PRCB */ + Prcb->CurrentThread = InitThread; + Prcb->NextThread = NULL; + Prcb->IdleThread = InitThread; + + /* Initialize the Kernel Executive */ ExpInitializeExecutive(Number, LoaderBlock); - - // - // Only do this on the boot CPU - // + + /* Only do this on the boot CPU */ if (!Number) { - // - // Calculate the time reciprocal - // + /* Calculate the time reciprocal */ KiTimeIncrementReciprocal = - KiComputeReciprocal(KeMaximumIncrement, - &KiTimeIncrementShiftCount); - - // - // Update DPC Values in case they got updated by the executive - // + KiComputeReciprocal(KeMaximumIncrement, + &KiTimeIncrementShiftCount); + + /* Update DPC Values in case they got updated by the executive */ Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth; Prcb->MinimumDpcRate = KiMinimumDpcRate; Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold; } - - // - // Raise to Dispatch - // + + /* Raise to Dispatch */ KfRaiseIrql(DISPATCH_LEVEL); - - // - // Set the Idle Priority to 0. This will jump into Phase 1 - // + + /* Set the Idle Priority to 0. This will jump into Phase 1 */ KeSetPriorityThread(InitThread, 0); - - // - // If there's no thread scheduled, put this CPU in the Idle summary - // + + /* If there's no thread scheduled, put this CPU in the Idle summary */ KiAcquirePrcbLock(Prcb); if (!Prcb->NextThread) KiIdleSummary |= 1 << Number; KiReleasePrcbLock(Prcb); - - // - // Raise back to HIGH_LEVEL - // + + /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */ KfRaiseIrql(HIGH_LEVEL); + LoaderBlock->Prcb = 0; } +C_ASSERT((PKIPCR)KeGetPcr() == (PKIPCR)0xFFDFF000); +C_ASSERT((FIELD_OFFSET(KIPCR, FirstLevelDcacheSize) & 4) == 0); +C_ASSERT(sizeof(KIPCR) <= PAGE_SIZE); + VOID -KiInitializeSystem(IN ULONG Magic, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) +NTAPI +KiInitializePcr(IN ULONG ProcessorNumber, + IN PKIPCR Pcr, + IN PKTHREAD IdleThread, + IN PVOID PanicStack, + IN PVOID InterruptStack) { - ARM_PTE Pte; - PKPCR Pcr; - ARM_CONTROL_REGISTER ControlRegister; + ULONG i; + + /* Set the Current Thread */ + Pcr->PrcbData.CurrentThread = IdleThread; - // - // Detect ARM version (Architecture 6 is the ARMv5TE-J, go figure!) - // - KeIsArmV6 = KeArmIdCodeRegisterGet().Architecture == 7; - - // - // Set the number of TLB entries and ASIDs - // - KeNumberTbEntries = 64; - if (__ARMV6__) - { - // - // 256 ASIDs on v6/v7 - // - KeNumberProcessIds = 256; - } - else - { - // - // The TLB is VIVT on v4/v5 - // - KeNumberProcessIds = 0; - } - - // - // Flush the TLB - // - KeFlushTb(); - - // - // Build the KIPCR pte - // - Pte.L1.Section.Type = SectionPte; - Pte.L1.Section.Buffered = FALSE; - Pte.L1.Section.Cached = FALSE; - Pte.L1.Section.Reserved = 1; // ARM926EJ-S manual recommends setting to 1 - Pte.L1.Section.Domain = Domain0; - Pte.L1.Section.Access = SupervisorAccess; - Pte.L1.Section.BaseAddress = LoaderBlock->u.Arm.PcrPage; - Pte.L1.Section.Ignored = Pte.L1.Section.Ignored1 = 0; - - // - // Map it into kernel address space by locking it into the TLB - // - KeFillFixedEntryTb(Pte, (PVOID)KIPCR, PCR_ENTRY); + /* Set pointers to ourselves */ + Pcr->Self = (PKPCR)Pcr; + Pcr->Prcb = &Pcr->PrcbData; - // - // Now map the PCR into user address space as well (read-only) - // - Pte.L1.Section.Access = SharedAccess; - KeFillFixedEntryTb(Pte, (PVOID)USPCR, PCR_ENTRY + 1); - - // - // Now we should be able to use the PCR... - // - Pcr = (PKPCR)KeGetPcr(); - - // - // Set the cache policy (HACK) - // - Pcr->CachePolicy = 0; - Pcr->AlignedCachePolicy = 0; - - // - // Copy cache information from the loader block - // - Pcr->FirstLevelDcacheSize = LoaderBlock->u.Arm.FirstLevelDcacheSize; - Pcr->SecondLevelDcacheSize = LoaderBlock->u.Arm.SecondLevelDcacheSize; - Pcr->FirstLevelIcacheSize = LoaderBlock->u.Arm.FirstLevelIcacheSize; - Pcr->SecondLevelIcacheSize = LoaderBlock->u.Arm.SecondLevelIcacheSize; - Pcr->FirstLevelDcacheFillSize = LoaderBlock->u.Arm.FirstLevelDcacheFillSize; - Pcr->SecondLevelDcacheFillSize = LoaderBlock->u.Arm.SecondLevelDcacheFillSize; - Pcr->FirstLevelIcacheFillSize = LoaderBlock->u.Arm.FirstLevelIcacheFillSize; - Pcr->SecondLevelIcacheFillSize = LoaderBlock->u.Arm.SecondLevelIcacheFillSize; + /* Set the PCR Version */ + Pcr->MajorVersion = PCR_MAJOR_VERSION; + Pcr->MinorVersion = PCR_MINOR_VERSION; - // - // Set global d-cache fill and alignment values - // + /* Set the PCRB Version */ + Pcr->PrcbData.MajorVersion = 1; + Pcr->PrcbData.MinorVersion = 1; + + /* Set the Build Type */ + Pcr->PrcbData.BuildType = 0; +#ifndef CONFIG_SMP + Pcr->PrcbData.BuildType |= PRCB_BUILD_UNIPROCESSOR; +#endif +#if DBG + Pcr->PrcbData.BuildType |= PRCB_BUILD_DEBUG; +#endif + + /* Set the Processor Number and current Processor Mask */ + Pcr->PrcbData.Number = (UCHAR)ProcessorNumber; + Pcr->PrcbData.SetMember = 1 << ProcessorNumber; + + /* Set the PRCB for this Processor */ + KiProcessorBlock[ProcessorNumber] = Pcr->Prcb; + + /* Start us out at PASSIVE_LEVEL */ + Pcr->Irql = PASSIVE_LEVEL; + + /* Set the stacks */ + Pcr->PanicStack = PanicStack; + Pcr->InterruptStack = InterruptStack; + + /* Setup the processor set */ + Pcr->PrcbData.MultiThreadProcessorSet = Pcr->PrcbData.SetMember; + + /* Copy cache information from the loader block */ + Pcr->FirstLevelDcacheSize = KeLoaderBlock->u.Arm.FirstLevelDcacheSize; + Pcr->SecondLevelDcacheSize = KeLoaderBlock->u.Arm.SecondLevelDcacheSize; + Pcr->FirstLevelIcacheSize = KeLoaderBlock->u.Arm.FirstLevelIcacheSize; + Pcr->SecondLevelIcacheSize = KeLoaderBlock->u.Arm.SecondLevelIcacheSize; + Pcr->FirstLevelDcacheFillSize = KeLoaderBlock->u.Arm.FirstLevelDcacheFillSize; + Pcr->SecondLevelDcacheFillSize = KeLoaderBlock->u.Arm.SecondLevelDcacheFillSize; + Pcr->FirstLevelIcacheFillSize = KeLoaderBlock->u.Arm.FirstLevelIcacheFillSize; + Pcr->SecondLevelIcacheFillSize = KeLoaderBlock->u.Arm.SecondLevelIcacheFillSize; + + /* Set global d-cache fill and alignment values */ if (!Pcr->SecondLevelDcacheSize) { - // - // Use the first level - // + /* Use the first level */ Pcr->DcacheFillSize = Pcr->FirstLevelDcacheSize; } else { - // - // Use the second level - // + /* Use the second level */ Pcr->DcacheFillSize = Pcr->SecondLevelDcacheSize; } - // - // Set the alignment - // + /* Set the alignment */ Pcr->DcacheAlignment = Pcr->DcacheFillSize - 1; - // - // Set global i-cache fill and alignment values - // + /* Set global i-cache fill and alignment values */ if (!Pcr->SecondLevelIcacheSize) { - // - // Use the first level - // + /* Use the first level */ Pcr->IcacheFillSize = Pcr->FirstLevelIcacheSize; } else { - // - // Use the second level - // + /* Use the second level */ Pcr->IcacheFillSize = Pcr->SecondLevelIcacheSize; } - // - // Set the alignment - // + /* Set the alignment */ Pcr->IcacheAlignment = Pcr->IcacheFillSize - 1; - // - // Now sweep caches - // + /* Set processor information */ + Pcr->ProcessorId = KeArmIdCodeRegisterGet().AsUlong; + + /* Set all interrupt routines to unexpected interrupts as well */ + for (i = 0; i < MAXIMUM_VECTOR; i++) + { + /* Point to the same template */ + Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode; + } + + /* Set default stall factor */ + Pcr->StallScaleFactor = 50; + + /* Setup software interrupts */ + Pcr->InterruptRoutine[PASSIVE_LEVEL] = KiPassiveRelease; + Pcr->InterruptRoutine[APC_LEVEL] = KiApcInterrupt; + Pcr->InterruptRoutine[DISPATCH_LEVEL] = KiDispatchInterrupt; + Pcr->ReservedVectors = (1 << PASSIVE_LEVEL) | + (1 << APC_LEVEL) | + (1 << DISPATCH_LEVEL) | + (1 << IPI_LEVEL); +} + +VOID +KiInitializeMachineType(VOID) +{ + /* Detect ARM version */ + KeIsArmV6 = KeArmIdCodeRegisterGet().Architecture >= 7; + + /* Set the number of TLB entries and ASIDs */ + KeNumberTbEntries = 64; + if (__ARMV6__) + { + /* 256 ASIDs on v6/v7 */ + KeNumberProcessIds = 256; + } + else + { + /* The TLB is VIVT on v4/v5 */ + KeNumberProcessIds = 0; + } +} + +VOID +KiInitializeSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG Cpu; + PKTHREAD InitialThread; + PKPROCESS InitialProcess; + ARM_CONTROL_REGISTER ControlRegister; + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + PKTHREAD Thread; + + /* Flush the TLB */ + KeFlushTb(); + + /* Save the loader block and get the current CPU */ + KeLoaderBlock = LoaderBlock; + Cpu = KeNumberProcessors; + + /* Save the initial thread and process */ + InitialThread = (PKTHREAD)LoaderBlock->Thread; + InitialProcess = (PKPROCESS)LoaderBlock->Process; + + /* Clean the APC List Head */ + InitializeListHead(&InitialThread->ApcState.ApcListHead[KernelMode]); + + /* Initialize the machine type */ + KiInitializeMachineType(); + + /* Skip initial setup if this isn't the Boot CPU */ + if (Cpu) goto AppCpuInit; + + /* Initialize the PCR */ + RtlZeroMemory(Pcr, PAGE_SIZE); + KiInitializePcr(Cpu, + Pcr, + InitialThread, + (PVOID)LoaderBlock->u.Arm.PanicStack, + (PVOID)LoaderBlock->u.Arm.InterruptStack); + + /* Now sweep caches */ HalSweepIcache(); HalSweepDcache(); - // - // Set PCR version - // - Pcr->MinorVersion = PCR_MINOR_VERSION; - Pcr->MajorVersion = PCR_MAJOR_VERSION; + /* Set us as the current process */ + InitialThread->ApcState.Process = InitialProcess; - // - // Set boot PRCB - // - Pcr->Prcb = (PKPRCB)LoaderBlock->Prcb; +AppCpuInit: + /* Setup CPU-related fields */ + Pcr->Number = Cpu; + Pcr->SetMember = 1 << Cpu; + Pcr->SetMemberCopy = 1 << Cpu; + Pcr->PrcbData.SetMember = 1 << Cpu; - // - // Set the different stacks - // - Pcr->InitialStack = (PVOID)LoaderBlock->KernelStack; - Pcr->PanicStack = (PVOID)LoaderBlock->u.Arm.PanicStack; - Pcr->InterruptStack = (PVOID)LoaderBlock->u.Arm.InterruptStack; + /* Initialize the Processor with HAL */ + HalInitializeProcessor(Cpu, KeLoaderBlock); + + /* Set active processors */ + KeActiveProcessors |= Pcr->SetMember; + KeNumberProcessors++; + + /* Check if this is the boot CPU */ + if (!Cpu) + { + /* Initialize debugging system */ + KdInitSystem(0, KeLoaderBlock); + + /* Check for break-in */ + if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); + } + + /* Raise to HIGH_LEVEL */ + KfRaiseIrql(HIGH_LEVEL); - // - // Set the current thread - // - Pcr->CurrentThread = (PKTHREAD)LoaderBlock->Thread; - - // - // Set the current IRQL to high - // - Pcr->CurrentIrql = HIGH_LEVEL; - - // - // Set processor information - // - Pcr->ProcessorId = KeArmIdCodeRegisterGet().AsUlong; - Pcr->SystemReserved[0] = KeArmControlRegisterGet().AsUlong; - - // - // Set the exception address to high - // + /* Set the exception address to high */ ControlRegister = KeArmControlRegisterGet(); ControlRegister.HighVectors = TRUE; KeArmControlRegisterSet(ControlRegister); - // - // Setup the exception vector table - // + /* Setup the exception vector table */ RtlCopyMemory((PVOID)0xFFFF0000, &KiArmVectorTable, 14 * sizeof(PVOID)); - // - // Initialize the rest of the kernel now - // + /* Initialize the rest of the kernel now */ KiInitializeKernel((PKPROCESS)LoaderBlock->Process, (PKTHREAD)LoaderBlock->Thread, (PVOID)LoaderBlock->KernelStack, - (PKPRCB)LoaderBlock->Prcb, + Pcr->Prcb, Pcr->Prcb->Number, - LoaderBlock); - - - // - // Jump to idle loop - // + KeLoaderBlock); + + /* Set the priority of this thread to 0 */ + Thread = KeGetCurrentThread(); + Thread->Priority = 0; + + /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */ + _enable(); + KfLowerIrql(DISPATCH_LEVEL); + + /* Set the right wait IRQL */ + Thread->WaitIrql = DISPATCH_LEVEL; + + /* Jump into the idle loop */ KiIdleLoop(); } + +ULONG +DbgPrintEarly(const char *fmt, ...) +{ + va_list args; + unsigned int i; + char Buffer[1024]; + PCHAR String = Buffer; + + va_start(args, fmt); + i = vsprintf(Buffer, fmt, args); + va_end(args); + + /* Output the message */ + while (*String != 0) + { + if (*String == '\n') + { + KdPortPutByteEx(NULL, '\r'); + } + KdPortPutByteEx(NULL, *String); + String++; + } + + return STATUS_SUCCESS; +} From 9a43c209d423dec04478715f856b6c671072104c Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:12:27 +0000 Subject: [PATCH 34/97] [NTOS]: All calls to DbgPrint will go to DbgPrintEarly for now. [NTOS]: More header fixes to match new definitions. svn path=/trunk/; revision=45514 --- reactos/ntoskrnl/include/internal/arm/ke.h | 9 +-------- reactos/ntoskrnl/include/internal/arm/mm.h | 2 ++ reactos/ntoskrnl/include/precomp.h | 5 +++++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h index 964b63b7162..7bd1c6e161e 100644 --- a/reactos/ntoskrnl/include/internal/arm/ke.h +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -54,7 +54,7 @@ // All architectures but x86 have it in the PRCB's KeContextSwitches // #define KeGetContextSwitches(Prcb) \ - Prcb->KeContextSwitches + CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches // // Returns the Interrupt State from a Trap Frame. @@ -107,13 +107,6 @@ KiApcInterrupt( #include "mm.h" -VOID -KeFillFixedEntryTb( - IN ARM_PTE Pte, - IN PVOID Virtual, - IN ULONG Index -); - VOID KeFlushTb( VOID diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index f318d9a0fd9..4266f09c40e 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -27,6 +27,7 @@ #define PDE_BASE 0xC0400000 #define HYPER_SPACE 0xC0404000 +#if 0 typedef struct _HARDWARE_PDE_ARMV6 { ULONG Valid:1; // Only for small pages @@ -77,6 +78,7 @@ typedef struct _HARDWARE_PTE_ARMV6 C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG)); +#endif /* For FreeLDR */ typedef struct _PAGE_TABLE_ARM diff --git a/reactos/ntoskrnl/include/precomp.h b/reactos/ntoskrnl/include/precomp.h index 8974e9b526e..8948bae44f0 100644 --- a/reactos/ntoskrnl/include/precomp.h +++ b/reactos/ntoskrnl/include/precomp.h @@ -8,6 +8,11 @@ /* INCLUDES ******************************************************************/ +/* ARM Bringup Hack */ +#ifdef _M_ARM +#define DbgPrint DbgPrintEarly +#endif + /* Version Data */ #undef __MSVCRT__ #include From 92f6dfd7d4b1327a4daa77ed2cab0a0945f96680 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:14:20 +0000 Subject: [PATCH 35/97] [NTOS]: Tabula rasa (clean slate) on the old-MM page routines for ARM. Get rid of all of them for now. [NTOS]: Implement MmInitGlobalKernelPageDirectory as the first ARM page function in the new file. That's it for the kernel. svn path=/trunk/; revision=45515 --- reactos/ntoskrnl/mm/arm/page.c | 285 +++++++++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 2 +- 2 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 reactos/ntoskrnl/mm/arm/page.c diff --git a/reactos/ntoskrnl/mm/arm/page.c b/reactos/ntoskrnl/mm/arm/page.c new file mode 100644 index 00000000000..30969fd5c87 --- /dev/null +++ b/reactos/ntoskrnl/mm/arm/page.c @@ -0,0 +1,285 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/arm/page.c + * PURPOSE: Old-school Page Management + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +ULONG MmGlobalKernelPageDirectory[4096]; +//MMPTE MiArmTemplatePte, MiArmTemplatePde; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MiFlushTlb(IN PMMPTE PointerPte, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +BOOLEAN +NTAPI +MmCreateProcessAddressSpace(IN ULONG MinWs, + IN PEPROCESS Process, + IN PULONG DirectoryTableBase) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +VOID +NTAPI +MmUpdatePageDir(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Size) +{ + /* Nothing to do */ + return; +} + +NTSTATUS +NTAPI +Mmi386ReleaseMmInfo(IN PEPROCESS Process) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +NTSTATUS +NTAPI +MmInitializeHandBuiltProcess(IN PEPROCESS Process, + IN PULONG DirectoryTableBase) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +PULONG +NTAPI +MmGetPageDirectory(VOID) +{ + /* Return the TTB */ + return (PULONG)KeArmTranslationTableRegisterGet().AsUlong; +} + +VOID +NTAPI +MmDisableVirtualMapping(IN PEPROCESS Process, + IN PVOID Address, + OUT PBOOLEAN WasDirty, + OUT PPFN_TYPE Page) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmEnableVirtualMapping(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +NTSTATUS +NTAPI +MmCreateVirtualMappingUnsafe(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Protection, + IN PPFN_TYPE Pages, + IN ULONG PageCount) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmCreateVirtualMapping(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Protection, + IN PPFN_TYPE Pages, + IN ULONG PageCount) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +VOID +NTAPI +MmRawDeleteVirtualMapping(IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmDeleteVirtualMapping(IN PEPROCESS Process, + IN PVOID Address, + IN BOOLEAN FreePage, + OUT PBOOLEAN WasDirty, + OUT PPFN_TYPE Page) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmDeletePageFileMapping(IN PEPROCESS Process, + IN PVOID Address, + IN SWAPENTRY *SwapEntry) +{ + UNIMPLEMENTED; + while (TRUE); +} + +NTSTATUS +NTAPI +MmCreatePageFileMapping(IN PEPROCESS Process, + IN PVOID Address, + IN SWAPENTRY SwapEntry) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +PFN_TYPE +NTAPI +MmGetPfnForProcess(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +BOOLEAN +NTAPI +MmIsDirtyPage(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +VOID +NTAPI +MmSetCleanPage(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmSetDirtyPage(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +BOOLEAN +NTAPI +MmIsPagePresent(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +BOOLEAN +NTAPI +MmIsPageSwapEntry(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +ULONG +NTAPI +MmGetPageProtect(IN PEPROCESS Process, + IN PVOID Address) +{ + /* We don't enforce any protection on the pages -- they are all RWX */ + return PAGE_READWRITE; +} + +VOID +NTAPI +MmSetPageProtect(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Protection) +{ + /* We don't enforce any protection on the pages -- they are all RWX */ + return; +} + +VOID +NTAPI +MmInitGlobalKernelPageDirectory(VOID) +{ + ULONG i; + PULONG CurrentPageDirectory = (PULONG)PDE_BASE; + extern MMPTE HyperTemplatePte; + + /* Setup template */ + HyperTemplatePte.u.Hard.Valid = HyperTemplatePte.u.Hard.Access = 1; + + /* Loop the 2GB of address space which belong to the kernel */ + for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++) + { + /* Check if we have an entry for this already */ + if ((i != MiGetPdeOffset(PTE_BASE)) && + (i != MiGetPdeOffset(HYPER_SPACE)) && + (!MmGlobalKernelPageDirectory[i]) && + (CurrentPageDirectory[i])) + { + /* We don't, link it in our global page directory */ + MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; + } + } +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +PHYSICAL_ADDRESS +NTAPI +MmGetPhysicalAddress(IN PVOID Address) +{ + PHYSICAL_ADDRESS PhysicalAddress; + PhysicalAddress.QuadPart = 0; + + UNIMPLEMENTED; + while (TRUE); + + return PhysicalAddress; +} diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 1c6a6da7d53..2a308d433b5 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -365,7 +365,7 @@ - stubs.c + page.c From f44cf3f7025b4ebbfcf51df77bb1c3cb2b98a433 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:14:58 +0000 Subject: [PATCH 36/97] [NDK]: Use new ARMv6 PTE structures. svn path=/trunk/; revision=45516 --- reactos/include/ndk/arm/mmtypes.h | 181 +++++++++--------------------- 1 file changed, 56 insertions(+), 125 deletions(-) diff --git a/reactos/include/ndk/arm/mmtypes.h b/reactos/include/ndk/arm/mmtypes.h index 98755647fc6..45c5de17e26 100644 --- a/reactos/include/ndk/arm/mmtypes.h +++ b/reactos/include/ndk/arm/mmtypes.h @@ -47,90 +47,56 @@ C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE); // // Page Table Entry Definitions // -typedef struct _HARDWARE_PTE_ARM +typedef struct _HARDWARE_PDE_ARMV6 { - union - { - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Ignored:2; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored1:1; - ULONG BaseAddress:22; - } Coarse; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored:1; - ULONG Access:2; - ULONG Ignored1:8; - ULONG BaseAddress:12; - } Section; - struct - { - ULONG Type:2; - ULONG Reserved:3; - ULONG Domain:4; - ULONG Ignored:3; - ULONG BaseAddress:20; - } Fine; - } L1; - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG Ignored:4; - ULONG BaseAddress:16; - } Large; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG BaseAddress:20; - } Small; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Ignored:4; - ULONG BaseAddress:22; - } Tiny; - } L2; - ULONG AsUlong; - }; -} HARDWARE_PTE_ARM, *PHARDWARE_PTE_ARM; + ULONG Valid:1; // Only for small pages + ULONG LargePage:1; // Note, if large then Valid = 0 + ULONG Buffered:1; + ULONG Cached:1; + ULONG NoExecute:1; + ULONG Domain:4; + ULONG Ecc:1; + ULONG PageFrameNumber:22; +} HARDWARE_PDE_ARMV6, *PHARDWARE_PDE_ARMV6; + +typedef struct _HARDWARE_LARGE_PTE_ARMV6 +{ + ULONG Valid:1; // Only for small pages + ULONG LargePage:1; // Note, if large then Valid = 0 + ULONG Buffered:1; + ULONG Cached:1; + ULONG NoExecute:1; + ULONG Domain:4; + ULONG Ecc:1; + ULONG Accessed:1; + ULONG Owner:1; + ULONG CacheAttributes:3; + ULONG ReadOnly:1; + ULONG Shared:1; + ULONG NonGlobal:1; + ULONG SuperLagePage:1; + ULONG Reserved:1; + ULONG PageFrameNumber:12; +} HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6; + +typedef struct _HARDWARE_PTE_ARMV6 +{ + ULONG NoExecute:1; + ULONG Valid:1; + ULONG Buffered:1; + ULONG Cached:1; + ULONG Accessed:1; + ULONG Owner:1; + ULONG CacheAttributes:3; + ULONG ReadOnly:1; + ULONG Shared:1; + ULONG NonGlobal:1; + ULONG PageFrameNumber:20; +} HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6; + +C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG)); typedef struct _MMPTE_SOFTWARE { @@ -185,53 +151,18 @@ typedef struct _MMPTE_LIST ULONG filler1:1; } MMPTE_LIST; -typedef struct _MMPDE_HARDWARE // FIXFIX: Find a way to make this more portable -{ - union - { - union - { - struct - { - ULONG Valid:1; - ULONG Section:1; - ULONG Sbz:3; - ULONG Domain:4; - ULONG EccEnabled:1; - ULONG PageFrameNumber:22; - } Coarse; - struct - { - ULONG Coarse:1; - ULONG Valid:1; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Reserved:1; - ULONG Domain:4; - ULONG EccEnabled:1; - ULONG Access:2; - ULONG ExtendedAccess:3; - ULONG Sbz:3; - ULONG SuperSection:1; - ULONG Sbz1:1; - ULONG PageFrameNumber:12; - } Section; - ULONG AsUlong; - } Hard; - } u; -} MMPDE_HARDWARE, *PMMPDE_HARDWARE; - typedef union _MMPTE_HARDWARE { struct { - ULONG ExecuteNever:1; + ULONG NoExecute:1; ULONG Valid:1; ULONG Buffered:1; ULONG Cached:1; - ULONG Access:2; - ULONG TypeExtension:3; - ULONG ExtendedAccess:1; + ULONG Access:1; + ULONG Owner:1; + ULONG CacheAttributes:3; + ULONG ReadOnly:1; ULONG Shared:1; ULONG NonGlobal:1; ULONG PageFrameNumber:20; @@ -242,7 +173,7 @@ typedef union _MMPTE_HARDWARE // // Use the right PTE structure // -#define HARDWARE_PTE HARDWARE_PTE_ARM -#define PHARDWARE_PTE PHARDWARE_PTE_ARM +#define HARDWARE_PTE HARDWARE_PTE_ARMV6 +#define PHARDWARE_PTE PHARDWARE_PTE_ARMV6 #endif From 62cb7586f3ac1ff4b8176cabccce7ee20e37009a Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:22:08 +0000 Subject: [PATCH 37/97] [FREELDR]: The hack to set pages from 0x100 to 0x1FF as busy so that the heap allocator wouldn't use them always restored the pages back to Free (since they usually were free on x86). However, if the pages were already being used in the first place, this made them appear free and corrupted existing memory. Fixed the hack so that it restores the previous state of the memory pages. svn path=/trunk/; revision=45517 --- reactos/boot/freeldr/freeldr/mm/meminit.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c index e3e62c802c2..f59a43f7b54 100644 --- a/reactos/boot/freeldr/freeldr/mm/meminit.c +++ b/reactos/boot/freeldr/freeldr/mm/meminit.c @@ -102,8 +102,11 @@ VOID MmInitializeHeap(PVOID PageLookupTable) { ULONG PagesNeeded; ULONG HeapStart; - + MEMORY_TYPE Type; + PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; + // HACK: Make it so it doesn't overlap kernel space + Type = RealPageLookupTable[0x100].PageAllocated; MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderSystemCode); // Find contigious memory block for HEAP:STACK @@ -111,7 +114,7 @@ VOID MmInitializeHeap(PVOID PageLookupTable) HeapStart = MmFindAvailablePages(PageLookupTable, TotalPagesInLookupTable, PagesNeeded, FALSE); // Unapply the hack - MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderFree); + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, Type); if (HeapStart == 0) { From 8e6d54f4b80d57426a4ae65edea7de0b31837b00 Mon Sep 17 00:00:00 2001 From: evb Date: Tue, 9 Feb 2010 02:26:28 +0000 Subject: [PATCH 38/97] - New ARM HAL after 2 nights in the company of a madman. - Many fixes, more implemented routines, support for ARMv7. - Some Linux code, marked as GPL, from ARM Ltd in cache.s. All OS use this code. svn path=/trunk/; revision=45518 --- reactos/hal/hal.pspec | 2 +- reactos/hal/hal.rbuild | 9 +- reactos/hal/halarm/directory.rbuild | 15 +- reactos/hal/halarm/generic/beep.c | 26 + reactos/hal/halarm/generic/bus.c | 151 ++ reactos/hal/halarm/generic/cache.S | 57 + reactos/hal/halarm/generic/display.c | 64 + reactos/hal/halarm/generic/dma.c | 188 ++ reactos/hal/halarm/generic/drive.c | 75 + reactos/hal/halarm/generic/fmutex.c | 46 + reactos/hal/halarm/generic/generic.rbuild | 9 - reactos/hal/halarm/generic/hal.c | 1540 ----------------- reactos/hal/halarm/generic/halinit.c | 182 ++ reactos/hal/halarm/generic/misc.c | 47 + reactos/hal/halarm/generic/pic.c | 342 ++++ reactos/hal/halarm/generic/portio.c | 129 ++ reactos/hal/halarm/generic/processor.c | 141 ++ reactos/hal/halarm/generic/profil.c | 50 + reactos/hal/halarm/generic/reboot.c | 43 + reactos/hal/halarm/generic/rtc.c | 79 + reactos/hal/halarm/generic/spinlock.c | 202 +++ reactos/hal/halarm/generic/sysinfo.c | 40 + reactos/hal/halarm/generic/timer.c | 149 ++ reactos/hal/halarm/generic/usage.c | 76 + reactos/hal/halarm/hal.rbuild | 18 + reactos/hal/halarm/hal_generic.rbuild | 33 + reactos/hal/halarm/include/hal.h | 3 + reactos/hal/halarm/include/halp.h | 45 + reactos/hal/halarm/up/halinit_up.c | 32 - reactos/hal/halarm/versa/halinit_up.c | 31 + reactos/hal/halarm/{up => versa}/halup.rbuild | 13 +- reactos/hal/halarm/{up => versa}/halup.rc | 0 32 files changed, 2240 insertions(+), 1597 deletions(-) create mode 100644 reactos/hal/halarm/generic/beep.c create mode 100644 reactos/hal/halarm/generic/bus.c create mode 100644 reactos/hal/halarm/generic/cache.S create mode 100644 reactos/hal/halarm/generic/display.c create mode 100644 reactos/hal/halarm/generic/dma.c create mode 100644 reactos/hal/halarm/generic/drive.c create mode 100644 reactos/hal/halarm/generic/fmutex.c delete mode 100644 reactos/hal/halarm/generic/generic.rbuild delete mode 100644 reactos/hal/halarm/generic/hal.c create mode 100644 reactos/hal/halarm/generic/halinit.c create mode 100644 reactos/hal/halarm/generic/misc.c create mode 100644 reactos/hal/halarm/generic/pic.c create mode 100644 reactos/hal/halarm/generic/portio.c create mode 100644 reactos/hal/halarm/generic/processor.c create mode 100644 reactos/hal/halarm/generic/profil.c create mode 100644 reactos/hal/halarm/generic/reboot.c create mode 100644 reactos/hal/halarm/generic/rtc.c create mode 100644 reactos/hal/halarm/generic/spinlock.c create mode 100644 reactos/hal/halarm/generic/sysinfo.c create mode 100644 reactos/hal/halarm/generic/timer.c create mode 100644 reactos/hal/halarm/generic/usage.c create mode 100644 reactos/hal/halarm/hal.rbuild create mode 100644 reactos/hal/halarm/hal_generic.rbuild delete mode 100644 reactos/hal/halarm/up/halinit_up.c create mode 100644 reactos/hal/halarm/versa/halinit_up.c rename reactos/hal/halarm/{up => versa}/halup.rbuild (59%) rename reactos/hal/halarm/{up => versa}/halup.rc (100%) diff --git a/reactos/hal/hal.pspec b/reactos/hal/hal.pspec index 786372d9e3d..74193047c28 100644 --- a/reactos/hal/hal.pspec +++ b/reactos/hal/hal.pspec @@ -46,7 +46,7 @@ @ stdcall HalGetEnvironmentVariable(str long str) @ fastcall -arch=arm HalGetInterruptSource() @ stdcall HalGetInterruptVector(long long long long ptr ptr) -@ stdcall HalHandleNMI(ptr) +@ stdcall -arch=i386 HalHandleNMI(ptr) @ stdcall HalInitSystem(long ptr) @ stdcall HalInitializeProcessor(long ptr) @ stdcall HalMakeBeep(long) diff --git a/reactos/hal/hal.rbuild b/reactos/hal/hal.rbuild index a7cf4bb0274..b846b042bf5 100644 --- a/reactos/hal/hal.rbuild +++ b/reactos/hal/hal.rbuild @@ -1,9 +1,12 @@ - - - + + + + + + diff --git a/reactos/hal/halarm/directory.rbuild b/reactos/hal/halarm/directory.rbuild index 1e0c730ba32..72cfe7e742c 100644 --- a/reactos/hal/halarm/directory.rbuild +++ b/reactos/hal/halarm/directory.rbuild @@ -1,10 +1,11 @@ - + - - - - - - + + + + + + + diff --git a/reactos/hal/halarm/generic/beep.c b/reactos/hal/halarm/generic/beep.c new file mode 100644 index 00000000000..bd274129e9f --- /dev/null +++ b/reactos/hal/halarm/generic/beep.c @@ -0,0 +1,26 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/beep.c + * PURPOSE: Speaker support (beeping) + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalMakeBeep(IN ULONG Frequency) +{ + UNIMPLEMENTED; + return FALSE; +} diff --git a/reactos/hal/halarm/generic/bus.c b/reactos/hal/halarm/generic/bus.c new file mode 100644 index 00000000000..aeae3cbacb1 --- /dev/null +++ b/reactos/hal/halarm/generic/bus.c @@ -0,0 +1,151 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/bus.c + * PURPOSE: Bus Support Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* PRIVATE FUNCTIONS **********************************************************/ + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +HalAdjustResourceList(IN PIO_RESOURCE_REQUIREMENTS_LIST *ResourceList) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +HalAssignSlotResources(IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalGetBusData(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalSetBusData(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/cache.S b/reactos/hal/halarm/generic/cache.S new file mode 100644 index 00000000000..c4325a53768 --- /dev/null +++ b/reactos/hal/halarm/generic/cache.S @@ -0,0 +1,57 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: GPL - See COPYING in the top level directory + * FILE: hal/halarm/generic/cache.s + * PURPOSE: Implements cache clean, invalidate routines for ARM machines + * PROGRAMMERS: Copyright (C) 2005 ARM Ltd. + */ + + .title "ARM HAL Cache Routines" + .include "ntoskrnl/include/internal/arm/kxarm.h" + .include "ntoskrnl/include/internal/arm/ksarm.h" + + NESTED_ENTRY v7_flush_dcache_all + PROLOG_END v7_flush_dcache_all + + mrc p15, 1, r0, c0, c0, 1 // read clidr + ands r3, r0, #0x7000000 // extract loc from clidr + mov r3, r3, lsr #23 // left align loc bit field + beq finished // if loc is 0, then no need to clean + mov r10, #0 // start clean at cache level 0 +loop1: + add r2, r10, r10, lsr #1 // work out 3x current cache level + mov r1, r0, lsr r2 // extract cache type bits from clidr + and r1, r1, #7 // mask of the bits for current cache only + cmp r1, #2 // see what cache we have at this level + blt skip // skip if no cache, or just i-cache + mcr p15, 2, r10, c0, c0, 0 // select current cache level in cssr + isb // isb to sych the new cssr&csidr + mrc p15, 1, r1, c0, c0, 0 // read the new csidr + and r2, r1, #7 // extract the length of the cache lines + add r2, r2, #4 // add 4 (line length offset) + ldr r4, =0x3ff + ands r4, r4, r1, lsr #3 // find maximum number on the way size + clz r5, r4 // find bit position of way size increment + ldr r7, =0x7fff + ands r7, r7, r1, lsr #13 // extract max number of the index size +loop2: + mov r9, r4 // create working copy of max way size +loop3: + orr r11, r10, r9, lsl r5 // factor way and cache number into r11 + orr r11, r11, r7, lsl r2 // factor index number into r11 + mcr p15, 0, r11, c7, c14, 2 // clean & invalidate by set/way + subs r9, r9, #1 // decrement the way + bge loop3 + subs r7, r7, #1 // decrement the index + bge loop2 +skip: + add r10, r10, #2 // increment cache number + cmp r3, r10 + bgt loop1 +finished: + mov r10, #0 // swith back to cache level 0 + mcr p15, 2, r10, c0, c0, 0 // select current cache level in cssr + isb + mov pc, lr + + ENTRY_END v7_flush_dcache_all diff --git a/reactos/hal/halarm/generic/display.c b/reactos/hal/halarm/generic/display.c new file mode 100644 index 00000000000..f21ca6dccfd --- /dev/null +++ b/reactos/hal/halarm/generic/display.c @@ -0,0 +1,64 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/display.c + * PURPOSE: Screen Display Routines, now useless since NT 5.1+ + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +#include +#define NDEBUG +#include +#include + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters) +{ + /* Stub since Windows XP implemented Inbv */ + return; +} + +/* + * @implemented + */ +VOID +NTAPI +HalDisplayString(IN PCH String) +{ + /* Call the Inbv driver */ + InbvDisplayString(String); +} + +/* + * @implemented + */ +VOID +NTAPI +HalQueryDisplayParameters(OUT PULONG DispSizeX, + OUT PULONG DispSizeY, + OUT PULONG CursorPosX, + OUT PULONG CursorPosY) +{ + /* Stub since Windows XP implemented Inbv */ + return; +} + +/* + * @implemented + */ +VOID +NTAPI +HalSetDisplayParameters(IN ULONG CursorPosX, + IN ULONG CursorPosY) +{ + /* Stub since Windows XP implemented Inbv */ + return; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/dma.c b/reactos/hal/halarm/generic/dma.c new file mode 100644 index 00000000000..3070f25e7fb --- /dev/null +++ b/reactos/hal/halarm/generic/dma.c @@ -0,0 +1,188 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/dma.c + * PURPOSE: DMA Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +/* + * @unimplemented + */ +PADAPTER_OBJECT +NTAPI +HalGetAdapter(IN PDEVICE_DESCRIPTION DeviceDescription, + OUT PULONG NumberOfMapRegisters) +{ + UNIMPLEMENTED; + while (TRUE); + return NULL; +} + +/* + * @unimplemented + */ +VOID +NTAPI +HalPutDmaAdapter(IN PADAPTER_OBJECT AdapterObject) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +PVOID +NTAPI +HalAllocateCommonBuffer(IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled) +{ + UNIMPLEMENTED; + while (TRUE); + return NULL; +} + +/* + * @unimplemented + */ +VOID +NTAPI +HalFreeCommonBuffer(IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalReadDmaCounter(IN PADAPTER_OBJECT AdapterObject) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +HalAllocateAdapterChannel(IN PADAPTER_OBJECT AdapterObject, + IN PWAIT_CONTEXT_BLOCK WaitContextBlock, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +/* + * @unimplemented + */ +VOID +NTAPI +IoFreeAdapterChannel(IN PADAPTER_OBJECT AdapterObject) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +VOID +NTAPI +IoFreeMapRegisters(IN PADAPTER_OBJECT AdapterObject, + IN PVOID MapRegisterBase, + IN ULONG NumberOfMapRegisters) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +IoFlushAdapterBuffers(IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN ULONG Length, + IN BOOLEAN WriteToDevice) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @unimplemented + */ +PHYSICAL_ADDRESS +NTAPI +IoMapTransfer(IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN OUT PULONG Length, + IN BOOLEAN WriteToDevice) +{ + PHYSICAL_ADDRESS Address; + + UNIMPLEMENTED; + while (TRUE); + + Address.QuadPart = 0; + return Address; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +HalFlushCommonBuffer(IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @unimplemented + */ +PVOID +NTAPI +HalAllocateCrashDumpRegisters(IN PADAPTER_OBJECT AdapterObject, + IN OUT PULONG NumberOfMapRegisters) +{ + UNIMPLEMENTED; + while (TRUE); + return NULL; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/drive.c b/reactos/hal/halarm/generic/drive.c new file mode 100644 index 00000000000..b1140bc3ce8 --- /dev/null +++ b/reactos/hal/halarm/generic/drive.c @@ -0,0 +1,75 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/drive.c + * PURPOSE: HAL Stubs for Disk I/O Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString) +{ + /* Call the kernel */ + IoAssignDriveLetters(LoaderBlock, + NtDeviceName, + NtSystemPath, + NtSystemPathString); +} + +NTSTATUS +NTAPI +HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer) +{ + /* Call the kernel */ + return IoReadPartitionTable(DeviceObject, + SectorSize, + ReturnRecognizedPartitions, + PartitionBuffer); +} + +NTSTATUS +NTAPI +HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer) +{ + /* Call the kernel */ + return IoWritePartitionTable(DeviceObject, + SectorSize, + SectorsPerTrack, + NumberOfHeads, + PartitionBuffer); +} + +NTSTATUS +NTAPI +HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType) +{ + /* Call the kernel */ + return IoSetPartitionInformation(DeviceObject, + SectorSize, + PartitionNumber, + PartitionType); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/fmutex.c b/reactos/hal/halarm/generic/fmutex.c new file mode 100644 index 00000000000..1187288d7da --- /dev/null +++ b/reactos/hal/halarm/generic/fmutex.c @@ -0,0 +1,46 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/fmutex.c + * PURPOSE: Fast Mutex Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef ExAcquireFastMutex +#undef ExReleaseFastMutex +#undef ExTryToAcquireFastMutex + +/* FUNCTIONS ******************************************************************/ + +VOID +FASTCALL +ExAcquireFastMutex(IN PFAST_MUTEX FastMutex) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +FASTCALL +ExReleaseFastMutex(IN PFAST_MUTEX FastMutex) +{ + UNIMPLEMENTED; + while (TRUE); +} + +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex(IN PFAST_MUTEX FastMutex) +{ + UNIMPLEMENTED; + while (TRUE); + return TRUE; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/generic.rbuild b/reactos/hal/halarm/generic/generic.rbuild deleted file mode 100644 index 5f4ec64f7dc..00000000000 --- a/reactos/hal/halarm/generic/generic.rbuild +++ /dev/null @@ -1,9 +0,0 @@ - - - - ../include - include - - hal.c - ../include/hal.h - diff --git a/reactos/hal/halarm/generic/hal.c b/reactos/hal/halarm/generic/hal.c deleted file mode 100644 index cd89ac19f21..00000000000 --- a/reactos/hal/halarm/generic/hal.c +++ /dev/null @@ -1,1540 +0,0 @@ -/* - * PROJECT: ReactOS HAL - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: hal/halarm/generic/hal.c - * PURPOSE: Hardware Abstraction Layer - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include -#include - -#undef ExAcquireFastMutex -#undef ExReleaseFastMutex -#undef ExTryToAcquireFastMutex -#undef KeAcquireSpinLock -#undef KeLowerIrql -#undef KeRaiseIrql -#undef KeReleaseSpinLock - -#define READ_REGISTER_ULONG(r) (*((volatile ULONG * const)(r))) -#define WRITE_REGISTER_ULONG(r, v) (*((volatile ULONG *)(r)) = (v)) - -VOID -FASTCALL -KeUpdateSystemTime( - IN PKTRAP_FRAME TrapFrame, - IN ULONG Increment, - IN KIRQL OldIrql -); - -/* DATA **********************************************************************/ - -ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; -PUCHAR KdComPortInUse; - -ULONG HalpIrqlTable[HIGH_LEVEL + 1] = -{ - 0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL - 0xFFFFFFFD, // IRQL 1 APC_LEVEL - 0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL - 0xFFFFFFD9, // IRQL 3 - 0xFFFFFF99, // IRQL 4 - 0xFFFFFF19, // IRQL 5 - 0xFFFFFE19, // IRQL 6 - 0xFFFFFC19, // IRQL 7 - 0xFFFFF819, // IRQL 8 - 0xFFFFF019, // IRQL 9 - 0xFFFFE019, // IRQL 10 - 0xFFFFC019, // IRQL 11 - 0xFFFF8019, // IRQL 12 - 0xFFFF0019, // IRQL 13 - 0xFFFE0019, // IRQL 14 - 0xFFFC0019, // IRQL 15 - 0xFFF80019, // IRQL 16 - 0xFFF00019, // IRQL 17 - 0xFFE00019, // IRQL 18 - 0xFFC00019, // IRQL 19 - 0xFF800019, // IRQL 20 - 0xFF000019, // IRQL 21 - 0xFE000019, // IRQL 22 - 0xFC000019, // IRQL 23 - 0xF0000019, // IRQL 24 - 0x80000019, // IRQL 25 - 0x19, // IRQL 26 - 0x18, // IRQL 27 PROFILE_LEVEL - 0x10, // IRQL 28 CLOCK2_LEVEL - 0x00, // IRQL 29 IPI_LEVEL - 0x00, // IRQL 30 POWER_LEVEL - 0x00, // IRQL 31 HIGH_LEVEL -}; - -UCHAR HalpMaskTable[HIGH_LEVEL + 1] = -{ - PROFILE_LEVEL, // INT 0 WATCHDOG - APC_LEVEL, // INT 1 SOFTWARE INTERRUPT - DISPATCH_LEVEL,// INT 2 COMM RX - IPI_LEVEL, // INT 3 COMM TX - CLOCK2_LEVEL, // INT 4 TIMER 0 - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 26, - 26 -}; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -NTAPI -DriverEntry( - PDRIVER_OBJECT DriverObject, - PUNICODE_STRING RegistryPath) -{ - UNIMPLEMENTED; - - return STATUS_SUCCESS; -} - -/* -* @unimplemented -*/ -VOID -NTAPI -HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) -{ - UNIMPLEMENTED; - return; -} - -/* -* @unimplemented -*/ -VOID -NTAPI -HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) -{ - UNIMPLEMENTED; - return; -} - -/* -* @unimplemented -*/ -ULONG_PTR -NTAPI -HalSetProfileInterval(IN ULONG_PTR Interval) -{ - UNIMPLEMENTED; - return Interval; -} - -VOID -FASTCALL -ExAcquireFastMutex( - PFAST_MUTEX FastMutex) -{ - UNIMPLEMENTED; -} - - -VOID -FASTCALL -ExReleaseFastMutex( - PFAST_MUTEX FastMutex) -{ - UNIMPLEMENTED; -} - - -BOOLEAN FASTCALL -ExTryToAcquireFastMutex( - PFAST_MUTEX FastMutex) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -NTSTATUS -NTAPI -HalAdjustResourceList( - PCM_RESOURCE_LIST Resources) -{ - UNIMPLEMENTED; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -BOOLEAN -NTAPI -HalAllProcessorsStarted(VOID) -{ - /* Do nothing */ - return TRUE; -} - - -NTSTATUS -NTAPI -HalAllocateAdapterChannel( - PADAPTER_OBJECT AdapterObject, - PWAIT_CONTEXT_BLOCK WaitContextBlock, - ULONG NumberOfMapRegisters, - PDRIVER_CONTROL ExecutionRoutine) -{ - UNIMPLEMENTED; - - return STATUS_SUCCESS; -} - - -PVOID -NTAPI -HalAllocateCommonBuffer( - PADAPTER_OBJECT AdapterObject, - ULONG Length, - PPHYSICAL_ADDRESS LogicalAddress, - BOOLEAN CacheEnabled) -{ - UNIMPLEMENTED; - - return NULL; -} - - -PVOID -NTAPI -HalAllocateCrashDumpRegisters( - PADAPTER_OBJECT AdapterObject, - PULONG NumberOfMapRegisters) -{ - UNIMPLEMENTED; - return NULL; -} - - -NTSTATUS -NTAPI -HalAssignSlotResources( - PUNICODE_STRING RegistryPath, - PUNICODE_STRING DriverClassName, - PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT DeviceObject, - INTERFACE_TYPE BusType, - ULONG BusNumber, - ULONG SlotNumber, - PCM_RESOURCE_LIST *AllocatedResources) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -BOOLEAN -NTAPI -HalBeginSystemInterrupt(IN KIRQL Irql, - IN UCHAR Vector, - OUT PKIRQL OldIrql) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalCalibratePerformanceCounter( - volatile LONG *Count, - ULONGLONG NewCount) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -HalDisableSystemInterrupt(IN UCHAR Vector, - IN KIRQL Irql) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters) -{ - // - // Stub since Windows XP implemented Inbv - // - return; -} - -VOID -NTAPI -HalDisplayString(IN PCH String) -{ - // - // Call the Inbv driver - // - InbvDisplayString(String); -} - -VOID -NTAPI -HalQueryDisplayParameters(OUT PULONG DispSizeX, - OUT PULONG DispSizeY, - OUT PULONG CursorPosX, - OUT PULONG CursorPosY) -{ - // - // Stub since Windows XP implemented Inbv - // - return; -} - -VOID -NTAPI -HalSetDisplayParameters(IN ULONG CursorPosX, - IN ULONG CursorPosY) -{ - // - // Stub since Windows XP implemented Inbv - // - return; -} - -BOOLEAN -NTAPI -HalEnableSystemInterrupt(IN UCHAR Vector, - IN KIRQL Irql, - IN KINTERRUPT_MODE InterruptMode) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalEndSystemInterrupt(IN KIRQL OldIrql, - IN PKTRAP_FRAME TrapFrame) -{ - UNIMPLEMENTED; -} - - -BOOLEAN -NTAPI -HalFlushCommonBuffer( - ULONG Unknown1, - ULONG Unknown2, - ULONG Unknown3, - ULONG Unknown4, - ULONG Unknown5) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalFreeCommonBuffer( - PADAPTER_OBJECT AdapterObject, - ULONG Length, - PHYSICAL_ADDRESS LogicalAddress, - PVOID VirtualAddress, - BOOLEAN CacheEnabled) -{ - UNIMPLEMENTED; -} - - -PADAPTER_OBJECT -NTAPI -HalGetAdapter( - PDEVICE_DESCRIPTION DeviceDescription, - PULONG NumberOfMapRegisters) -{ - UNIMPLEMENTED; - - return (PADAPTER_OBJECT)NULL; -} - - -ULONG -NTAPI -HalGetBusData( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ULONG -NTAPI -HalGetBusDataByOffset( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Offset, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ARC_STATUS -NTAPI -HalGetEnvironmentVariable( - PCH Name, - USHORT ValueLength, - PCH Value) -{ - UNIMPLEMENTED; - - return ENOENT; -} - - -ULONG -NTAPI -HalGetInterruptVector( - INTERFACE_TYPE InterfaceType, - ULONG BusNumber, - ULONG BusInterruptLevel, - ULONG BusInterruptVector, - PKIRQL Irql, - PKAFFINITY Affinity) -{ - UNIMPLEMENTED; - - return 0; -} - - -VOID -NTAPI -HalHandleNMI( - PVOID NmiData) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PCHAR CommandLine; - - /* Make sure we have a loader block and command line */ - if ((LoaderBlock) && (LoaderBlock->LoadOptions)) - { - /* Read the command line */ - CommandLine = LoaderBlock->LoadOptions; - - /* Check for initial breakpoint */ - if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); - } -} - -ULONG -HalGetInterruptSource(VOID) -{ - ULONG InterruptStatus; - - // - // Get the interrupt status, and return the highest bit set - // - InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS); - return 31 - _clz(InterruptStatus); -} - -VOID -HalpClockInterrupt(VOID) -{ - // - // Clear the interrupt - // - ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL); - WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); - - // - // FIXME: Update HAL Perf counters - // - - // - // FIXME: Check if someone changed the clockrate - // - - // - // Call the kernel - // - KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame, - CLOCK2_LEVEL, - HalpCurrentTimeIncrement); - - // - // We're done - // -} - -VOID -HalpStallInterrupt(VOID) -{ - // - // Clear the interrupt - // - WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); -} - -VOID -HalpInitializeInterrupts(VOID) -{ - PKPCR Pcr = (PKPCR)KeGetPcr(); - ULONG ClockInterval; - SP804_CONTROL_REGISTER ControlRegister; - - // - // Fill out the IRQL mappings - // - RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable)); - RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask)); - - // - // Setup the clock and profile interrupt - // - Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt; - - // - // Configure the interval to 10ms - // (INTERVAL (10ms) * TIMCLKfreq (1MHz)) - // --------------------------------------- == 10^4 - // (TIMCLKENXdiv (1) * PRESCALEdiv (1)) - // - ClockInterval = 0x2710; - - // - // Configure the timer - // - ControlRegister.AsUlong = 0; - ControlRegister.Wide = TRUE; - ControlRegister.Periodic = TRUE; - ControlRegister.Interrupt = TRUE; - ControlRegister.Enabled = TRUE; - - // - // Enable the timer - // - WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval); - WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong); -} - -/* - * @implemented - */ -BOOLEAN -NTAPI -HalInitSystem(IN ULONG BootPhase, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PKPRCB Prcb = KeGetCurrentPrcb(); - - // - // Check the boot phase - // - if (!BootPhase) - { - // - // Get command-line parameters - // - HalpGetParameters(LoaderBlock); - -#if DBG - // - // Checked HAL requires checked kernel - // - if (!(Prcb->BuildType & PRCB_BUILD_DEBUG)) - { - // - // No match, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0); - } -#else - // - // Release build requires release HAL - // - if (Prcb->BuildType & PRCB_BUILD_DEBUG) - { - // - // No match, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); - } -#endif - -#ifdef CONFIG_SMP - // - // SMP HAL requires SMP kernel - // - if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) - { - // - // No match, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); - } -#endif - - // - // Validate the PRCB - // - if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) - { - // - // Validation failed, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0); - } - - // - // Setup time increments to 10ms and 1ms - // - HalpCurrentTimeIncrement = 100000; - HalpNextTimeIncrement = 100000; - HalpNextIntervalCount = 0; - KeSetTimeIncrement(100000, 10000); - - // - // Initialize interrupts - // - HalpInitializeInterrupts(); - } - else if (BootPhase == 1) - { - // - // Switch to real clock interrupt - // - PCR->InterruptRoutine[CLOCK2_LEVEL] = HalpClockInterrupt; - } - - // - // All done, return - // - return TRUE; -} - - -VOID -NTAPI -HalInitializeProcessor(IN ULONG ProcessorNumber, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - // - // Nothing to do - // - return; -} - - -BOOLEAN -NTAPI -HalMakeBeep( - ULONG Frequency) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalProcessorIdle(VOID) -{ - UNIMPLEMENTED; -} - - -#define RTC_DATA (PVOID)0xE00E8000 - -BOOLEAN -NTAPI -HalQueryRealTimeClock(IN PTIME_FIELDS Time) -{ - LARGE_INTEGER LargeTime; - ULONG Seconds; - - // - // Query the RTC value - // - Seconds = READ_REGISTER_ULONG(RTC_DATA); - - // - // Convert to time - // - RtlSecondsSince1970ToTime(Seconds, &LargeTime); - - // - // Convert to time-fields - // - RtlTimeToTimeFields(&LargeTime, Time); - return TRUE; -} - -ULONG -NTAPI -HalReadDmaCounter( - PADAPTER_OBJECT AdapterObject) -{ - UNIMPLEMENTED; - - return 0; -} - - -VOID -NTAPI -HalReportResourceUsage(VOID) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -HalRequestIpi( - ULONG Unknown) -{ - UNIMPLEMENTED; -} - - -VOID -FASTCALL -HalRequestSoftwareInterrupt(IN KIRQL Request) -{ - // - // Force a software interrupt - // - WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Request); -} - -VOID -FASTCALL -HalClearSoftwareInterrupt(IN KIRQL Request) -{ - // - // Clear a software interrupt - // - WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Request); -} - -VOID -NTAPI -HalReturnToFirmware( - FIRMWARE_REENTRY Action) -{ - UNIMPLEMENTED; -} - - -ULONG -NTAPI -HalSetBusData( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ULONG -NTAPI -HalSetBusDataByOffset( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Offset, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ARC_STATUS -NTAPI -HalSetEnvironmentVariable( - PCH Name, - PCH Value) -{ - UNIMPLEMENTED; - - return ESUCCESS; -} - - -BOOLEAN -NTAPI -HalSetRealTimeClock( - PTIME_FIELDS Time) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -ULONG -NTAPI -HalSetTimeIncrement( - ULONG Increment) -{ - UNIMPLEMENTED; - - return Increment; -} - - -BOOLEAN -NTAPI -HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PKPROCESSOR_STATE ProcessorState) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -UCHAR -FASTCALL -HalSystemVectorDispatchEntry(IN ULONG Vector, - OUT PKINTERRUPT_ROUTINE **FlatDispatch, - OUT PKINTERRUPT_ROUTINE *NoConnection) -{ - UNIMPLEMENTED; - - return 0; -} - - -BOOLEAN -NTAPI -HalTranslateBusAddress( - INTERFACE_TYPE InterfaceType, - ULONG BusNumber, - PHYSICAL_ADDRESS BusAddress, - PULONG AddressSpace, - PPHYSICAL_ADDRESS TranslatedAddress) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN PSTRING NtDeviceName, - OUT PUCHAR NtSystemPath, - OUT PSTRING NtSystemPathString) -{ - /* Call the kernel */ - IoAssignDriveLetters(LoaderBlock, - NtDeviceName, - NtSystemPath, - NtSystemPathString); -} - -NTSTATUS -NTAPI -HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer) -{ - /* Call the kernel */ - return IoReadPartitionTable(DeviceObject, - SectorSize, - ReturnRecognizedPartitions, - PartitionBuffer); -} - -NTSTATUS -NTAPI -HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer) -{ - /* Call the kernel */ - return IoWritePartitionTable(DeviceObject, - SectorSize, - SectorsPerTrack, - NumberOfHeads, - PartitionBuffer); -} - -NTSTATUS -NTAPI -HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType) -{ - /* Call the kernel */ - return IoSetPartitionInformation(DeviceObject, - SectorSize, - PartitionNumber, - PartitionType); -} - - -BOOLEAN -NTAPI -IoFlushAdapterBuffers( - PADAPTER_OBJECT AdapterObject, - PMDL Mdl, - PVOID MapRegisterBase, - PVOID CurrentVa, - ULONG Length, - BOOLEAN WriteToDevice) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -IoFreeAdapterChannel( - PADAPTER_OBJECT AdapterObject) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -IoFreeMapRegisters( - PADAPTER_OBJECT AdapterObject, - PVOID MapRegisterBase, - ULONG NumberOfMapRegisters) -{ - UNIMPLEMENTED; -} - - -PHYSICAL_ADDRESS -NTAPI -IoMapTransfer( - PADAPTER_OBJECT AdapterObject, - PMDL Mdl, - PVOID MapRegisterBase, - PVOID CurrentVa, - PULONG Length, - BOOLEAN WriteToDevice) -{ - PHYSICAL_ADDRESS Address; - - UNIMPLEMENTED; - - Address.QuadPart = 0; - - return Address; -} - -VOID -NTAPI -KeFlushWriteBuffer(VOID) -{ - UNIMPLEMENTED; -} - -LARGE_INTEGER -NTAPI -KeQueryPerformanceCounter( - PLARGE_INTEGER PerformanceFreq) -{ - LARGE_INTEGER Value; - - UNIMPLEMENTED; - - Value.QuadPart = 0; - - return Value; -} - -VOID -NTAPI -KeStallExecutionProcessor(IN ULONG Microseconds) -{ - SP804_CONTROL_REGISTER ControlRegister; - - // - // Enable the timer - // - WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds); - - // - // Configure the timer - // - ControlRegister.AsUlong = 0; - ControlRegister.OneShot = TRUE; - ControlRegister.Wide = TRUE; - ControlRegister.Periodic = TRUE; - ControlRegister.Enabled = TRUE; - WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong); - - // - // Now we will loop until the timer reached 0 - // - while (READ_REGISTER_ULONG(TIMER1_VALUE)); -} - -VOID -FASTCALL -KfLowerIrql(IN KIRQL NewIrql) -{ - ULONG InterruptMask; - ARM_STATUS_REGISTER Flags; - PKPCR Pcr = (PKPCR)KeGetPcr(); - - // - // Validate the new IRQL - // - Flags = KeArmStatusRegisterGet(); - _disable(); - ASSERT(NewIrql <= Pcr->CurrentIrql); - - // - // IRQLs are internally 8 bits - // - NewIrql &= 0xFF; - - // - // Setup the interrupt mask for this IRQL - // - InterruptMask = KeGetPcr()->IrqlTable[NewIrql]; -// DPRINT1("[LOWER] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask); - - // - // Clear interrupts associated to the old IRQL - // - WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); - - // - // Set the new interrupt mask - // PL190 VIC support only for now - // - WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); - - // - // Save the new IRQL - // - Pcr->CurrentIrql = NewIrql; - if (!Flags.IrqDisable) _enable(); -} - -KIRQL -FASTCALL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - ULONG InterruptMask; - ARM_STATUS_REGISTER Flags; - PKPCR Pcr = (PKPCR)KeGetPcr(); - - // - // Save the current IRQL - // - Flags = KeArmStatusRegisterGet(); - _disable(); - OldIrql = Pcr->CurrentIrql; - - // - // IRQLs are internally 8 bits - // - NewIrql &= 0xFF; - - // - // Setup the interrupt mask for this IRQL - // - InterruptMask = KeGetPcr()->IrqlTable[NewIrql]; - // DPRINT1("[RAISE] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask); - ASSERT(NewIrql >= OldIrql); - - // - // Clear interrupts associated to the old IRQL - // - WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); - - // - // Set the new interrupt mask - // PL190 VIC support only for now - // - WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); - - // - // Save the new IRQL - // - Pcr->CurrentIrql = NewIrql; - if (!Flags.IrqDisable) _enable(); - return OldIrql; -} - -VOID -NTAPI -READ_PORT_BUFFER_UCHAR( - PUCHAR Port, - PUCHAR Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -READ_PORT_BUFFER_ULONG( - PULONG Port, - PULONG Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -READ_PORT_BUFFER_USHORT( - PUSHORT Port, - PUSHORT Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -UCHAR -NTAPI -READ_PORT_UCHAR( - PUCHAR Port) -{ - UNIMPLEMENTED; - - return 0; -} - - -ULONG -NTAPI -READ_PORT_ULONG( - PULONG Port) -{ - UNIMPLEMENTED; - - return 0; -} - - -USHORT -NTAPI -READ_PORT_USHORT( - PUSHORT Port) -{ - UNIMPLEMENTED; - - return 0; -} - - -VOID -NTAPI -WRITE_PORT_BUFFER_UCHAR( - PUCHAR Port, - PUCHAR Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -WRITE_PORT_BUFFER_USHORT( - PUSHORT Port, - PUSHORT Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -WRITE_PORT_BUFFER_ULONG( - PULONG Port, - PULONG Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -WRITE_PORT_UCHAR( - PUCHAR Port, - UCHAR Value) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -WRITE_PORT_ULONG( - PULONG Port, - ULONG Value) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -WRITE_PORT_USHORT( - PUSHORT Port, - USHORT Value) -{ - UNIMPLEMENTED; -} - -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - // - // Call the generic routine - // - return KfRaiseIrql(DISPATCH_LEVEL); -} - -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - // - // Call the generic routine - // - return KfRaiseIrql(DISPATCH_LEVEL); -} - -BOOLEAN HalpProcessorIdentified; -BOOLEAN HalpTestCleanSupported; - -VOID -HalpIdentifyProcessor(VOID) -{ - ARM_ID_CODE_REGISTER IdRegister; - - // - // Don't do it again - // - HalpProcessorIdentified = TRUE; - - // - // Read the ID Code - // - IdRegister = KeArmIdCodeRegisterGet(); - - // - // Architecture "6" CPUs support test-and-clean (926EJ-S and 1026EJ-S) - // - HalpTestCleanSupported = (IdRegister.Architecture == 6); -} - -VOID -HalSweepDcache(VOID) -{ - // - // We get called very early on, before HalInitSystem or any of the Hal* - // processor routines, so we need to figure out what CPU we're on. - // - if (!HalpProcessorIdentified) HalpIdentifyProcessor(); - - // - // Check if we can do it the ARMv5TE-J way - // - if (HalpTestCleanSupported) - { - // - // Test, clean, flush D-Cache - // - __asm__ __volatile__ ("1: mrc p15, 0, pc, c7, c14, 3; bne 1b"); - } - else - { - // - // We need to do it it by set/way - // - UNIMPLEMENTED; - } -} - -VOID -HalSweepIcache(VOID) -{ - // - // All ARM cores support the same Icache flush command, no need for HAL work - // - KeArmFlushIcache(); -} - -/* - * @implemented - */ -#undef KeGetCurrentIrql -KIRQL -NTAPI -KeGetCurrentIrql(VOID) -{ - /* Return IRQL */ - return PCR->CurrentIrql; -} - -/* - * @implemented - */ -VOID -NTAPI -KeLowerIrql(KIRQL NewIrql) -{ - /* Call the fastcall function */ - KfLowerIrql(NewIrql); -} - -/* - * @implemented - */ -VOID -NTAPI -KeRaiseIrql(KIRQL NewIrql, - PKIRQL OldIrql) -{ - /* Call the fastcall function */ - *OldIrql = KfRaiseIrql(NewIrql); -} - -/* - * @implemented - */ -VOID -NTAPI -KeAcquireSpinLock(PKSPIN_LOCK SpinLock, - PKIRQL OldIrql) -{ - /* Call the fastcall function */ - *OldIrql = KfAcquireSpinLock(SpinLock); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -NTAPI -KeReleaseSpinLock(PKSPIN_LOCK SpinLock, - KIRQL NewIrql) -{ - /* Call the fastcall function */ - KfReleaseSpinLock(SpinLock, NewIrql); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KfAcquireSpinLock(PKSPIN_LOCK SpinLock) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KfReleaseSpinLock(PKSPIN_LOCK SpinLock, - KIRQL OldIrql) -{ - /* Simply lower IRQL back */ - KfLowerIrql(OldIrql); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle) -{ - /* Simply raise to dispatch */ - LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle) -{ - /* Simply raise to synch */ - LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, - IN KIRQL OldIrql) -{ - /* Simply lower IRQL back */ - KfLowerIrql(OldIrql); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) -{ - /* Simply lower IRQL back */ - KfLowerIrql(LockHandle->OldIrql); -} - -/* - * @implemented - */ -BOOLEAN -FASTCALL -KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, - IN PKIRQL OldIrql) -{ - /* Simply raise to dispatch */ - *OldIrql = KfRaiseIrql(DISPATCH_LEVEL); - - /* Always return true on UP Machines */ - return TRUE; -} - -/* - * @implemented - */ -LOGICAL -FASTCALL -KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, - OUT PKIRQL OldIrql) -{ - /* Simply raise to dispatch */ - *OldIrql = KfRaiseIrql(DISPATCH_LEVEL); - - /* Always return true on UP Machines */ - return TRUE; -} - -/* EOF */ diff --git a/reactos/hal/halarm/generic/halinit.c b/reactos/hal/halarm/generic/halinit.c new file mode 100644 index 00000000000..6f63dc9f938 --- /dev/null +++ b/reactos/hal/halarm/generic/halinit.c @@ -0,0 +1,182 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/halinit.c + * PURPOSE: HAL Entrypoint and Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PCHAR CommandLine; + + /* Make sure we have a loader block and command line */ + if ((LoaderBlock) && (LoaderBlock->LoadOptions)) + { + /* Read the command line */ + CommandLine = LoaderBlock->LoadOptions; + + /* Check for initial breakpoint */ + if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); + } +} + +/* FUNCTIONS ******************************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalInitSystem(IN ULONG BootPhase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PKPRCB Prcb = KeGetCurrentPrcb(); + + /* Check the boot phase */ + if (!BootPhase) + { + /* Get command-line parameters */ + HalpGetParameters(LoaderBlock); + + /* Checked HAL requires checked kernel */ +#if DBG + if (!(Prcb->BuildType & PRCB_BUILD_DEBUG)) + { + /* No match, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0); + } +#else + /* Release build requires release HAL */ + if (Prcb->BuildType & PRCB_BUILD_DEBUG) + { + /* No match, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); + } +#endif + +#ifdef CONFIG_SMP + /* SMP HAL requires SMP kernel */ + if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) + { + /* No match, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); + } +#endif + + /* Validate the PRCB */ + if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) + { + /* Validation failed, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0); + } + + /* Initialize interrupts */ + HalpInitializeInterrupts(); + + /* Force initial PIC state */ + KfRaiseIrql(KeGetCurrentIrql()); + + /* Fill out the dispatch tables */ + //HalQuerySystemInformation = NULL; // FIXME: TODO; + //HalSetSystemInformation = NULL; // FIXME: TODO; + //HalInitPnpDriver = NULL; // FIXME: TODO + //HalGetDmaAdapter = NULL; // FIXME: TODO; + //HalGetInterruptTranslator = NULL; // FIXME: TODO + //HalResetDisplay = NULL; // FIXME: TODO; + //HalHaltSystem = NULL; // FIXME: TODO; + + /* Setup I/O space */ + //HalpDefaultIoSpace.Next = HalpAddressUsageList; + //HalpAddressUsageList = &HalpDefaultIoSpace; + + /* Setup busy waiting */ + //HalpCalibrateStallExecution(); + + /* Initialize the clock */ + HalpInitializeClock(); + + /* Setup time increments to 10ms and 1ms */ + HalpCurrentTimeIncrement = 100000; + HalpNextTimeIncrement = 100000; + HalpNextIntervalCount = 0; + KeSetTimeIncrement(100000, 10000); + + /* + * We could be rebooting with a pending profile interrupt, + * so clear it here before interrupts are enabled + */ + HalStopProfileInterrupt(ProfileTime); + + /* Do some HAL-specific initialization */ + HalpInitPhase0(LoaderBlock); + } + else if (BootPhase == 1) + { + /* Enable timer interrupt */ + HalpEnableInterruptHandler(IDT_DEVICE, + 0, + PRIMARY_VECTOR_BASE, + CLOCK2_LEVEL, + HalpClockInterrupt, + Latched); +#if 0 + /* Enable IRQ 8 */ + HalpEnableInterruptHandler(IDT_DEVICE, + 0, + PRIMARY_VECTOR_BASE + 8, + PROFILE_LEVEL, + HalpProfileInterrupt, + Latched); +#endif + /* Initialize DMA. NT does this in Phase 0 */ + //HalpInitDma(); + + /* Do some HAL-specific initialization */ + HalpInitPhase1(); + } + + /* All done, return */ + return TRUE; +} + +#include +ULONG +DbgPrintEarly(const char *fmt, ...) +{ + va_list args; + unsigned int i; + char Buffer[1024]; + PCHAR String = Buffer; + + va_start(args, fmt); + i = vsprintf(Buffer, fmt, args); + va_end(args); + + /* Output the message */ + while (*String != 0) + { + if (*String == '\n') + { + KdPortPutByteEx(NULL, '\r'); + } + KdPortPutByteEx(NULL, *String); + String++; + } + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/misc.c b/reactos/hal/halarm/generic/misc.c new file mode 100644 index 00000000000..86fbe766206 --- /dev/null +++ b/reactos/hal/halarm/generic/misc.c @@ -0,0 +1,47 @@ +/* + * PROJECT: ReactOS Hardware Abstraction Layer (HAL) + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/misc.c + * PURPOSE: Misc functions to move + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS *******************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +/* + * @implemented + */ +UCHAR +FASTCALL +HalSystemVectorDispatchEntry(IN ULONG Vector, + OUT PKINTERRUPT_ROUTINE **FlatDispatch, + OUT PKINTERRUPT_ROUTINE *NoConnection) +{ + /* Not implemented */ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @implemented + */ +VOID +NTAPI +KeFlushWriteBuffer(VOID) +{ + /* Not implemented */ + UNIMPLEMENTED; + while (TRUE); + return; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/pic.c b/reactos/hal/halarm/generic/pic.c new file mode 100644 index 00000000000..5be8c3f3e9b --- /dev/null +++ b/reactos/hal/halarm/generic/pic.c @@ -0,0 +1,342 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/pic.c + * PURPOSE: HAL PIC Management and Control Code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef KeGetCurrentIrql + +/* GLOBALS ********************************************************************/ + +ULONG HalpIrqlTable[HIGH_LEVEL + 1] = +{ + 0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL + 0xFFFFFFFD, // IRQL 1 APC_LEVEL + 0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL + 0xFFFFFFD9, // IRQL 3 + 0xFFFFFF99, // IRQL 4 + 0xFFFFFF19, // IRQL 5 + 0xFFFFFE19, // IRQL 6 + 0xFFFFFC19, // IRQL 7 + 0xFFFFF819, // IRQL 8 + 0xFFFFF019, // IRQL 9 + 0xFFFFE019, // IRQL 10 + 0xFFFFC019, // IRQL 11 + 0xFFFF8019, // IRQL 12 + 0xFFFF0019, // IRQL 13 + 0xFFFE0019, // IRQL 14 + 0xFFFC0019, // IRQL 15 + 0xFFF80019, // IRQL 16 + 0xFFF00019, // IRQL 17 + 0xFFE00019, // IRQL 18 + 0xFFC00019, // IRQL 19 + 0xFF800019, // IRQL 20 + 0xFF000019, // IRQL 21 + 0xFE000019, // IRQL 22 + 0xFC000019, // IRQL 23 + 0xF0000019, // IRQL 24 + 0x80000019, // IRQL 25 + 0x19, // IRQL 26 + 0x18, // IRQL 27 PROFILE_LEVEL + 0x10, // IRQL 28 CLOCK2_LEVEL + 0x00, // IRQL 29 IPI_LEVEL + 0x00, // IRQL 30 POWER_LEVEL + 0x00, // IRQL 31 HIGH_LEVEL +}; + +UCHAR HalpMaskTable[HIGH_LEVEL + 1] = +{ + PROFILE_LEVEL, // INT 0 WATCHDOG + APC_LEVEL, // INT 1 SOFTWARE INTERRUPT + DISPATCH_LEVEL,// INT 2 COMM RX + IPI_LEVEL, // INT 3 COMM TX + CLOCK2_LEVEL, // INT 4 TIMER 0 + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 26, + 26 +}; + +/* FUNCTIONS ******************************************************************/ + +VOID +HalpInitializeInterrupts(VOID) +{ + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + + /* Fill out the IRQL mappings */ + RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable)); + RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask)); +} + +/* IRQL MANAGEMENT ************************************************************/ + +/* + * @implemented + */ +ULONG +HalGetInterruptSource(VOID) +{ + ULONG InterruptStatus; + + /* Get the interrupt status, and return the highest bit set */ + InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS); + return 31 - _clz(InterruptStatus); +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeGetCurrentIrql(VOID) +{ + /* Return the IRQL */ + return KeGetPcr()->Irql; +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID) +{ + PKPCR Pcr = KeGetPcr(); + KIRQL CurrentIrql; + + /* Save and update IRQL */ + CurrentIrql = Pcr->Irql; + Pcr->Irql = DISPATCH_LEVEL; + +#ifdef IRQL_DEBUG + /* Validate correct raise */ + if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); +#endif + + /* Return the previous value */ + return CurrentIrql; +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID) +{ + PKPCR Pcr = KeGetPcr(); + KIRQL CurrentIrql; + + /* Save and update IRQL */ + CurrentIrql = Pcr->Irql; + Pcr->Irql = SYNCH_LEVEL; + +#ifdef IRQL_DEBUG + /* Validate correct raise */ + if (CurrentIrql > SYNCH_LEVEL) + { + /* Crash system */ + KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL, + CurrentIrql, + SYNCH_LEVEL, + 0, + 1); + } +#endif + + /* Return the previous value */ + return CurrentIrql; +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KfRaiseIrql(IN KIRQL NewIrql) +{ + ARM_STATUS_REGISTER Flags; + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + KIRQL CurrentIrql; + ULONG InterruptMask; + + /* Disable interrupts */ + Flags = KeArmStatusRegisterGet(); + _disable(); + + /* Read current IRQL */ + CurrentIrql = Pcr->Irql; + +#ifdef IRQL_DEBUG + /* Validate correct raise */ + if (CurrentIrql > NewIrql) + { + /* Crash system */ + Pcr->Irql = PASSIVE_LEVEL; + KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); + } +#endif + /* Clear interrupts associated to the old IRQL */ + WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); + + /* Set the new interrupt mask */ + InterruptMask = Pcr->IrqlTable[NewIrql]; + WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); + + /* Set new IRQL */ + Pcr->Irql = NewIrql; + + /* Restore interrupt state */ + if (!Flags.IrqDisable) _enable(); + + /* Return old IRQL */ + return CurrentIrql; +} + +/* + * @implemented + */ +VOID +FASTCALL +KfLowerIrql(IN KIRQL NewIrql) +{ + ARM_STATUS_REGISTER Flags; + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + ULONG InterruptMask; + + /* Disableinterrupts */ + Flags = KeArmStatusRegisterGet(); + _disable(); + +#ifdef IRQL_DEBUG + /* Validate correct lower */ + if (OldIrql > Pcr->Irql) + { + /* Crash system */ + Pcr->Irql = HIGH_LEVEL; + KeBugCheck(IRQL_NOT_LESS_OR_EQUAL); + } +#endif + + /* Clear interrupts associated to the old IRQL */ + WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); + + /* Set the new interrupt mask */ + InterruptMask = Pcr->IrqlTable[NewIrql]; + WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); + + /* Save the new IRQL and restore interrupt state */ + Pcr->Irql = NewIrql; + if (!Flags.IrqDisable) _enable(); +} + +/* SOFTWARE INTERRUPTS ********************************************************/ + +/* + * @implemented + */ +VOID +FASTCALL +HalRequestSoftwareInterrupt(IN KIRQL Irql) +{ + /* Force a software interrupt */ + WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Irql); +} + +/* + * @implemented + */ +VOID +FASTCALL +HalClearSoftwareInterrupt(IN KIRQL Irql) +{ + /* Clear software interrupt */ + WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Irql); +} + +/* SYSTEM INTERRUPTS **********************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalEnableSystemInterrupt(IN UCHAR Vector, + IN KIRQL Irql, + IN KINTERRUPT_MODE InterruptMode) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @implemented + */ +VOID +NTAPI +HalDisableSystemInterrupt(IN UCHAR Vector, + IN KIRQL Irql) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalBeginSystemInterrupt(IN KIRQL Irql, + IN UCHAR Vector, + OUT PKIRQL OldIrql) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @implemented + */ +VOID +NTAPI +HalEndSystemInterrupt(IN KIRQL OldIrql, + IN PKTRAP_FRAME TrapFrame) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/portio.c b/reactos/hal/halarm/generic/portio.c new file mode 100644 index 00000000000..91786b4bb2a --- /dev/null +++ b/reactos/hal/halarm/generic/portio.c @@ -0,0 +1,129 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/portio.c + * PURPOSE: I/O Functions for access to ports + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef READ_PORT_UCHAR +#undef READ_PORT_USHORT +#undef READ_PORT_ULONG +#undef WRITE_PORT_UCHAR +#undef WRITE_PORT_USHORT +#undef WRITE_PORT_ULONG + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +READ_PORT_BUFFER_UCHAR(IN PUCHAR Port, + OUT PUCHAR Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +READ_PORT_BUFFER_USHORT(IN PUSHORT Port, + OUT PUSHORT Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +READ_PORT_BUFFER_ULONG(IN PULONG Port, + OUT PULONG Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +UCHAR +NTAPI +READ_PORT_UCHAR(IN PUCHAR Port) +{ + return READ_REGISTER_UCHAR(Port); +} + +USHORT +NTAPI +READ_PORT_USHORT(IN PUSHORT Port) +{ + return READ_REGISTER_USHORT(Port); +} + +ULONG +NTAPI +READ_PORT_ULONG(IN PULONG Port) +{ + return READ_REGISTER_ULONG(Port); +} + +VOID +NTAPI +WRITE_PORT_BUFFER_UCHAR(IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +WRITE_PORT_BUFFER_USHORT(IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +WRITE_PORT_BUFFER_ULONG(IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +WRITE_PORT_UCHAR(IN PUCHAR Port, + IN UCHAR Value) +{ + WRITE_REGISTER_UCHAR(Port, Value); +} + +VOID +NTAPI +WRITE_PORT_USHORT(IN PUSHORT Port, + IN USHORT Value) +{ + WRITE_REGISTER_USHORT(Port, Value); +} + +VOID +NTAPI +WRITE_PORT_ULONG(IN PULONG Port, + IN ULONG Value) +{ + WRITE_REGISTER_ULONG(Port, Value); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/processor.c b/reactos/hal/halarm/generic/processor.c new file mode 100644 index 00000000000..b52ef5cfff4 --- /dev/null +++ b/reactos/hal/halarm/generic/processor.c @@ -0,0 +1,141 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/processor.c + * PURPOSE: HAL Processor Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +LONG HalpActiveProcessors; +KAFFINITY HalpDefaultInterruptAffinity; +BOOLEAN HalpProcessorIdentified; +BOOLEAN HalpTestCleanSupported; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +HalpIdentifyProcessor(VOID) +{ + ARM_ID_CODE_REGISTER IdRegister; + + /* Don't do it again */ + HalpProcessorIdentified = TRUE; + + // fixfix: Use Pcr->ProcessorId + + /* Read the ID Code */ + IdRegister = KeArmIdCodeRegisterGet(); + + /* Architecture "6" CPUs support test-and-clean (926EJ-S and 1026EJ-S) */ + HalpTestCleanSupported = (IdRegister.Architecture == 6); +} + +/* FUNCTIONS ******************************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalInitializeProcessor(IN ULONG ProcessorNumber, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + /* Do nothing */ + return; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalAllProcessorsStarted(VOID) +{ + /* Do nothing */ + return TRUE; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PKPROCESSOR_STATE ProcessorState) +{ + /* Ready to start */ + return FALSE; +} + +/* + * @implemented + */ +VOID +NTAPI +HalProcessorIdle(VOID) +{ + /* Enable interrupts and halt the processor */ + _enable(); + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +VOID +NTAPI +HalRequestIpi(KAFFINITY TargetProcessors) +{ + /* Not implemented on UP */ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +VOID +HalSweepDcache(VOID) +{ + /* + * We get called very early on, before HalInitSystem or any of the Hal* + * processor routines, so we need to figure out what CPU we're on. + */ + if (!HalpProcessorIdentified) HalpIdentifyProcessor(); + + /* + * Check if we can do it the ARMv5TE-J way + */ + if (HalpTestCleanSupported) + { + /* Test, clean, flush D-Cache */ + __asm__ __volatile__ ("1: mrc p15, 0, pc, c7, c14, 3; bne 1b"); + } + else + { + /* We need to do it it by set/way. For now always call ARMv7 function */ + //extern VOID v7_flush_dcache_all(VOID); + //v7_flush_dcache_all(); + } +} + +/* + * @implemented + */ +VOID +HalSweepIcache(VOID) +{ + /* All ARM cores support the same Icache flush command */ + KeArmFlushIcache(); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/profil.c b/reactos/hal/halarm/generic/profil.c new file mode 100644 index 00000000000..44f9e6fd287 --- /dev/null +++ b/reactos/hal/halarm/generic/profil.c @@ -0,0 +1,50 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/profil.c + * PURPOSE: System Profiling + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +/* + * @unimplemented + */ +VOID +NTAPI +HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) +{ + UNIMPLEMENTED; + return; +} + +/* + * @unimplemented + */ +VOID +NTAPI +HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) +{ + UNIMPLEMENTED; + return; +} + +/* + * @unimplemented + */ +ULONG_PTR +NTAPI +HalSetProfileInterval(IN ULONG_PTR Interval) +{ + UNIMPLEMENTED; + return Interval; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/reboot.c b/reactos/hal/halarm/generic/reboot.c new file mode 100644 index 00000000000..51de4862bc8 --- /dev/null +++ b/reactos/hal/halarm/generic/reboot.c @@ -0,0 +1,43 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/reboot.c + * PURPOSE: Reboot Function + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* PUBLIC FUNCTIONS **********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalReturnToFirmware(IN FIRMWARE_REENTRY Action) +{ + /* Check what kind of action this is */ + switch (Action) + { + /* All recognized actions */ + case HalHaltRoutine: + case HalRebootRoutine: + + /* Acquire the display */ + InbvAcquireDisplayOwnership(); + + /* Anything else */ + default: + + /* Print message and break */ + DbgPrint("HalReturnToFirmware called!\n"); + DbgBreakPoint(); + } +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/rtc.c b/reactos/hal/halarm/generic/rtc.c new file mode 100644 index 00000000000..e2fe11e9a4a --- /dev/null +++ b/reactos/hal/halarm/generic/rtc.c @@ -0,0 +1,79 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/rtc.c + * PURPOSE: Real Time Clock and Environment Variable Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +#define RTC_DATA (PVOID)0x101E8000 + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalQueryRealTimeClock(IN PTIME_FIELDS Time) +{ + LARGE_INTEGER LargeTime; + ULONG Seconds; + + /* Query the RTC value */ + Seconds = READ_REGISTER_ULONG(RTC_DATA); + + /* Convert to time */ + RtlSecondsSince1970ToTime(Seconds, &LargeTime); + + /* Convert to time-fields */ + RtlTimeToTimeFields(&LargeTime, Time); + return TRUE; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +HalSetRealTimeClock(IN PTIME_FIELDS Time) +{ + UNIMPLEMENTED; + while (TRUE); + return TRUE; +} + +/* + * @unimplemented + */ +ARC_STATUS +NTAPI +HalSetEnvironmentVariable(IN PCH Name, + IN PCH Value) +{ + UNIMPLEMENTED; + while (TRUE); + return ESUCCESS; +} + +/* + * @unimplemented + */ +ARC_STATUS +NTAPI +HalGetEnvironmentVariable(IN PCH Name, + IN USHORT ValueLength, + IN PCH Value) +{ + UNIMPLEMENTED; + while (TRUE); + return ENOENT; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/spinlock.c b/reactos/hal/halarm/generic/spinlock.c new file mode 100644 index 00000000000..ff53749329e --- /dev/null +++ b/reactos/hal/halarm/generic/spinlock.c @@ -0,0 +1,202 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/spinlock.c + * PURPOSE: SpinLock Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +#undef KeAcquireSpinLock +#undef KeReleaseSpinLock +#undef KeRaiseIrql +#undef KeLowerIrql + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +KeRaiseIrql(KIRQL NewIrql, + PKIRQL OldIrql) +{ + /* Call the fastcall function */ + *OldIrql = KfRaiseIrql(NewIrql); +} + +/* + * @implemented + */ +VOID +NTAPI +KeLowerIrql(KIRQL NewIrql) +{ + /* Call the fastcall function */ + KfLowerIrql(NewIrql); +} + +/* + * @implemented + */ +VOID +NTAPI +KeAcquireSpinLock(PKSPIN_LOCK SpinLock, + PKIRQL OldIrql) +{ + /* Call the fastcall function */ + *OldIrql = KfAcquireSpinLock(SpinLock); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +NTAPI +KeReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL NewIrql) +{ + /* Call the fastcall function */ + KfReleaseSpinLock(SpinLock, NewIrql); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KfAcquireSpinLock(PKSPIN_LOCK SpinLock) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KfReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL OldIrql) +{ + /* Simply lower IRQL back */ + KeLowerIrql(OldIrql); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + IN KIRQL OldIrql) +{ + /* Simply lower IRQL back */ + KfLowerIrql(OldIrql); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply lower IRQL back */ + KfLowerIrql(LockHandle->OldIrql); +} + +/* + * @implemented + */ +BOOLEAN +FASTCALL +KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + IN PKIRQL OldIrql) +{ + /* Simply raise to synch */ + KeRaiseIrql(SYNCH_LEVEL, OldIrql); + + /* Always return true on UP Machines */ + return TRUE; +} + +/* + * @implemented + */ +LOGICAL +FASTCALL +KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + OUT PKIRQL OldIrql) +{ + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, OldIrql); + + /* Always return true on UP Machines */ + return TRUE; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/sysinfo.c b/reactos/hal/halarm/generic/sysinfo.c new file mode 100644 index 00000000000..f48ae962bf5 --- /dev/null +++ b/reactos/hal/halarm/generic/sysinfo.c @@ -0,0 +1,40 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/spinlock.c + * PURPOSE: HAL Information Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +HaliSetSystemInformation(IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_NOT_IMPLEMENTED; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/timer.c b/reactos/hal/halarm/generic/timer.c new file mode 100644 index 00000000000..9ed2a2a4d01 --- /dev/null +++ b/reactos/hal/halarm/generic/timer.c @@ -0,0 +1,149 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/timer.c + * PURPOSE: Timer Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +VOID +FASTCALL +KeUpdateSystemTime( + IN PKTRAP_FRAME TrapFrame, + IN ULONG Increment, + IN KIRQL OldIrql +); + +/* GLOBALS ********************************************************************/ + +ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +HalpClockInterrupt(VOID) +{ + /* Clear the interrupt */ + ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL); + WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); + + /* FIXME: Update HAL Perf counters */ + + /* FIXME: Check if someone changed the clockrate */ + + /* Call the kernel */ + KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame, + HalpCurrentTimeIncrement, + CLOCK2_LEVEL); +} + +VOID +HalpStallInterrupt(VOID) +{ + /* Clear the interrupt */ + WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); +} + +VOID +HalpInitializeClock(VOID) +{ + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + ULONG ClockInterval; + SP804_CONTROL_REGISTER ControlRegister; + + /* Setup the clock and profile interrupt */ + Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt; + + /* + * Configure the interval to 10ms + * (INTERVAL (10ms) * TIMCLKfreq (1MHz)) + * --------------------------------------- == 10^4 + * (TIMCLKENXdiv (1) * PRESCALEdiv (1)) + */ + ClockInterval = 0x2710; + + /* Configure the timer */ + ControlRegister.AsUlong = 0; + ControlRegister.Wide = TRUE; + ControlRegister.Periodic = TRUE; + ControlRegister.Interrupt = TRUE; + ControlRegister.Enabled = TRUE; + + /* Enable the timer */ + WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval); + WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong); +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalCalibratePerformanceCounter(IN volatile PLONG Count, + IN ULONGLONG NewCount) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +ULONG +NTAPI +HalSetTimeIncrement(IN ULONG Increment) +{ + UNIMPLEMENTED; + while (TRUE); + return Increment; +} + +/* + * @implemented + */ +VOID +NTAPI +KeStallExecutionProcessor(IN ULONG Microseconds) +{ + SP804_CONTROL_REGISTER ControlRegister; + + /* Enable the timer */ + WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds); + + /* Configure the timer */ + ControlRegister.AsUlong = 0; + ControlRegister.OneShot = TRUE; + ControlRegister.Wide = TRUE; + ControlRegister.Periodic = TRUE; + ControlRegister.Enabled = TRUE; + WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong); + + /* Now we will loop until the timer reached 0 */ + while (READ_REGISTER_ULONG(TIMER1_VALUE)); +} + +/* + * @implemented + */ +LARGE_INTEGER +NTAPI +KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq) +{ + LARGE_INTEGER Value; + + UNIMPLEMENTED; + while (TRUE); + + Value.QuadPart = 0; + return Value; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/usage.c b/reactos/hal/halarm/generic/usage.c new file mode 100644 index 00000000000..248f383dedb --- /dev/null +++ b/reactos/hal/halarm/generic/usage.c @@ -0,0 +1,76 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/usage.c + * PURPOSE: Resource Usage Management Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +PUCHAR KdComPortInUse; + +IDTUsageFlags HalpIDTUsageFlags[256]; +IDTUsage HalpIDTUsage[256]; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +HalpReportResourceUsage(IN PUNICODE_STRING HalName, + IN INTERFACE_TYPE InterfaceType) +{ + DbgPrint("%wZ has been initialized\n", HalName); +} + +VOID +NTAPI +HalpRegisterVector(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql) +{ + /* Save the vector flags */ + HalpIDTUsageFlags[SystemVector].Flags = Flags; + + /* Save the vector data */ + HalpIDTUsage[SystemVector].Irql = Irql; + HalpIDTUsage[SystemVector].BusReleativeVector = BusVector; +} + +VOID +NTAPI +HalpEnableInterruptHandler(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql, + IN PVOID Handler, + IN KINTERRUPT_MODE Mode) +{ + /* Register the routine */ + ((PKIPCR)KeGetPcr())->InterruptRoutine[Irql] = Handler; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented + */ +VOID +NTAPI +HalReportResourceUsage(VOID) +{ + UNICODE_STRING HalString; + + /* Build HAL usage */ + RtlInitUnicodeString(&HalString, L"ARM Versatile HAL"); + HalpReportResourceUsage(&HalString, Internal); +} + +/* EOF */ diff --git a/reactos/hal/halarm/hal.rbuild b/reactos/hal/halarm/hal.rbuild new file mode 100644 index 00000000000..2a6086a5894 --- /dev/null +++ b/reactos/hal/halarm/hal.rbuild @@ -0,0 +1,18 @@ + + + + + + + include + include + + hal_generic + ntoskrnl + + + halinit_up.c + halup.rc + + + diff --git a/reactos/hal/halarm/hal_generic.rbuild b/reactos/hal/halarm/hal_generic.rbuild new file mode 100644 index 00000000000..b46c036742e --- /dev/null +++ b/reactos/hal/halarm/hal_generic.rbuild @@ -0,0 +1,33 @@ + + + + + include + include + + + beep.c + bus.c + cache.S + dma.c + drive.c + display.c + fmutex.c + halinit.c + misc.c + pic.c + portio.c + processor.c + profil.c + reboot.c + rtc.c + spinlock.c + sysinfo.c + timer.c + usage.c + + + hal.h + + + diff --git a/reactos/hal/halarm/include/hal.h b/reactos/hal/halarm/include/hal.h index f2c8c2ea808..e6ae706ce01 100644 --- a/reactos/hal/halarm/include/hal.h +++ b/reactos/hal/halarm/include/hal.h @@ -9,6 +9,7 @@ /* INCLUDES ******************************************************************/ /* C Headers */ +#define DbgPrint DbgPrintEarly #include /* WDK HAL Compilation hack */ @@ -22,6 +23,7 @@ /* IFS/DDK/NDK Headers */ #include +#include #include #include #include @@ -29,6 +31,7 @@ #include #include #include +#include #include #include #include diff --git a/reactos/hal/halarm/include/halp.h b/reactos/hal/halarm/include/halp.h index 98507b45aad..5ee60dd9058 100644 --- a/reactos/hal/halarm/include/halp.h +++ b/reactos/hal/halarm/include/halp.h @@ -14,4 +14,49 @@ #include #include +#define PRIMARY_VECTOR_BASE 0x00 + +/* Usage flags */ +#define IDT_REGISTERED 0x01 +#define IDT_LATCHED 0x02 +#define IDT_INTERNAL 0x11 +#define IDT_DEVICE 0x21 + +typedef struct _IDTUsageFlags +{ + UCHAR Flags; +} IDTUsageFlags; + +typedef struct +{ + KIRQL Irql; + UCHAR BusReleativeVector; +} IDTUsage; + +VOID +NTAPI +HalpRegisterVector(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql); + +VOID +NTAPI +HalpEnableInterruptHandler(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql, + IN PVOID Handler, + IN KINTERRUPT_MODE Mode); + +VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock); +VOID HalpInitPhase1(VOID); + +VOID HalpInitializeInterrupts(VOID); +VOID HalpInitializeClock(VOID); +VOID HalpClockInterrupt(VOID); +VOID HalpProfileInterrupt(VOID); + +extern ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; + #endif /* __INTERNAL_HAL_HAL_H */ diff --git a/reactos/hal/halarm/up/halinit_up.c b/reactos/hal/halarm/up/halinit_up.c deleted file mode 100644 index cbb18bc665e..00000000000 --- a/reactos/hal/halarm/up/halinit_up.c +++ /dev/null @@ -1,32 +0,0 @@ -/* $Id: halinit_up.c 24964 2006-11-29 08:28:20Z ion $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/hal/x86/halinit.c - * PURPOSE: Initalize the x86 hal - * PROGRAMMER: David Welch (welch@cwcom.net) - * UPDATE HISTORY: - * 11/06/98: Created - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -/* FUNCTIONS ***************************************************************/ - -VOID -HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - -} - -VOID -HalpInitPhase1(VOID) -{ - -} - -/* EOF */ diff --git a/reactos/hal/halarm/versa/halinit_up.c b/reactos/hal/halarm/versa/halinit_up.c new file mode 100644 index 00000000000..0b9693914a9 --- /dev/null +++ b/reactos/hal/halarm/versa/halinit_up.c @@ -0,0 +1,31 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/versa/halinit_up.c + * PURPOSE: Versatile Board-Specific HAL Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + +} + +VOID +HalpInitPhase1(VOID) +{ + +} + +/* EOF */ diff --git a/reactos/hal/halarm/up/halup.rbuild b/reactos/hal/halarm/versa/halup.rbuild similarity index 59% rename from reactos/hal/halarm/up/halup.rbuild rename to reactos/hal/halarm/versa/halup.rbuild index b44390569d0..ac59afe19ec 100644 --- a/reactos/hal/halarm/up/halup.rbuild +++ b/reactos/hal/halarm/versa/halup.rbuild @@ -1,13 +1,16 @@ - + - ../include + include include - halarm_generic + hal_generic ntoskrnl - halinit_up.c - halup.rc + kdcom + + halinit_up.c + halup.rc + diff --git a/reactos/hal/halarm/up/halup.rc b/reactos/hal/halarm/versa/halup.rc similarity index 100% rename from reactos/hal/halarm/up/halup.rc rename to reactos/hal/halarm/versa/halup.rc From 9eea228a7da051848807c02d190c2625f5d34ec5 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:26:46 +0000 Subject: [PATCH 39/97] [FREELDR]: The WinLDR code forgot to update the File Path of boot driver entries from PA to VA as well, not just the registry path. It also tried to touch the PA LoaderBlock right after enabling the MMU. It should touch the VA LoaderBlock instead, since there is no guarantee that the address has been identity mapped (and hence the PA address interpreted as a VA address by the MMU is bogus). svn path=/trunk/; revision=45519 --- reactos/boot/freeldr/freeldr/windows/winldr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/boot/freeldr/freeldr/windows/winldr.c b/reactos/boot/freeldr/freeldr/windows/winldr.c index 704035a4420..0121773e3a8 100644 --- a/reactos/boot/freeldr/freeldr/windows/winldr.c +++ b/reactos/boot/freeldr/freeldr/windows/winldr.c @@ -316,6 +316,7 @@ WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock, // Convert the RegistryPath and DTE addresses to VA since we are not going to use it anymore BootDriver->RegistryPath.Buffer = PaToVa(BootDriver->RegistryPath.Buffer); + BootDriver->FilePath.Buffer = PaToVa(BootDriver->FilePath.Buffer); BootDriver->LdrEntry = PaToVa(BootDriver->LdrEntry); NextBd = BootDriver->Link.Flink; @@ -584,7 +585,7 @@ LoadAndBootWindows(PCSTR OperatingSystemName, WinLdrTurnOnPaging(LoaderBlock, PcrBasePage, TssBasePage, GdtIdt); /* Save final value of LoaderPagesSpanned */ - LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned; + LoaderBlockVA->Extension->LoaderPagesSpanned = LoaderPagesSpanned; DPRINTM(DPRINT_WINDOWS, "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n", KiSystemStartup, LoaderBlockVA); From 7d76dde312b6b03a8ea667054fce2679822465ad Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:32:59 +0000 Subject: [PATCH 40/97] [FREELDR]: Do not build EXT2, ISO or NTFS support for ARM targets. svn path=/trunk/; revision=45520 --- reactos/boot/freeldr/freeldr/fs/ext2.c | 4 ++++ reactos/boot/freeldr/freeldr/fs/fs.c | 4 ++++ reactos/boot/freeldr/freeldr/fs/iso.c | 4 ++++ reactos/boot/freeldr/freeldr/fs/ntfs.c | 3 +++ 4 files changed, 15 insertions(+) diff --git a/reactos/boot/freeldr/freeldr/fs/ext2.c b/reactos/boot/freeldr/freeldr/fs/ext2.c index afd37ae5fdd..46f12fbe6d4 100644 --- a/reactos/boot/freeldr/freeldr/fs/ext2.c +++ b/reactos/boot/freeldr/freeldr/fs/ext2.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -1308,3 +1309,6 @@ const DEVVTBL* Ext2Mount(ULONG DeviceId) else return NULL; } + +#endif + diff --git a/reactos/boot/freeldr/freeldr/fs/fs.c b/reactos/boot/freeldr/freeldr/fs/fs.c index 49f817c112e..a2c5c495e2c 100644 --- a/reactos/boot/freeldr/freeldr/fs/fs.c +++ b/reactos/boot/freeldr/freeldr/fs/fs.c @@ -321,13 +321,17 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) } /* Try to detect the file system */ +#ifndef _M_ARM FileData[DeviceId].FileFuncTable = IsoMount(DeviceId); if (!FileData[DeviceId].FileFuncTable) +#endif FileData[DeviceId].FileFuncTable = FatMount(DeviceId); +#ifndef _M_ARM if (!FileData[DeviceId].FileFuncTable) FileData[DeviceId].FileFuncTable = NtfsMount(DeviceId); if (!FileData[DeviceId].FileFuncTable) FileData[DeviceId].FileFuncTable = Ext2Mount(DeviceId); +#endif if (!FileData[DeviceId].FileFuncTable) { /* Error, unable to detect file system */ diff --git a/reactos/boot/freeldr/freeldr/fs/iso.c b/reactos/boot/freeldr/freeldr/fs/iso.c index fc35402da66..dd1231558d7 100644 --- a/reactos/boot/freeldr/freeldr/fs/iso.c +++ b/reactos/boot/freeldr/freeldr/fs/iso.c @@ -18,6 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -510,3 +511,6 @@ const DEVVTBL* IsoMount(ULONG DeviceId) else return NULL; } + +#endif + diff --git a/reactos/boot/freeldr/freeldr/fs/ntfs.c b/reactos/boot/freeldr/freeldr/fs/ntfs.c index 23344dd10e4..830e3ade042 100644 --- a/reactos/boot/freeldr/freeldr/fs/ntfs.c +++ b/reactos/boot/freeldr/freeldr/fs/ntfs.c @@ -23,6 +23,7 @@ * - May crash on corrupted filesystem. */ +#ifndef _M_ARM #include #include @@ -957,3 +958,5 @@ const DEVVTBL* NtfsMount(ULONG DeviceId) // return &NtfsFuncTable; } + +#endif From 85446d50caa3a459f39997b0ca8155e2f4fe7140 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:33:31 +0000 Subject: [PATCH 41/97] [FREELDR]: Do not build Disk/Partition support for ARM, we use ram disks. svn path=/trunk/; revision=45521 --- reactos/boot/freeldr/freeldr/disk/disk.c | 3 +++ reactos/boot/freeldr/freeldr/disk/partition.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c index 1ca0a941499..16ee1be7ad9 100644 --- a/reactos/boot/freeldr/freeldr/disk/disk.c +++ b/reactos/boot/freeldr/freeldr/disk/disk.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -167,3 +168,5 @@ DiskNormalizeSystemPath(char *SystemPath, unsigned Size) // This function is in arch/i386/i386disk.c //ULONG DiskGetCacheableBlockCount(ULONG DriveNumber) + +#endif diff --git a/reactos/boot/freeldr/freeldr/disk/partition.c b/reactos/boot/freeldr/freeldr/disk/partition.c index a0198bfff06..7dd07aa230f 100644 --- a/reactos/boot/freeldr/freeldr/disk/partition.c +++ b/reactos/boot/freeldr/freeldr/disk/partition.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -238,3 +239,5 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA return TRUE; } + +#endif From 2e97a01a5d1f2c08aa1a16270c22d55a32800f28 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 9 Feb 2010 02:34:42 +0000 Subject: [PATCH 42/97] add setjmp/longjmp to libcntpr, just like in ms sdks svn path=/trunk/; revision=45522 --- reactos/lib/sdk/crt/libcntpr.rbuild | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/reactos/lib/sdk/crt/libcntpr.rbuild b/reactos/lib/sdk/crt/libcntpr.rbuild index a305d9117ef..9a3f0c80da2 100644 --- a/reactos/lib/sdk/crt/libcntpr.rbuild +++ b/reactos/lib/sdk/crt/libcntpr.rbuild @@ -83,6 +83,14 @@ lfind.c + + + + setjmp.s + + + + qsort.c From f0a8153aec1519b4dafd2a578da53045e24caf18 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:38:23 +0000 Subject: [PATCH 43/97] [FREELDR]: No Linux support for ARM, no RS232 support for ARM, and no complex debug infrastructure for ARM either. svn path=/trunk/; revision=45523 --- reactos/boot/freeldr/freeldr/comm/rs232.c | 7 +++++-- reactos/boot/freeldr/freeldr/debug.c | 2 +- reactos/boot/freeldr/freeldr/include/debug.h | 4 ++-- reactos/boot/freeldr/freeldr/linuxboot.c | 5 +++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/comm/rs232.c b/reactos/boot/freeldr/freeldr/comm/rs232.c index 3e3697a6aa0..dee31ced877 100644 --- a/reactos/boot/freeldr/freeldr/comm/rs232.c +++ b/reactos/boot/freeldr/freeldr/comm/rs232.c @@ -18,6 +18,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ + +#ifndef _M_ARM #include @@ -275,8 +277,6 @@ VOID Rs232PortPutByte(UCHAR ByteToSend) WRITE_PORT_UCHAR (SER_THR(Rs232PortBase), ByteToSend); } -#endif /* DBG */ - BOOLEAN Rs232PortInUse(ULONG Base) { #if DBG @@ -285,3 +285,6 @@ BOOLEAN Rs232PortInUse(ULONG Base) return FALSE; #endif } + +#endif /* DBG */ +#endif diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c index 4053e45e7b7..5496c03d5ad 100644 --- a/reactos/boot/freeldr/freeldr/debug.c +++ b/reactos/boot/freeldr/freeldr/debug.c @@ -21,7 +21,7 @@ #include -#if DBG +#if defined(DBG) && !defined(_M_ARM) //#define DEBUG_ALL //#define DEBUG_INIFILE diff --git a/reactos/boot/freeldr/freeldr/include/debug.h b/reactos/boot/freeldr/freeldr/include/debug.h index b0d3c626ff2..e8f376e5555 100644 --- a/reactos/boot/freeldr/freeldr/include/debug.h +++ b/reactos/boot/freeldr/freeldr/include/debug.h @@ -39,7 +39,7 @@ extern char* g_file; extern int g_line; -#if DBG +#if defined(DBG) && !defined(_M_ARM) VOID DbgPrintMask(ULONG Mask, char *format, ...); VOID DebugInit(VOID); @@ -80,7 +80,7 @@ void MEMORY_WRITE_BREAKPOINT4(unsigned long addr); #else - #define DebugInit() + #define DebugInit(x) #define DPRINTM(_x_, ...) #define BugCheck(_x_) #define DbgDumpBuffer(_x_, _y_, _z_) diff --git a/reactos/boot/freeldr/freeldr/linuxboot.c b/reactos/boot/freeldr/freeldr/linuxboot.c index e3755c97046..10c2017eb0c 100644 --- a/reactos/boot/freeldr/freeldr/linuxboot.c +++ b/reactos/boot/freeldr/freeldr/linuxboot.c @@ -17,10 +17,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM + #include #include - #ifdef __i386__ #define LINUX_READ_CHUNK_SIZE 0x20000 // Read 128k at a time @@ -516,3 +516,4 @@ BOOLEAN LinuxReadInitrd(PFILE LinuxInitrdFile) return TRUE; } #endif /* __i386__ */ +#endif From ba9fe881dac6ae6c56fc1932fa25fa19fd2d017d Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 02:53:45 +0000 Subject: [PATCH 44/97] [FREELDR]: Remove C++ style indirected "UI" component from FreeLDR ARM, for several reasons that ought to be considered on x86 too: - It redraws the screen in two different ways (zero memory and character-by-character fill) over 15 times for a single boot. You notice these things on a little ARM chip! - It keeps coping data from/to an "off-screen buffer" way too much, instead of only when the video needs to be synced. - It makes assumptions about all Video Buffers supporting Character-Mode VGA. - It can be configured to draw cyan/yellow ponies, instead of a normal NT boot menu. The ARM build now uses a "directui.c" implementation which fixes all these issues and is efficient and to the point. It presents a normal Windows boot selection menu on ARM. [FREELDR]: Do not build any of the video routines, or the UI routines, on ARM. svn path=/trunk/; revision=45524 --- reactos/boot/freeldr/freeldr/ui/directui.c | 574 +++++++++++++++++++ reactos/boot/freeldr/freeldr/ui/gui.c | 2 + reactos/boot/freeldr/freeldr/ui/minitui.c | 3 +- reactos/boot/freeldr/freeldr/ui/noui.c | 3 +- reactos/boot/freeldr/freeldr/ui/tui.c | 8 +- reactos/boot/freeldr/freeldr/ui/tuimenu.c | 3 +- reactos/boot/freeldr/freeldr/ui/ui.c | 3 +- reactos/boot/freeldr/freeldr/video/fade.c | 3 +- reactos/boot/freeldr/freeldr/video/palette.c | 4 +- reactos/boot/freeldr/freeldr/video/video.c | 3 +- 10 files changed, 592 insertions(+), 14 deletions(-) create mode 100644 reactos/boot/freeldr/freeldr/ui/directui.c diff --git a/reactos/boot/freeldr/freeldr/ui/directui.c b/reactos/boot/freeldr/freeldr/ui/directui.c new file mode 100644 index 00000000000..2a9db377bd6 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/ui/directui.c @@ -0,0 +1,574 @@ +/* + * PROJECT: ReactOS Boot Loader + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/freeldr/freeldr/ui/directui.c + * PURPOSE: FreeLDR UI Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ +#ifdef _M_ARM + +/* INCLUDES *******************************************************************/ + +#include +#include + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +ULONG UiScreenWidth; +ULONG UiScreenHeight; +UCHAR UiMenuFgColor = COLOR_GRAY; +UCHAR UiMenuBgColor = COLOR_BLACK; +UCHAR UiTextColor = COLOR_GRAY; +UCHAR UiSelectedTextColor = COLOR_BLACK; +UCHAR UiSelectedTextBgColor = COLOR_GRAY; +CHAR UiTimeText[260] = "Seconds until highlighted choice will be started automatically: "; + +INT +TuiPrintf(const char *Format, + ...) +{ + int i; + int Length; + va_list ap; + CHAR Buffer[512]; + + va_start(ap, Format); + Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap); + va_end(ap); + + if (Length == -1) Length = sizeof(Buffer); + + for (i = 0; i < Length; i++) + { + MachConsPutChar(Buffer[i]); + } + + return Length; +} + +BOOLEAN +UiInitialize(IN BOOLEAN ShowGui) +{ + ULONG Depth; + + /* Nothing to do */ + if (!ShowGui) return TRUE; + + /* Set mode and query size */ + MachVideoSetDisplayMode(NULL, TRUE); + MachVideoGetDisplaySize(&UiScreenWidth, &UiScreenHeight, &Depth); + return TRUE; +} + +VOID +UiUnInitialize(IN PCSTR BootText) +{ + /* Nothing to do */ + return; +} + +VOID +UiDrawBackdrop(VOID) +{ + /* Clear the screen */ + MachVideoClearScreen(ATTR(COLOR_WHITE, COLOR_BLACK)); +} + +VOID +UiDrawText(IN ULONG X, + IN ULONG Y, + IN PCSTR Text, + IN UCHAR Attr) +{ + ULONG i, j; + + /* Draw the text character by character, but don't exceed the width */ + for (i = X, j = 0; Text[j] && i < UiScreenWidth; i++, j++) + { + /* Write the character */ + MachVideoPutChar(Text[j], Attr, i, Y); + } +} + +VOID +UiDrawCenteredText(IN ULONG Left, + IN ULONG Top, + IN ULONG Right, + IN ULONG Bottom, + IN PCSTR TextString, + IN UCHAR Attr) +{ + ULONG TextLength, BoxWidth, BoxHeight, LineBreakCount, Index, LastIndex; + ULONG RealLeft, RealTop, X, Y; + CHAR Temp[2]; + + /* Query text length */ + TextLength = strlen(TextString); + + /* Count the new lines and the box width */ + LineBreakCount = 0; + BoxWidth = 0; + LastIndex = 0; + for (Index=0; Index < TextLength; Index++) + { + /* Scan for new lines */ + if (TextString[Index] == '\n') + { + /* Remember the new line */ + LastIndex = Index; + LineBreakCount++; + } + else + { + /* Check for new larger box width */ + if ((Index - LastIndex) > BoxWidth) + { + /* Update it */ + BoxWidth = (Index - LastIndex); + } + } + } + + /* Base the box height on the number of lines */ + BoxHeight = LineBreakCount + 1; + + /* Create the centered coordinates */ + RealLeft = (((Right - Left) - BoxWidth) / 2) + Left; + RealTop = (((Bottom - Top) - BoxHeight) / 2) + Top; + + /* Now go for a second scan */ + LastIndex = 0; + for (Index=0; Index < TextLength; Index++) + { + /* Look for new lines again */ + if (TextString[Index] == '\n') + { + /* Update where the text should start */ + RealTop++; + LastIndex = 0; + } + else + { + /* We've got a line of text to print, do it */ + X = RealLeft + LastIndex; + Y = RealTop; + LastIndex++; + Temp[0] = TextString[Index]; + Temp[1] = 0; + UiDrawText(X, Y, Temp, Attr); + } + } +} + +VOID +UiDrawStatusText(IN PCSTR StatusText) +{ + return; +} + +VOID +UiInfoBox(IN PCSTR MessageText) +{ + TuiPrintf(MessageText); +} + +VOID +UiMessageBox(IN PCSTR MessageText) +{ + TuiPrintf(MessageText); +} + +VOID +UiMessageBoxCritical(IN PCSTR MessageText) +{ + TuiPrintf(MessageText); +} + +VOID +UiDrawProgressBarCenter(IN ULONG Position, + IN ULONG Range, + IN PCHAR ProgressText) +{ + ULONG Left, Top, Right, Bottom, Width, Height; + + /* Build the coordinates and sizes */ + Height = 2; + Width = UiScreenWidth; + Left = 0; + Right = (Left + Width) - 1; + Top = UiScreenHeight - Height - 4; + Bottom = Top + Height + 1; + + /* Draw the progress bar */ + UiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText); +} + +VOID +UiDrawProgressBar(IN ULONG Left, + IN ULONG Top, + IN ULONG Right, + IN ULONG Bottom, + IN ULONG Position, + IN ULONG Range, + IN PCHAR ProgressText) +{ + ULONG i, ProgressBarWidth; + + /* Calculate the width of the bar proper */ + ProgressBarWidth = (Right - Left) - 3; + + /* First make sure the progress bar text fits */ + UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4); + if (Position > Range) Position = Range; + + /* Draw the "Loading..." text */ + UiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, ProgressText, ATTR(7, 0)); + + /* Draw the percent complete */ + for (i = 0; i < (Position * ProgressBarWidth) / Range; i++) + { + /* Use the fill character */ + UiDrawText(Left + 2 + i, Top + 2, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); + } +} + +VOID +UiShowMessageBoxesInSection(IN PCSTR SectionName) +{ + return; +} + +VOID +UiTruncateStringEllipsis(IN PCHAR StringText, + IN ULONG MaxChars) +{ + /* If it's too large, just add some ellipsis past the maximum */ + if (strlen(StringText) > MaxChars) strcpy(&StringText[MaxChars - 3], "..."); +} + +VOID +NTAPI +UiDrawMenuBox(IN PUI_MENU_INFO MenuInfo) +{ + CHAR MenuLineText[80], TempString[80]; + ULONG i; + + /* If there is a timeout draw the time remaining */ + if (MenuInfo->MenuTimeRemaining >= 0) + { + /* Copy the integral time text string, and remove the last 2 chars */ + strcpy(TempString, UiTimeText); + i = strlen(TempString); + TempString[i - 2] = 0; + + /* Display the first part of the string and the remaining time */ + strcpy(MenuLineText, TempString); + _itoa(MenuInfo->MenuTimeRemaining, TempString, 10); + strcat(MenuLineText, TempString); + + /* Add the last 2 chars */ + strcat(MenuLineText, &UiTimeText[i - 2]); + + /* Display under the menu directly */ + UiDrawText(0, + MenuInfo->Bottom + 3, + MenuLineText, + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + else + { + /* Erase the timeout string with spaces, and 0-terminate for sure */ + for (i=0; iBottom + 3, + MenuLineText, + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + + /* Loop each item */ + for (i = 0; i < MenuInfo->MenuItemCount; i++) + { + /* Check if it's a separator */ + if (!(_stricmp(MenuInfo->MenuItemList[i], "SEPARATOR"))) + { + /* Draw the separator line */ + UiDrawText(MenuInfo->Left, + MenuInfo->Top + i + 1, + "\xC7", + ATTR(UiMenuFgColor, UiMenuBgColor)); + UiDrawText(MenuInfo->Right, + MenuInfo->Top + i + 1, + "\xB6", + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + } +} + +VOID +NTAPI +UiDrawMenuItem(IN PUI_MENU_INFO MenuInfo, + IN ULONG MenuItemNumber) +{ + CHAR MenuLineText[80]; + UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor); + + /* Simply left-align it */ + MenuLineText[0] = '\0'; + strcat(MenuLineText, " "); + + /* Now append the text string */ + strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]); + + /* If it is a separator */ + if (!(_stricmp(MenuInfo->MenuItemList[MenuItemNumber], "SEPARATOR"))) + { + /* Make it a separator line and use menu colors */ + memset(MenuLineText, 0, 80); + memset(MenuLineText, 0xC4, (MenuInfo->Right - MenuInfo->Left - 1)); + Attribute = ATTR(UiMenuFgColor, UiMenuBgColor); + } + else if (MenuItemNumber == MenuInfo->SelectedMenuItem) + { + /* If this is the selected item, use the selected colors */ + Attribute = ATTR(UiSelectedTextColor, UiSelectedTextBgColor); + } + + /* Draw the item */ + UiDrawText(MenuInfo->Left + 1, + MenuInfo->Top + 1 + MenuItemNumber, + MenuLineText, + Attribute); +} + +VOID +UiDrawMenu(IN PUI_MENU_INFO MenuInfo) +{ + ULONG i; + + /* No GUI status bar text, just minimal text. first to tell the user to choose */ + UiDrawText(0, + MenuInfo->Top - 2, + "Please select the operating system to start:", + ATTR(UiMenuFgColor, UiMenuBgColor)); + + /* Now tell him how to choose */ + UiDrawText(0, + MenuInfo->Bottom + 1, + "Use the up and down arrow keys to move the highlight to " + "your choice.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + UiDrawText(0, + MenuInfo->Bottom + 2, + "Press ENTER to choose.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + + /* And offer F8 options */ + UiDrawText(0, + UiScreenHeight - 4, + "For troubleshooting and advanced startup options for " + "ReactOS, press F8.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + + /* Draw the menu box */ + UiDrawMenuBox(MenuInfo); + + /* Draw each line of the menu */ + for (i = 0; i < MenuInfo->MenuItemCount; i++) UiDrawMenuItem(MenuInfo, i); +} + +ULONG +NTAPI +UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo, + IN UiMenuKeyPressFilterCallback KeyPressFilter) +{ + ULONG KeyEvent = 0, Selected, Count; + + /* Check for a keypress */ + if (MachConsKbHit()) + { + /* Check if the timeout is not already complete */ + if (MenuInfo->MenuTimeRemaining != -1) + { + // + // Cancel it and remove it + // + MenuInfo->MenuTimeRemaining = -1; + UiDrawMenuBox(MenuInfo); + } + + /* Get the key */ + KeyEvent = MachConsGetCh(); + + /* Is it extended? Then get the extended key */ + if (!KeyEvent) KeyEvent = MachConsGetCh(); + + /* Call the supplied key filter callback function to see if it is going to handle this keypress. */ + if ((KeyPressFilter) && (KeyPressFilter(KeyEvent))) + { + /* It processed the key character, so redraw and exit */ + UiDrawMenu(MenuInfo); + return 0; + } + + /* Process the key */ + if ((KeyEvent == KEY_UP) || (KeyEvent == KEY_DOWN)) + { + /* Get the current selected item and count */ + Selected = MenuInfo->SelectedMenuItem; + Count = MenuInfo->MenuItemCount - 1; + + /* Check if this was a key up and there's a selected menu item */ + if ((KeyEvent == KEY_UP) && (Selected)) + { + /* Update the menu (Deselect previous item) */ + MenuInfo->SelectedMenuItem--; + UiDrawMenuItem(MenuInfo, Selected); + Selected--; + + /* Skip past any separators */ + if ((Selected) && + !(_stricmp(MenuInfo->MenuItemList[Selected], "SEPARATOR"))) + { + MenuInfo->SelectedMenuItem--; + } + } + else if ((KeyEvent == KEY_DOWN) && (Selected < Count)) + { + /* Update the menu (deselect previous item) */ + MenuInfo->SelectedMenuItem++; + UiDrawMenuItem(MenuInfo, Selected); + Selected++; + + /* Skip past any separators */ + if ((Selected < Count) && + !(_stricmp(MenuInfo->MenuItemList[Selected], "SEPARATOR"))) + { + MenuInfo->SelectedMenuItem++; + } + } + + /* Select new item and update video buffer */ + UiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem); + } + } + + /* Return the pressed key */ + return KeyEvent; +} + +VOID +NTAPI +UiCalcMenuBoxSize(IN PUI_MENU_INFO MenuInfo) +{ + ULONG i, Width = 0, Height, Length; + + /* Height is the menu item count plus 2 (top border & bottom border) */ + Height = MenuInfo->MenuItemCount + 2; + Height -= 1; // Height is zero-based + + /* Loop every item */ + for (i = 0; i < MenuInfo->MenuItemCount; i++) + { + /* Get the string length and make it become the new width if necessary */ + Length = strlen(MenuInfo->MenuItemList[i]); + if (Length > Width) Width = Length; + } + + /* Allow room for left & right borders, plus 8 spaces on each side */ + Width += 18; + + /* Put the menu in the default left-corner position */ + MenuInfo->Left = -1; + MenuInfo->Top = 4; + + /* The other margins are the same */ + MenuInfo->Right = (MenuInfo->Left) + Width; + MenuInfo->Bottom = (MenuInfo->Top) + Height; +} + +BOOLEAN +UiDisplayMenu(IN PCSTR MenuItemList[], + IN ULONG MenuItemCount, + IN ULONG DefaultMenuItem, + IN LONG MenuTimeOut, + OUT PULONG SelectedMenuItem, + IN BOOLEAN CanEscape, + IN UiMenuKeyPressFilterCallback KeyPressFilter) +{ + UI_MENU_INFO MenuInformation; + ULONG LastClockSecond; + ULONG CurrentClockSecond; + ULONG KeyPress; + + /* Check if there's no timeout */ + if (!MenuTimeOut) + { + /* Return the default selected item */ + if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem; + return TRUE; + } + + /* Setup the MENU_INFO structure */ + MenuInformation.MenuItemList = MenuItemList; + MenuInformation.MenuItemCount = MenuItemCount; + MenuInformation.MenuTimeRemaining = MenuTimeOut; + MenuInformation.SelectedMenuItem = DefaultMenuItem; + + /* Calculate the size of the menu box */ + UiCalcMenuBoxSize(&MenuInformation); + + /* Draw the menu */ + UiDrawMenu(&MenuInformation); + + /* Get the current second of time */ + LastClockSecond = ArcGetTime()->Second; + + /* Process keys */ + while (TRUE) + { + /* Process key presses */ + KeyPress = UiProcessMenuKeyboardEvent(&MenuInformation, + KeyPressFilter); + + /* Check for ENTER or ESC */ + if (KeyPress == KEY_ENTER) break; + if (CanEscape && KeyPress == KEY_ESC) return FALSE; + + /* Check if there is a countdown */ + if (MenuInformation.MenuTimeRemaining) + { + /* Get the updated time, seconds only */ + CurrentClockSecond = ArcGetTime()->Second; + + /* Check if more then a second has now elapsed */ + if (CurrentClockSecond != LastClockSecond) + { + /* Update the time information */ + LastClockSecond = CurrentClockSecond; + MenuInformation.MenuTimeRemaining--; + + /* Update the menu */ + UiDrawMenuBox(&MenuInformation); + } + } + else + { + /* A time out occurred, exit this loop and return default OS */ + break; + } + } + + /* Return the selected item */ + if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem; + return TRUE; +} + +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/gui.c b/reactos/boot/freeldr/freeldr/ui/gui.c index e188ecd9a97..56b0faa7641 100644 --- a/reactos/boot/freeldr/freeldr/ui/gui.c +++ b/reactos/boot/freeldr/freeldr/ui/gui.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include VOID GuiDrawBackdrop(VOID) @@ -103,3 +104,4 @@ const UIVTBL GuiVtbl = NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/minitui.c b/reactos/boot/freeldr/freeldr/ui/minitui.c index bbc36a82dd8..adaa68c777d 100644 --- a/reactos/boot/freeldr/freeldr/ui/minitui.c +++ b/reactos/boot/freeldr/freeldr/ui/minitui.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Brian Palmer * Hervé Poussineau */ - +#ifndef _M_ARM #include VOID MiniTuiDrawBackdrop(VOID) @@ -154,3 +154,4 @@ const UIVTBL MiniTuiVtbl = TuiDisplayMenu, MiniTuiDrawMenu, }; +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/noui.c b/reactos/boot/freeldr/freeldr/ui/noui.c index a52c81cf45c..433ddb73387 100644 --- a/reactos/boot/freeldr/freeldr/ui/noui.c +++ b/reactos/boot/freeldr/freeldr/ui/noui.c @@ -5,7 +5,7 @@ * PURPOSE: No Text UI interface * PROGRAMMERS: Hervé Poussineau */ - +#ifndef _M_ARM #include BOOLEAN NoUiInitialize(VOID) @@ -118,3 +118,4 @@ BOOLEAN NoUiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG Default VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo) { } +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c index d0016f463a8..91356d28122 100644 --- a/reactos/boot/freeldr/freeldr/ui/tui.c +++ b/reactos/boot/freeldr/freeldr/ui/tui.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include PVOID TextVideoBuffer = NULL; @@ -325,13 +325,8 @@ VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr) // Draw the text for (i=X, j=0; Text[j] && i /* FUNCTIONS *****************************************************************/ @@ -530,3 +530,4 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo, // return KeyEvent; } +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/ui.c b/reactos/boot/freeldr/freeldr/ui/ui.c index 4864f0adb40..9a6a237f27e 100644 --- a/reactos/boot/freeldr/freeldr/ui/ui.c +++ b/reactos/boot/freeldr/freeldr/ui/ui.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include #include @@ -496,3 +496,4 @@ BOOLEAN UiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length) { return UiVtbl.EditBox(MessageText, EditTextBuffer, Length); } +#endif diff --git a/reactos/boot/freeldr/freeldr/video/fade.c b/reactos/boot/freeldr/freeldr/video/fade.c index 9839f2afaab..4cfd4352d46 100644 --- a/reactos/boot/freeldr/freeldr/video/fade.c +++ b/reactos/boot/freeldr/freeldr/video/fade.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include #define RGB_MAX 64 @@ -130,3 +130,4 @@ VOID VideoFadeOut(ULONG ColorCount) } } } +#endif diff --git a/reactos/boot/freeldr/freeldr/video/palette.c b/reactos/boot/freeldr/freeldr/video/palette.c index 8b1f469531c..c631648381a 100644 --- a/reactos/boot/freeldr/freeldr/video/palette.c +++ b/reactos/boot/freeldr/freeldr/video/palette.c @@ -16,9 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include - VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount) { ULONG Color; @@ -40,3 +39,4 @@ VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount) MachVideoSetPaletteColor(Color, Palette[Color].Red, Palette[Color].Green, Palette[Color].Blue); } } +#endif diff --git a/reactos/boot/freeldr/freeldr/video/video.c b/reactos/boot/freeldr/freeldr/video/video.c index 0f9fc9a14eb..5401d81320e 100644 --- a/reactos/boot/freeldr/freeldr/video/video.c +++ b/reactos/boot/freeldr/freeldr/video/video.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include PVOID VideoOffScreenBuffer = NULL; @@ -42,3 +42,4 @@ VOID VideoCopyOffScreenBufferToVRAM(VOID) { MachVideoCopyOffScreenBufferToVRAM(VideoOffScreenBuffer); } +#endif From 7cd39aa34b66534d77d22fa1fa6a64d0b0a0452f Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 03:05:49 +0000 Subject: [PATCH 45/97] [MISC]: Build fixes to sync up with latest changes. [SETUPLDR]: Do not build on ARM. On a side note, I offer a bountry for "if ARCH != ARM" support in .rbuild files, instead of only allowing ==. svn path=/trunk/; revision=45525 --- reactos/boot/freeldr/freeldr.rbuild | 14 ++++++++++++-- reactos/include/reactos/arm/armddk.h | 4 +--- reactos/ntoskrnl/include/internal/arm/mm.h | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/reactos/boot/freeldr/freeldr.rbuild b/reactos/boot/freeldr/freeldr.rbuild index a21fea7f88d..422cd3cc1df 100644 --- a/reactos/boot/freeldr/freeldr.rbuild +++ b/reactos/boot/freeldr/freeldr.rbuild @@ -10,8 +10,18 @@ - - + + + + + + + + + + + + diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h index 54bfa15c71a..68262c2b9d7 100644 --- a/reactos/include/reactos/arm/armddk.h +++ b/reactos/include/reactos/arm/armddk.h @@ -122,9 +122,7 @@ typedef struct _CONTEXT { // Processor Control Region // #ifdef _WINNT_H -typedef -VOID -(*PKINTERRUPT_ROUTINE)(VOID); +#define KIRQL ULONG #endif typedef struct _KPCR { diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index 4266f09c40e..26fa9e6e8c8 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -111,12 +111,12 @@ PULONG MmGetPageDirectory(VOID); #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1) #define MI_MAKE_DIRTY_PAGE(x) -#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Access = 1) // FIXFIX -#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.ExtendedAccess = 1) // FIXFIX +#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Owner = 1) +#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.ReadOnly = 0) #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.Cached = 0) #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.Buffered = 0) #define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.Buffered = 1) -#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ExtendedAccess == 0) +#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ReadOnly == 0) #define MI_IS_PAGE_COPY_ON_WRITE(x)FALSE #define MI_IS_PAGE_DIRTY(x) TRUE From 8c8041b1d656df4f76ae6fa64e2f3186fa1dbfb2 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 03:10:07 +0000 Subject: [PATCH 46/97] [FREELDR]: Use WinLDR-style booting exclusively for ARM. Remove thousands of lines of old code where we basically did the same thing. [FREELDR]: Build WinLDR for ARM too, and implement the required portability functions to get it working. Don't build "ros-style" loading on ARM. [FREELDR]: Redo from scratch the entire paging setup for ARM. Instead of using 20MB of physical RAM, we now only use 1MB that's passed on to the kernel. [FREELDR]: Fix loads of bugs in the ARM loader code (ha-ha!). [FREELDR]: Cleanup compiler and linker flags in the rbuild files. [ARMLLB]: Remove all deprecated video machine routines that are not used anymore. If all went well, the ARM port should now boot on Versatile platforms up until the ARM3 initialization code. svn path=/trunk/; revision=45526 --- reactos/boot/armllb/fw.c | 106 +- reactos/boot/armllb/os/loader.c | 9 - .../boot/freeldr/freeldr/arch/arm/loader.c | 1431 ----------------- .../boot/freeldr/freeldr/arch/arm/macharm.c | 192 ++- reactos/boot/freeldr/freeldr/bootmgr.c | 4 + .../boot/freeldr/freeldr/freeldr_arch.rbuild | 19 +- .../boot/freeldr/freeldr/freeldr_base.rbuild | 30 +- .../freeldr/freeldr/freeldr_base64k.rbuild | 4 - .../boot/freeldr/freeldr/freeldr_main.rbuild | 4 - .../freeldr/freeldr/freeldr_startup.rbuild | 4 - .../freeldr/include/arch/arm/hardware.h | 29 +- .../boot/freeldr/freeldr/reactos/imageldr.c | 3 +- .../boot/freeldr/freeldr/reactos/reactos.c | 3 + .../freeldr/freeldr/windows/arm/wlmemory.c | 256 +++ .../boot/freeldr/freeldr/windows/wlmemory.c | 4 + 15 files changed, 402 insertions(+), 1696 deletions(-) delete mode 100644 reactos/boot/freeldr/freeldr/arch/arm/loader.c create mode 100644 reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c diff --git a/reactos/boot/armllb/fw.c b/reactos/boot/armllb/fw.c index 82dcd7a4c22..4286b4ababa 100644 --- a/reactos/boot/armllb/fw.c +++ b/reactos/boot/armllb/fw.c @@ -8,6 +8,26 @@ #include "precomp.h" +USHORT ColorPalette[16][3] = +{ + {0x00, 0x00, 0x00}, + {0x00, 0x00, 0xAA}, + {0x00, 0xAA, 0x00}, + {0x00, 0xAA, 0xAA}, + {0xAA, 0x00, 0x00}, + {0xAA, 0x00, 0xAA}, + {0xAA, 0x55, 0x00}, + {0xAA, 0xAA, 0xAA}, + {0x55, 0x55, 0x55}, + {0x55, 0x55, 0xFF}, + {0x55, 0xFF, 0x55}, + {0x55, 0xFF, 0xFF}, + {0xFF, 0x55, 0x55}, + {0xFF, 0x55, 0xFF}, + {0xFF, 0xFF, 0x55}, + {0xFF, 0xFF, 0xFF}, +}; + VOID LlbFwPutChar(INT Ch) { @@ -53,55 +73,6 @@ LlbFwVideoGetDisplaySize(OUT PULONG Width, *Depth = 16; } -ULONG -LlbFwVideoGetBufferSize(VOID) -{ - /* X * Y * BPP */ - return LlbHwGetScreenWidth() * LlbHwGetScreenHeight() * 2; -} - -VOID -LlbFwVideoSetTextCursorPosition(IN ULONG X, - IN ULONG Y) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); -} - -VOID -LlbFwVideoHideShowTextCursor(IN BOOLEAN Show) -{ - /* Nothing to do */ - return; -} - -USHORT ColorPalette[16][3] = -{ - {0x00, 0x00, 0x00}, - {0x00, 0x00, 0xAA}, - {0x00, 0xAA, 0x00}, - {0x00, 0xAA, 0xAA}, - {0xAA, 0x00, 0x00}, - {0xAA, 0x00, 0xAA}, - {0xAA, 0x55, 0x00}, - {0xAA, 0xAA, 0xAA}, - {0x55, 0x55, 0x55}, - {0x55, 0x55, 0xFF}, - {0x55, 0xFF, 0x55}, - {0x55, 0xFF, 0xFF}, - {0xFF, 0x55, 0x55}, - {0xFF, 0x55, 0xFF}, - {0xFF, 0xFF, 0x55}, - {0xFF, 0xFF, 0xFF}, -}; - -VOID -LlbFwVideoCopyOffScreenBufferToVRAM(IN PVOID Buffer) -{ - /* No double-buffer is used on ARM */ - return; -} - VOID LlbFwVideoClearScreen(IN UCHAR Attr) { @@ -133,43 +104,6 @@ LlbFwVideoPutChar(IN INT c, LlbVideoDrawChar(c, Buffer, Color, BackColor); } -BOOLEAN -LlbFwVideoIsPaletteFixed(VOID) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return TRUE; -} - -VOID -LlbFwVideoSetPaletteColor(IN UCHAR Color, - IN UCHAR Red, - IN UCHAR Green, - IN UCHAR Blue) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return; -} - -VOID -LlbFwVideoGetPaletteColor(IN UCHAR Color, - OUT PUCHAR Red, - OUT PUCHAR Green, - OUT PUCHAR Blue) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return; -} - -VOID -LlbFwVideoSync(VOID) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return; -} TIMEINFO* LlbFwGetTime(VOID) diff --git a/reactos/boot/armllb/os/loader.c b/reactos/boot/armllb/os/loader.c index 7d0e9fcf995..5b7caa65578 100755 --- a/reactos/boot/armllb/os/loader.c +++ b/reactos/boot/armllb/os/loader.c @@ -76,16 +76,7 @@ LlbBuildArmBlock(VOID) ArmBlock.VideoClearScreen = LlbFwVideoClearScreen; ArmBlock.VideoSetDisplayMode = LlbFwVideoSetDisplayMode; ArmBlock.VideoGetDisplaySize = LlbFwVideoGetDisplaySize; - ArmBlock.VideoGetBufferSize = LlbFwVideoGetBufferSize; - ArmBlock.VideoSetTextCursorPosition = LlbFwVideoSetTextCursorPosition; - ArmBlock.VideoSetTextCursorPosition = LlbFwVideoSetTextCursorPosition; - ArmBlock.VideoHideShowTextCursor = LlbFwVideoHideShowTextCursor; ArmBlock.VideoPutChar = LlbFwVideoPutChar; - ArmBlock.VideoCopyOffScreenBufferToVRAM = LlbFwVideoCopyOffScreenBufferToVRAM; - ArmBlock.VideoIsPaletteFixed = LlbFwVideoIsPaletteFixed; - ArmBlock.VideoSetPaletteColor = LlbFwVideoSetPaletteColor; - ArmBlock.VideoGetPaletteColor = LlbFwVideoGetPaletteColor; - ArmBlock.VideoSync = LlbFwVideoSync; ArmBlock.GetTime = LlbFwGetTime; } diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c deleted file mode 100644 index fadce699c6b..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c +++ /dev/null @@ -1,1431 +0,0 @@ -/* - * PROJECT: ReactOS Boot Loader - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: boot/freeldr/arch/arm/loader.c - * PURPOSE: ARM Kernel Loader - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#include -#include -#include - -#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x &~ KSEG0_BASE) >> PAGE_SHIFT) - -/* GLOBALS ********************************************************************/ - -typedef struct _BIOS_MEMORY_DESCRIPTOR -{ - ULONG BlockBase; - ULONG BlockSize; -} BIOS_MEMORY_DESCRIPTOR, *PBIOS_MEMORY_DESCRIPTOR; - -ULONG PageDirectoryStart, PageDirectoryEnd; -PLOADER_PARAMETER_BLOCK ArmLoaderBlock; -CHAR ArmCommandLine[256]; -CHAR ArmArcBootPath[64]; -CHAR ArmArcHalPath[64]; -CHAR ArmNtHalPath[64]; -CHAR ArmNtBootPath[64]; -PNLS_DATA_BLOCK ArmNlsDataBlock; -PLOADER_PARAMETER_EXTENSION ArmExtension; -BIOS_MEMORY_DESCRIPTOR ArmBoardMemoryDescriptors[16] = {{0}}; -PBIOS_MEMORY_DESCRIPTOR ArmBoardMemoryList = ArmBoardMemoryDescriptors; -ULONG NumberDescriptors = 0; -MEMORY_DESCRIPTOR MDArray[16] = {{0}}; -ULONG ArmSharedHeapSize; -PCHAR ArmSharedHeap; - -extern PAGE_DIRECTORY_ARM startup_pagedirectory; -extern PAGE_TABLE_ARM kernel_pagetable; -extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint; -extern ULONG_PTR KernelBase; - -extern ADDRESS_RANGE ArmBoardMemoryMap[16]; -extern ULONG ArmBoardMemoryMapRangeCount; -extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData, KernelData, HalData, DriverData[16]; -extern ULONG RegistrySize, AnsiSize, OemSize, UnicodeSize, KernelSize, HalSize, DriverSize[16]; -extern PCHAR DriverName[16]; -extern ULONG Drivers; -extern ULONG BootStack; - -ULONG SizeBits[] = -{ - -1, // INVALID - -1, // INVALID - 1 << 12, // 4KB - 1 << 13, // 8KB - 1 << 14, // 16KB - 1 << 15, // 32KB - 1 << 16, // 64KB - 1 << 17 // 128KB -}; - -ULONG AssocBits[] = -{ - -1, // INVALID - -1, // INVALID - 4 // 4-way associative -}; - -ULONG LenBits[] = -{ - -1, // INVALID - -1, // INVALID - 8 // 8 words per line (32 bytes) -}; - -// -// Where to map the serial port -// -#define UART_VIRTUAL 0xE0000000 - -/* FUNCTIONS ******************************************************************/ - -PVOID -ArmAllocateFromSharedHeap(IN ULONG Size) -{ - PVOID Buffer; - - // - // Allocate from the shared heap - // - Buffer = &ArmSharedHeap[ArmSharedHeapSize]; - ArmSharedHeapSize += Size; - return Buffer; -} - -PMEMORY_ALLOCATION_DESCRIPTOR -NTAPI -ArmAllocateMemoryDescriptor(VOID) -{ - // - // Allocate a descriptor from the heap - // - return ArmAllocateFromSharedHeap(sizeof(MEMORY_ALLOCATION_DESCRIPTOR)); -} - -VOID -NTAPI -ArmAddBoardMemoryDescriptor(IN ULONG Address, - IN ULONG Size) -{ - PBIOS_MEMORY_DESCRIPTOR BiosBlock = ArmBoardMemoryList; - - // - // Loop board DRAM configuration - // - while (BiosBlock->BlockSize > 0) - { - /* Check if we've found a matching head block */ - if (Address + Size == BiosBlock->BlockBase) - { - /* Simply enlarge and rebase it */ - BiosBlock->BlockBase = Address; - BiosBlock->BlockSize += Size; - break; - } - - /* Check if we've found a matching tail block */ - if (Address == (BiosBlock->BlockBase + BiosBlock->BlockSize)) - { - /* Simply enlarge it */ - BiosBlock->BlockSize += Size; - break; - } - - /* Nothing suitable found, try the next block */ - BiosBlock++; - } - - /* No usable blocks found, found a free block instead */ - if (!BiosBlock->BlockSize) - { - /* Write our data */ - BiosBlock->BlockBase = Address; - BiosBlock->BlockSize = Size; - - /* Create a new block and mark it as the end of the array */ - BiosBlock++; - BiosBlock->BlockBase = BiosBlock->BlockSize = 0L; - } -} - -VOID -NTAPI -ArmBuildBoardMemoryMap(VOID) -{ - ULONG BlockBegin, BlockEnd; - ULONG j; - - /* Loop the BIOS Memory Map */ - for (j = 0; j < ArmBoardMemoryMapRangeCount; j++) - { - /* Get the start and end addresses */ - BlockBegin = ArmBoardMemoryMap[j].BaseAddrLow; - BlockEnd = ArmBoardMemoryMap[j].BaseAddrLow + ArmBoardMemoryMap[j].LengthLow - 1; - - /* Make sure this isn't a > 4GB descriptor */ - if (!ArmBoardMemoryMap[j].BaseAddrHigh) - { - /* Make sure we don't overflow */ - if (BlockEnd < BlockBegin) BlockEnd = 0xFFFFFFFF; - - /* Check if this is free memory */ - if (ArmBoardMemoryMap[j].Type == 1) - { - /* Add it to our BIOS descriptors */ - ArmAddBoardMemoryDescriptor(BlockBegin, BlockEnd - BlockBegin + 1); - } - } - } -} - -NTSTATUS -NTAPI -ArmConfigureArcDescriptor(IN ULONG PageBegin, - IN ULONG PageEnd, - IN TYPE_OF_MEMORY MemoryType) -{ - ULONG i; - ULONG BlockBegin, BlockEnd; - MEMORY_TYPE BlockType; - BOOLEAN Combined = FALSE; - - /* If this descriptor seems bogus, just return */ - if (PageEnd <= PageBegin) return STATUS_SUCCESS; - - /* Loop every ARC descriptor, trying to find one we can modify */ - for (i = 0; i < NumberDescriptors; i++) - { - /* Get its settings */ - BlockBegin = MDArray[i].BasePage; - BlockEnd = MDArray[i].BasePage + MDArray[i].PageCount; - BlockType = MDArray[i].MemoryType; - - /* Check if we can fit inside this block */ - if (BlockBegin < PageBegin) - { - /* Check if we are larger then it */ - if ((BlockEnd > PageBegin) && (BlockEnd <= PageEnd)) - { - /* Make it end where we start */ - BlockEnd = PageBegin; - } - - /* Check if it ends after we do */ - if (BlockEnd > PageEnd) - { - /* Make sure we can allocate a descriptor */ - if (NumberDescriptors == 60) return ENOMEM; - - /* Create a descriptor for whatever memory we're not part of */ - MDArray[NumberDescriptors].MemoryType = BlockType; - MDArray[NumberDescriptors].BasePage = PageEnd; - MDArray[NumberDescriptors].PageCount = BlockEnd - PageEnd; - NumberDescriptors++; - - /* The next block ending is now where we begin */ - BlockEnd = PageBegin; - } - } - else - { - /* Check if the blog begins inside our range */ - if (BlockBegin < PageEnd) - { - /* Check if it ends before we do */ - if (BlockEnd < PageEnd) - { - /* Then make it disappear */ - BlockEnd = BlockBegin; - } - else - { - /* Otherwise make it start where we end */ - BlockBegin = PageEnd; - } - } - } - - /* Check if the block matches us, and we haven't tried combining yet */ - if ((BlockType == MemoryType) && !(Combined)) - { - /* Check if it starts where we end */ - if (BlockBegin == PageEnd) - { - /* Make it start with us, and combine us */ - BlockBegin = PageBegin; - Combined = TRUE; - } - else if (BlockEnd == PageBegin) - { - /* Otherwise, it ends where we begin, combine its ending */ - BlockEnd = PageEnd; - Combined = TRUE; - } - } - - /* Check the original block data matches with what we came up with */ - if ((MDArray[i].BasePage == BlockBegin) && - (MDArray[i].PageCount == BlockEnd - BlockBegin)) - { - /* Then skip it */ - continue; - } - - /* Otherwise, set our new settings for this block */ - MDArray[i].BasePage = BlockBegin; - MDArray[i].PageCount = BlockEnd - BlockBegin; - - /* Check if we are killing the block */ - if (BlockBegin == BlockEnd) - { - /* Delete this block and restart the loop properly */ - NumberDescriptors--; - if (i < NumberDescriptors) MDArray[i] = MDArray[NumberDescriptors]; - i--; - } - } - - /* If we got here without combining, we need to allocate a new block */ - if (!(Combined) && (MemoryType < LoaderMaximum)) - { - /* Make sure there's enough descriptors */ - if (NumberDescriptors == 60) return ENOMEM; - - /* Allocate a new block with our data */ - MDArray[NumberDescriptors].MemoryType = MemoryType; - MDArray[NumberDescriptors].BasePage = PageBegin; - MDArray[NumberDescriptors].PageCount = PageEnd - PageBegin; - NumberDescriptors++; - } - - /* Changes complete, return success */ - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ArmBuildOsMemoryMap(VOID) -{ - PBIOS_MEMORY_DESCRIPTOR MdBlock; - ULONG BlockStart, BlockEnd, BiasedStart, BiasedEnd, PageStart, PageEnd; - NTSTATUS Status = STATUS_SUCCESS; - - /* Loop the BIOS Memory Descriptor List */ - MdBlock = ArmBoardMemoryList; - while (MdBlock->BlockSize) - { - /* Get the statrt and end addresses */ - BlockStart = MdBlock->BlockBase; - BlockEnd = BlockStart + MdBlock->BlockSize - 1; - - /* Align them to page boundaries */ - BiasedStart = BlockStart & (PAGE_SIZE - 1); - if (BiasedStart) BlockStart = BlockStart + PAGE_SIZE - BiasedStart; - BiasedEnd = (BlockEnd + 1) & (ULONG)(PAGE_SIZE - 1); - if (BiasedEnd) BlockEnd -= BiasedEnd; - - /* Get the actual page numbers */ - PageStart = BlockStart >> PAGE_SHIFT; - PageEnd = (BlockEnd + 1) >> PAGE_SHIFT; - - /* Check if we did any alignment */ - if (BiasedStart) - { - /* Mark that region as reserved */ - Status = ArmConfigureArcDescriptor(PageStart - 1, - PageStart, - MemorySpecialMemory); - if (Status != STATUS_SUCCESS) break; - } - - /* Check if we did any alignment */ - if (BiasedEnd) - { - /* Mark that region as reserved */ - Status = ArmConfigureArcDescriptor(PageEnd - 1, - PageEnd, - MemorySpecialMemory); - if (Status != STATUS_SUCCESS) break; - } - - /* It is, mark the memory a free */ - Status = ArmConfigureArcDescriptor(PageStart, - PageEnd, - LoaderFree); - - /* If we failed, break out, otherwise, go to the next BIOS block */ - if (Status != STATUS_SUCCESS) break; - MdBlock++; - } - - /* Return error code */ - return Status; -} - -VOID -NTAPI -ArmInsertMemoryDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor) -{ - PLIST_ENTRY ListHead, PreviousEntry, NextEntry; - PMEMORY_ALLOCATION_DESCRIPTOR Descriptor = NULL, NextDescriptor = NULL; - - /* Loop the memory descriptor list */ - ListHead = &ArmLoaderBlock->MemoryDescriptorListHead; - PreviousEntry = ListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptor and check if it's below ours */ - NextDescriptor = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if (NewDescriptor->BasePage < NextDescriptor->BasePage) break; - - /* It isn't, save the previous entry and descriptor, and try again */ - PreviousEntry = NextEntry; - Descriptor = NextDescriptor; - NextEntry = NextEntry->Flink; - } - - /* So we found the right spot to insert. Is this free memory? */ - if (NewDescriptor->MemoryType != LoaderFree) - { - /* It isn't, so insert us before the last descriptor */ - InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); - } - else - { - /* We're free memory. Check if the entry we found is also free memory */ - if ((PreviousEntry != ListHead) && - ((Descriptor->MemoryType == LoaderFree) || - (Descriptor->MemoryType == LoaderReserve)) && - ((Descriptor->BasePage + Descriptor->PageCount) == - NewDescriptor->BasePage)) - { - /* It's free memory, and we're right after it. Enlarge that block */ - Descriptor->PageCount += NewDescriptor->PageCount; - NewDescriptor = Descriptor; - } - else - { - /* Our range scan't be combined, so just insert us separately */ - InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); - } - - /* Check if we merged with an existing free memory block */ - if ((NextEntry != ListHead) && - ((NextDescriptor->MemoryType == LoaderFree) || - (NextDescriptor->MemoryType == LoaderReserve)) && - ((NewDescriptor->BasePage + NewDescriptor->PageCount) == - NextDescriptor->BasePage)) - { - /* Update our own block */ - NewDescriptor->PageCount += NextDescriptor->PageCount; - - /* Remove the next block */ - RemoveEntryList(&NextDescriptor->ListEntry); - } - } -} - -NTSTATUS -NTAPI -ArmBuildMemoryDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor, - IN MEMORY_TYPE MemoryType, - IN ULONG BasePage, - IN ULONG PageCount) -{ - PMEMORY_ALLOCATION_DESCRIPTOR Descriptor, NextDescriptor = NULL; - LONG Delta; - TYPE_OF_MEMORY CurrentType; - BOOLEAN UseNext; - - /* Check how many pages we'll be consuming */ - Delta = BasePage - MemoryDescriptor->BasePage; - if (!(Delta) && (PageCount == MemoryDescriptor->PageCount)) - { - /* We can simply convert the current descriptor into our new type */ - MemoryDescriptor->MemoryType = MemoryType; - } - else - { - /* Get the current memory type of the descriptor, and reserve it */ - CurrentType = MemoryDescriptor->MemoryType; - MemoryDescriptor->MemoryType = LoaderSpecialMemory; - - /* Check if we'll need another descriptor for what's left of memory */ - UseNext = ((BasePage != MemoryDescriptor->BasePage) && - (Delta + PageCount != MemoryDescriptor->PageCount)); - - /* Get a descriptor */ - Descriptor = ArmAllocateMemoryDescriptor(); - if (!Descriptor) return STATUS_INSUFFICIENT_RESOURCES; - - /* Check if we are using another descriptor */ - if (UseNext) - { - /* Allocate that one too */ - NextDescriptor = ArmAllocateMemoryDescriptor(); - if (!NextDescriptor) return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Build the descriptor we got */ - Descriptor->MemoryType = MemoryType; - Descriptor->BasePage = BasePage; - Descriptor->PageCount = PageCount; - - /* Check if we're starting at the same place as the old one */ - if (BasePage == MemoryDescriptor->BasePage) - { - /* Simply decrease the old descriptor and rebase it */ - MemoryDescriptor->BasePage += PageCount; - MemoryDescriptor->PageCount -= PageCount; - MemoryDescriptor->MemoryType = CurrentType; - } - else if (Delta + PageCount == MemoryDescriptor->PageCount) - { - /* We finish where the old one did, shorten it */ - MemoryDescriptor->PageCount -= PageCount; - MemoryDescriptor->MemoryType = CurrentType; - } - else - { - /* We're inside the current block, mark our free region */ - NextDescriptor->MemoryType = LoaderFree; - NextDescriptor->BasePage = BasePage + PageCount; - NextDescriptor->PageCount = MemoryDescriptor->PageCount - - (PageCount + Delta); - - /* And cut down the current descriptor */ - MemoryDescriptor->PageCount = Delta; - MemoryDescriptor->MemoryType = CurrentType; - - /* Finally, insert our new free descriptor into the list */ - ArmInsertMemoryDescriptor(NextDescriptor); - } - - /* Insert the descriptor we allocated */ - ArmInsertMemoryDescriptor(Descriptor); - } - - /* Return success */ - return STATUS_SUCCESS; -} - -PMEMORY_ALLOCATION_DESCRIPTOR -NTAPI -ArmFindMemoryDescriptor(IN ULONG BasePage) -{ - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock = NULL; - PLIST_ENTRY NextEntry, ListHead; - - /* Scan the memory descriptor list */ - ListHead = &ArmLoaderBlock->MemoryDescriptorListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptor */ - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - - /* Check if it can contain our memory range */ - if ((MdBlock->BasePage <= BasePage) && - (MdBlock->BasePage + MdBlock->PageCount > BasePage)) - { - /* It can, break out */ - break; - } - - /* Go to the next descriptor */ - NextEntry = NextEntry->Flink; - } - - /* Return the descriptor we found, if any */ - return MdBlock; -} - -NTSTATUS -NTAPI -ArmCreateMemoryDescriptor(IN TYPE_OF_MEMORY MemoryType, - IN ULONG BasePage, - IN ULONG PageCount, - IN ULONG Alignment, - OUT PULONG ReturnedBase) -{ - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; - ULONG AlignedBase, AlignedLimit; - PMEMORY_ALLOCATION_DESCRIPTOR ActiveMdBlock; - ULONG ActiveAlignedBase = 0; - PLIST_ENTRY NextEntry, ListHead; - - /* If no information was given, make some assumptions */ - if (!Alignment) Alignment = 1; - if (!PageCount) PageCount = 1; - - /* Start looking for a matching descvriptor */ - do - { - /* Calculate the limit of the range */ - AlignedLimit = PageCount + BasePage; - - /* Find a descriptor that already contains our base address */ - MdBlock = ArmFindMemoryDescriptor(BasePage); - if (MdBlock) - { - /* If it contains our limit as well, break out early */ - if ((MdBlock->PageCount + MdBlock->BasePage) >= AlignedLimit) break; - } - - /* Loop the memory list */ - AlignedBase = 0; - ActiveMdBlock = NULL; - ListHead = &ArmLoaderBlock->MemoryDescriptorListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptors */ - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - - /* Align the base address and our limit */ - AlignedBase = (MdBlock->BasePage + (Alignment - 1)) &~ Alignment; - AlignedLimit = MdBlock->PageCount - - AlignedBase + - MdBlock->BasePage; - - /* Check if this is a free block that can satisfy us */ - if ((MdBlock->MemoryType == LoaderFree) && - (AlignedLimit <= MdBlock->PageCount) && - (PageCount <= AlignedLimit)) - { - /* It is, stop searching */ - ActiveMdBlock = MdBlock; - ActiveAlignedBase = AlignedBase; - break; - } - - /* Try the next block */ - NextEntry = NextEntry->Flink; - } - - /* See if we came up with an adequate block */ - if (ActiveMdBlock) - { - /* Generate a descriptor in it */ - *ReturnedBase = AlignedBase; - return ArmBuildMemoryDescriptor(ActiveMdBlock, - MemoryType, - ActiveAlignedBase, - PageCount); - } - } while (TRUE); - - /* We found a matching block, generate a descriptor with it */ - *ReturnedBase = BasePage; - return ArmBuildMemoryDescriptor(MdBlock, MemoryType, BasePage, PageCount); -} - -NTSTATUS -NTAPI -ArmBuildLoaderMemoryList(VOID) -{ - PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; - MEMORY_DESCRIPTOR *Memory; - ULONG i; - - /* Loop all BIOS Memory Descriptors */ - for (i = 0; i < NumberDescriptors; i++) - { - /* Get the current descriptor */ - Memory = &MDArray[i]; - - /* Allocate an NT Memory Descriptor */ - Descriptor = ArmAllocateMemoryDescriptor(); - if (!Descriptor) return ENOMEM; - - /* Copy the memory type */ - Descriptor->MemoryType = Memory->MemoryType; - if (Memory->MemoryType == MemoryFreeContiguous) - { - /* Convert this to free */ - Descriptor->MemoryType = LoaderFree; - } - else if (Memory->MemoryType == MemorySpecialMemory) - { - /* Convert this to special memory */ - Descriptor->MemoryType = LoaderSpecialMemory; - } - - /* Copy the range data */ - Descriptor->BasePage = Memory->BasePage; - Descriptor->PageCount = Memory->PageCount; - - /* Insert the descriptor */ - if (Descriptor->PageCount) ArmInsertMemoryDescriptor(Descriptor); - } - - /* All went well */ - return STATUS_SUCCESS; -} - -#define PFN_SHIFT 12 -#define LARGE_PFN_SHIFT 20 - -#define PTE_BASE 0xC0000000 -#define PDE_BASE 0xC0400000 -#define HAL_BASE 0xFFC00000 -#define MMIO_BASE 0x10000000 - -#define LowMemPageTableIndex 0 -#define StartupPtePageTableIndex (PTE_BASE >> PDE_SHIFT) -#define StartupPdePageTableIndex (PDE_BASE >> PDE_SHIFT) -#define MmioPageTableIndex (MMIO_BASE >> PDE_SHIFT) -#define HalPageTableIndex (HAL_BASE >> PDE_SHIFT) - -/* Converts a Physical Address into a Page Frame Number */ -#define PaToPfn(p) ((p) >> PFN_SHIFT) -#define PaToLargePfn(p) ((p) >> LARGE_PFN_SHIFT) -#define PaPtrToPfn(p) (((ULONG_PTR)(p)) >> PFN_SHIFT) - -/* Converts a Physical Address into a Coarse Page Table PFN */ -#define PaPtrToPdePfn(p) (((ULONG_PTR)(p)) >> CPT_SHIFT) - -HARDWARE_PTE_ARMV6 TempPte; -HARDWARE_LARGE_PTE_ARMV6 TempLargePte; -HARDWARE_PDE_ARMV6 TempPde; - -PVOID -ArmSetupPageDirectory(VOID) -{ - PPAGE_DIRECTORY_ARM PageDir; - PPAGE_TABLE_ARM PageTable, KernelPageTable; - ULONG KernelPageTableIndex; - ULONG i; - PHARDWARE_PTE_ARMV6 PointerPte; - PHARDWARE_PDE_ARMV6 PointerPde; - PHARDWARE_LARGE_PTE_ARMV6 LargePte; - PFN_NUMBER Pfn; - - /* Setup templates */ - TempPte.Accessed = TempPte.Valid = TempLargePte.LargePage = TempLargePte.Accessed = TempPde.Valid = 1; - - /* Get the Kernel Table Index */ - KernelPageTableIndex = KernelBase >> PDE_SHIFT; - - /* Allocate 1MB PDE_BASE and HYPER_SPACE. This will be improved later. Must be 1MB aligned */ - PageDir = MmAllocateMemoryAtAddress(1 * 1024 * 1024, (PVOID)0x700000, LoaderMemoryData); - - /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */ - LargePte = &PageDir->Pte[LowMemPageTableIndex]; - *LargePte = TempLargePte; - - /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */ - LargePte = &PageDir->Pte[MmioPageTableIndex]; - Pfn = PaToLargePfn(0x10000000); - for (i = 0; i < 2; i++) - { - TempLargePte.PageFrameNumber = Pfn++; - *LargePte++ = TempLargePte; - } - - /* Allocate 8 page tables (8KB) to describe the 8MB initial kernel region */ - KernelPageTable = MmAllocateMemoryWithType(8192, LoaderMemoryData); - - /* Setup the Kernel PDEs */ - PointerPde = &PageDir->Pde[KernelPageTableIndex]; - Pfn = PaPtrToPdePfn(KernelPageTable); - for (i = 0; i < 8; i++) - { - TempPde.PageFrameNumber = Pfn; - *PointerPde++ = TempPde; - Pfn++; - } - - /* Setup the Kernel PTEs */ - PointerPte = KernelPageTable->Pte; - Pfn = PaPtrToPfn(KERNEL_BASE_PHYS); - for (i = 0; i < 1536; i++) - { - TempPte.PageFrameNumber = Pfn++; - *PointerPte++ = TempPte; - } - - /* Setup the Startup PDE */ - LargePte = &PageDir->Pte[StartupPdePageTableIndex]; - TempLargePte.PageFrameNumber = PaToLargePfn((ULONG_PTR)PageDir); - *LargePte = TempLargePte; - - /* After this point, any MiAddressToPde is guaranteed not to fault */ - - /* Allocate 4 page tables (4KB) to describe the 4MB PTE_BASE region */ - PageTable = MmAllocateMemoryWithType(4096, LoaderMemoryData); - - /* - * Link them in the Startup PDE. - * Note these are the entries in the PD at (MiAddressToPde(PTE_BASE)). - */ - PointerPde = &PageDir->Pde[StartupPtePageTableIndex]; - Pfn = PaPtrToPdePfn(PageTable); - for (i = 0; i < 4; i++) - { - TempPde.PageFrameNumber = Pfn++; - *PointerPde++ = TempPde; - } - - /* - * Now map these page tables in PTE space (MiAddressToPte(PTE_BASE)). - * Note that they all live on a single page, since each is 1KB. - */ - PointerPte = &PageTable->Pte[0x300]; - TempPte.PageFrameNumber = PaPtrToPfn(PageTable); - *PointerPte = TempPte; - - /* - * After this point, MiAddressToPte((PDE_BASE) to MiAddressToPte(PDE_TOP)) - * is guaranteed not to fault. - * Any subsequent page allocation will first need its page table created - * and mapped in the PTE_BASE first, then the page table itself will be - * editable through its flat PTE address. - */ - return PageDir; -} - -VOID -ArmSetupPagingAndJump(IN PVOID PageDirectoryBaseAddress) -{ - ARM_CONTROL_REGISTER ControlRegister; - ARM_TTB_REGISTER TtbRegister; - ARM_DOMAIN_REGISTER DomainRegister; - - /* Set the TTBR */ - TtbRegister.AsUlong = (ULONG_PTR)PageDirectoryBaseAddress; - ASSERT(TtbRegister.Reserved == 0); - KeArmTranslationTableRegisterSet(TtbRegister); - - /* Disable domains and simply use access bits on PTEs */ - DomainRegister.AsUlong = 0; - DomainRegister.Domain0 = ClientDomain; - KeArmDomainRegisterSet(DomainRegister); - - /* Enable ARMv6+ paging (MMU), caches and the access bit */ - ControlRegister = KeArmControlRegisterGet(); - ControlRegister.MmuEnabled = TRUE; - ControlRegister.ICacheEnabled = TRUE; - ControlRegister.DCacheEnabled = TRUE; - ControlRegister.ForceAp = TRUE; - ControlRegister.ExtendedPageTables = TRUE; - KeArmControlRegisterSet(ControlRegister); - - /* Jump to Kernel */ - (*KernelEntryPoint)((PVOID)((ULONG_PTR)ArmLoaderBlock | KSEG0_BASE)); -} - -VOID -ArmPrepareForReactOS(IN BOOLEAN Setup) -{ - ARM_CACHE_REGISTER CacheReg; - PVOID Base, MemBase; - PCHAR BootPath, HalPath; - NTSTATUS Status; - ULONG Dummy, i; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PLIST_ENTRY NextEntry, OldEntry; - PARC_DISK_INFORMATION ArcDiskInformation; - PARC_DISK_SIGNATURE ArcDiskSignature; - ULONG ArcDiskCount = 0; -#if 0 - ULONG Checksum = 0; - PMASTER_BOOT_RECORD Mbr; - PULONG Buffer; -#endif - PWCHAR ArmModuleName; - - // - // Allocate the ARM Shared Heap - // - ArmSharedHeap = MmAllocateMemoryWithType(PAGE_SIZE, LoaderOsloaderHeap); - ArmSharedHeapSize = 0; - if (!ArmSharedHeap) return; - - // - // Allocate the loader block and extension - // - ArmLoaderBlock = ArmAllocateFromSharedHeap(sizeof(LOADER_PARAMETER_BLOCK)); - if (!ArmLoaderBlock) return; - ArmExtension = ArmAllocateFromSharedHeap(sizeof(LOADER_PARAMETER_EXTENSION)); - if (!ArmExtension) return; - - // - // Initialize the loader block - // - InitializeListHead(&ArmLoaderBlock->BootDriverListHead); - InitializeListHead(&ArmLoaderBlock->LoadOrderListHead); - InitializeListHead(&ArmLoaderBlock->MemoryDescriptorListHead); - - // - // Setup the extension and setup block - // - ArmLoaderBlock->Extension = (PVOID)((ULONG_PTR)ArmExtension | KSEG0_BASE); - ArmLoaderBlock->SetupLdrBlock = NULL; - - // - // Add the Board Memory Map from U-Boot into the STARTUP.COM-style - // BIOS descriptor format -- this needs to be removed later. - // - ArmBuildBoardMemoryMap(); - - // - // Now basically convert these entries to the ARC format, so that we can - // get a good map of free (usable) memory - // - ArmBuildOsMemoryMap(); - - // - // NT uses an extended ARC format, with slightly different memory types. - // We also want to link the ARC descriptors together into a linked list, - // instead of the array, and allocate the semi-permanent storage in which - // these entries will be stored so that the kernel can read them. - // - ArmBuildLoaderMemoryList(); - - // - // Setup descriptor for the shared heap - // - Status = ArmCreateMemoryDescriptor(LoaderOsloaderHeap, - (ULONG_PTR)ArmSharedHeap >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(ArmSharedHeap, - ArmSharedHeapSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup descriptor for the boot stack - // - Status = ArmCreateMemoryDescriptor(LoaderOsloaderStack, - (ULONG_PTR)&BootStack >> PAGE_SHIFT, - 4, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; -#if 0 - // - // Setup descriptor for the boot page tables - // - Status = ArmCreateMemoryDescriptor(LoaderMemoryData, - (ULONG_PTR)&TranslationTableStart >> PAGE_SHIFT, - ((ULONG_PTR)&TranslationTableEnd - - (ULONG_PTR)&TranslationTableStart) / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; -#endif - // - // Setup descriptor for the kernel - // - Status = ArmCreateMemoryDescriptor(LoaderSystemCode, - KernelData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(KernelData, - KernelSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup descriptor for the HAL - // - Status = ArmCreateMemoryDescriptor(LoaderHalCode, - HalData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(HalData, - HalSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup registry data - // - ArmLoaderBlock->RegistryBase = (PVOID)((ULONG_PTR)RegistryData | KSEG0_BASE); - ArmLoaderBlock->RegistryLength = RegistrySize; - - // - // Create an MD for it - // - Status = ArmCreateMemoryDescriptor(LoaderRegistryData, - RegistryData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(RegistryData, - RegistrySize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // TODO: Setup ARC Hardware tree data - // - - // - // Setup NLS data - // - ArmNlsDataBlock = ArmAllocateFromSharedHeap(sizeof(NLS_DATA_BLOCK)); - ArmLoaderBlock->NlsData = ArmNlsDataBlock; - ArmLoaderBlock->NlsData->AnsiCodePageData = (PVOID)(AnsiData | KSEG0_BASE); - ArmLoaderBlock->NlsData->OemCodePageData = (PVOID)(OemData | KSEG0_BASE); - ArmLoaderBlock->NlsData->UnicodeCodePageData = (PVOID)(UnicodeData | KSEG0_BASE); - ArmLoaderBlock->NlsData = (PVOID)((ULONG_PTR)ArmLoaderBlock->NlsData | KSEG0_BASE); - - // - // Setup ANSI NLS Memory Descriptor - // - Status = ArmCreateMemoryDescriptor(LoaderNlsData, - AnsiData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(AnsiData, - AnsiSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup OEM NLS Memory Descriptor - // - Status = ArmCreateMemoryDescriptor(LoaderNlsData, - OemData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(OemData, - OemSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup Unicode NLS Memory Descriptor - // - Status = ArmCreateMemoryDescriptor(LoaderNlsData, - UnicodeData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(UnicodeData, - UnicodeSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup loader entry for the kernel - // - ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR)); - wcscpy(ArmModuleName, L"ntoskrnl.exe"); - LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY)); - RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY)); - LdrEntry->DllBase = (PVOID)KernelBase; - LdrEntry->SizeOfImage = KernelSize; - LdrEntry->EntryPoint = KernelEntryPoint; - LdrEntry->LoadCount = 1; - LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED; - RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName); - RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName); - LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE); - LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE); - InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks); - - // - // Setup loader entry for the HAL - // - ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR)); - wcscpy(ArmModuleName, L"hal.dll"); - LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY)); - RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY)); - LdrEntry->DllBase = (PVOID)(HalData | KSEG0_BASE); - LdrEntry->SizeOfImage = HalSize; - LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)HalData)-> - OptionalHeader.AddressOfEntryPoint; - LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE); - LdrEntry->LoadCount = 1; - LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED; - RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName); - RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName); - LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE); - LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE); - InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks); - - // - // Build descriptors for the drivers loaded - // - for (i = 0; i < Drivers; i++) - { - // - // Setup loader entry for the driver - // - LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY)); - RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY)); - LdrEntry->DllBase = (PVOID)(DriverData[i] | KSEG0_BASE); - LdrEntry->SizeOfImage = DriverSize[i]; - LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)DriverData[i])-> - OptionalHeader.AddressOfEntryPoint; - LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE); - LdrEntry->LoadCount = 1; - LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED; - ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR)); - RtlZeroMemory(ArmModuleName, 64 * sizeof(WCHAR)); - LdrEntry->FullDllName.Length = strlen(DriverName[i]) * sizeof(WCHAR); - LdrEntry->FullDllName.MaximumLength = LdrEntry->FullDllName.Length; - LdrEntry->FullDllName.Buffer = ArmModuleName; - LdrEntry->BaseDllName = LdrEntry->FullDllName; - while (*DriverName[i]) *ArmModuleName++ = *DriverName[i]++; - LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE); - LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE); - InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks); - - // - // Build a descriptor for the driver - // - Status = ArmCreateMemoryDescriptor(LoaderBootDriver, - DriverData[i] >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(DriverData[i], - DriverSize[i]), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - } - - // - // Loop driver list - // - NextEntry = ArmLoaderBlock->LoadOrderListHead.Flink; - while (NextEntry != &ArmLoaderBlock->LoadOrderListHead) - { - // - // Remember the physical entry - // - OldEntry = NextEntry->Flink; - - // - // Edit the data - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Keep looping - // - NextEntry = OldEntry; - } - - // - // Now edit the root itself - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Setup extension parameters - // - ArmExtension->Size = sizeof(LOADER_PARAMETER_EXTENSION); - ArmExtension->MajorVersion = 5; - ArmExtension->MinorVersion = 2; - - // - // Make a copy of the command line - // - ArmLoaderBlock->LoadOptions = ArmCommandLine; - strcpy(ArmCommandLine, reactos_kernel_cmdline); - - // - // Find the first \, separating the ARC path from NT path - // - BootPath = strchr(ArmCommandLine, '\\'); - *BootPath = ANSI_NULL; - - // - // Set the ARC Boot Path - // - strncpy(ArmArcBootPath, ArmCommandLine, 63); - ArmLoaderBlock->ArcBootDeviceName = (PVOID)((ULONG_PTR)ArmArcBootPath | KSEG0_BASE); - - // - // The rest of the string is the NT path - // - HalPath = strchr(BootPath + 1, ' '); - *HalPath = ANSI_NULL; - ArmNtBootPath[0] = '\\'; - strncat(ArmNtBootPath, BootPath + 1, 63); - strcat(ArmNtBootPath,"\\"); - ArmLoaderBlock->NtBootPathName = (PVOID)((ULONG_PTR)ArmNtBootPath | KSEG0_BASE); - - // - // Set the HAL paths - // - strncpy(ArmArcHalPath, ArmArcBootPath, 63); - ArmLoaderBlock->ArcHalDeviceName = (PVOID)((ULONG_PTR)ArmArcHalPath | KSEG0_BASE); - strcpy(ArmNtHalPath, "\\"); - ArmLoaderBlock->NtHalPathName = (PVOID)((ULONG_PTR)ArmNtHalPath | KSEG0_BASE); - - // - // Use this new command line - // - strncpy(ArmLoaderBlock->LoadOptions, HalPath + 2, 255); - - // - // Parse it and change every slash to a space - // - BootPath = ArmLoaderBlock->LoadOptions; - do {if (*BootPath == '/') *BootPath = ' ';} while (*BootPath++); - - // - // Fixup command-line pointer - // - ArmLoaderBlock->LoadOptions = (PVOID)((ULONG_PTR)ArmLoaderBlock->LoadOptions | KSEG0_BASE); - - // - // Setup cache information - // - CacheReg = KeArmCacheRegisterGet(); - ArmLoaderBlock->u.Arm.FirstLevelDcacheSize = SizeBits[CacheReg.DSize]; - ArmLoaderBlock->u.Arm.FirstLevelDcacheFillSize = LenBits[CacheReg.DLength]; - ArmLoaderBlock->u.Arm.FirstLevelDcacheFillSize <<= 2; - ArmLoaderBlock->u.Arm.FirstLevelIcacheSize = SizeBits[CacheReg.ISize]; - ArmLoaderBlock->u.Arm.FirstLevelIcacheFillSize = LenBits[CacheReg.ILength]; - ArmLoaderBlock->u.Arm.FirstLevelIcacheFillSize <<= 2; - ArmLoaderBlock->u.Arm.SecondLevelDcacheSize = - ArmLoaderBlock->u.Arm.SecondLevelDcacheFillSize = - ArmLoaderBlock->u.Arm.SecondLevelIcacheSize = - ArmLoaderBlock->u.Arm.SecondLevelIcacheFillSize = 0; - - // - // Allocate the Interrupt stack - // - Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupDpcStack); - ArmLoaderBlock->u.Arm.InterruptStack = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->u.Arm.InterruptStack += KERNEL_STACK_SIZE; - - // - // Build an entry for it - // - Status = ArmCreateMemoryDescriptor(LoaderStartupDpcStack, - (ULONG_PTR)Base >> PAGE_SHIFT, - KERNEL_STACK_SIZE / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate the Kernel Boot stack - // - Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupKernelStack); - ArmLoaderBlock->KernelStack = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->KernelStack += KERNEL_STACK_SIZE; - - // - // Build an entry for it - // - Status = ArmCreateMemoryDescriptor(LoaderStartupKernelStack, - (ULONG_PTR)Base >> PAGE_SHIFT, - KERNEL_STACK_SIZE / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate the Abort stack - // - Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupPanicStack); - ArmLoaderBlock->u.Arm.PanicStack = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->u.Arm.PanicStack += KERNEL_STACK_SIZE; - - // - // Build an entry for it - // - Status = ArmCreateMemoryDescriptor(LoaderStartupPanicStack, - (ULONG_PTR)Base >> PAGE_SHIFT, - KERNEL_STACK_SIZE / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate the PCR/KUSER_SHARED page -- align it to 1MB (we only need 2x4KB) - // - Base = MmAllocateMemoryWithType(2 * 1024 * 1024, LoaderStartupPcrPage); - MemBase = Base; - Base = (PVOID)ROUND_UP(Base, 1 * 1024 * 1024); - ArmLoaderBlock->u.Arm.PcrPage = (ULONG)Base >> PDE_SHIFT; - - // - // Build an entry for the KPCR and KUSER_SHARED_DATA - // - Status = ArmCreateMemoryDescriptor(LoaderStartupPcrPage, - (ULONG_PTR)MemBase >> PAGE_SHIFT, - (2 * 1024 * 1024) / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate PDR pages -- align them to 1MB (we only need 3x4KB) - // - Base = MmAllocateMemoryWithType(4 * 1024 * 1024, LoaderStartupPdrPage); - MemBase = Base; - Base = (PVOID)ROUND_UP(Base, 1 * 1024 * 1024); - ArmLoaderBlock->u.Arm.PdrPage = (ULONG)Base >> PDE_SHIFT; - - // - // Build an entry for the PDR, PRCB and initial KPROCESS/KTHREAD - // - Status = ArmCreateMemoryDescriptor(LoaderStartupPdrPage, - (ULONG_PTR)MemBase >> PAGE_SHIFT, - (4 * 1024 * 1024) / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Set initial PRCB, Thread and Process on the last PDR page - // - Base = (PVOID)((ULONG)Base + 2 * 1024 * 1024); - ArmLoaderBlock->Prcb = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->Process = ArmLoaderBlock->Prcb + sizeof(KPRCB); - ArmLoaderBlock->Thread = ArmLoaderBlock->Process + sizeof(EPROCESS); - - // - // Check if we're booting from RAM disk - // - if ((gRamDiskBase) && (gRamDiskSize)) - { - // - // Allocate a descriptor to describe it - // - Status = ArmCreateMemoryDescriptor(LoaderXIPRom, - (ULONG_PTR)gRamDiskBase >> PAGE_SHIFT, - gRamDiskSize / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - } - - // - // Loop memory list - // - NextEntry = ArmLoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &ArmLoaderBlock->MemoryDescriptorListHead) - { - // - // Remember the physical entry - // - OldEntry = NextEntry->Flink; - - // - // Edit the data - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Keep looping - // - NextEntry = OldEntry; - } - - // - // Now edit the root itself - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Allocate ARC disk structure - // - ArcDiskInformation = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_INFORMATION)); - InitializeListHead(&ArcDiskInformation->DiskSignatureListHead); - ArmLoaderBlock->ArcDiskInformation = (PVOID)((ULONG_PTR)ArcDiskInformation | KSEG0_BASE); - -#if 0 - // - // Read the MBR - // - MachDiskReadLogicalSectors(0x49, 0ULL, 1, (PVOID)DISKREADBUFFER); - Buffer = (ULONG*)DISKREADBUFFER; - Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER; - - // - // Calculate the MBR checksum - // - for (i = 0; i < 128; i++) Checksum += Buffer[i]; - Checksum = ~Checksum + 1; - -#endif - // - // Allocate a disk signature and fill it out - // - ArcDiskSignature = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_SIGNATURE)); - ArcDiskSignature->Signature = 0xBADAB00B;// Mbr->Signature; - ArcDiskSignature->CheckSum = 0xFAB4BEEF; //Checksum; - - // - // Allocare a string for the name and fill it out - // - ArcDiskSignature->ArcName = ArmAllocateFromSharedHeap(256); - sprintf(ArcDiskSignature->ArcName, "multi(0)disk(0)rdisk(%lu)", ArcDiskCount++); - ArcDiskSignature->ArcName = (PVOID)((ULONG_PTR)ArcDiskSignature->ArcName | KSEG0_BASE); - - // - // Insert the descriptor into the list - // - InsertTailList(&ArcDiskInformation->DiskSignatureListHead, - &ArcDiskSignature->ListEntry); - - // - // Loop ARC disk list - // - NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink; - while (NextEntry != &ArcDiskInformation->DiskSignatureListHead) - { - // - // Remember the physical entry - // - OldEntry = NextEntry->Flink; - - // - // Edit the data - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Keep looping - // - NextEntry = OldEntry; - } - - // - // Now edit the root itself - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); -} - -VOID -FrLdrStartup(IN ULONG Magic) -{ - PVOID PageDir; - // - // Disable interrupts (already done) - // - - // - // Set proper CPSR (already done) - // - - // - // Initialize the page directory - // - PageDir = ArmSetupPageDirectory(); - - // - // Initialize paging and load NTOSKRNL - // - ArmSetupPagingAndJump(PageDir); -} diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c index f8979bba771..b0b8e27e2c7 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c @@ -9,73 +9,79 @@ /* INCLUDES *******************************************************************/ #include -#define RGB565(r, g, b) (((r >> 3) << 11)| ((g >> 2) << 5)| ((b >> 3) << 0)) +#include /* GLOBALS ********************************************************************/ -UCHAR BootStack[0x4000]; -PUCHAR BootStackEnd = &BootStack[0x3FFF]; PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; -ULONG BootDrive, BootPartition; -VOID ArmPrepareForReactOS(IN BOOLEAN Setup); -ADDRESS_RANGE ArmBoardMemoryMap[16]; -ULONG ArmBoardMemoryMapRangeCount; ULONG gDiskReadBuffer, gFileSysBuffer; +BOOLEAN ArmHwDetectRan; +PCONFIGURATION_COMPONENT_DATA RootNode; + +ULONG FirstLevelDcacheSize; +ULONG FirstLevelDcacheFillSize; +ULONG FirstLevelIcacheSize; +ULONG FirstLevelIcacheFillSize; +ULONG SecondLevelDcacheSize; +ULONG SecondLevelDcacheFillSize; +ULONG SecondLevelIcacheSize; +ULONG SecondLevelIcacheFillSize; + +ARC_DISK_SIGNATURE reactos_arc_disk_info; +ULONG reactos_disk_count; +CHAR reactos_arc_hardware_data[256]; + +ULONG SizeBits[] = +{ + -1, // INVALID + -1, // INVALID + 1 << 12, // 4KB + 1 << 13, // 8KB + 1 << 14, // 16KB + 1 << 15, // 32KB + 1 << 16, // 64KB + 1 << 17 // 128KB +}; + +ULONG AssocBits[] = +{ + -1, // INVALID + -1, // INVALID + 4 // 4-way associative +}; + +ULONG LenBits[] = +{ + -1, // INVALID + -1, // INVALID + 8 // 8 words per line (32 bytes) +}; /* FUNCTIONS ******************************************************************/ VOID ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext) { - ULONG i; - - // - // Remember the pointer - // + /* Remember the pointer */ ArmBoardBlock = BootContext; - // - // Let's make sure we understand the LLB - // + /* Let's make sure we understand the LLB */ ASSERT(ArmBoardBlock->MajorVersion == ARM_BOARD_CONFIGURATION_MAJOR_VERSION); ASSERT(ArmBoardBlock->MinorVersion == ARM_BOARD_CONFIGURATION_MINOR_VERSION); - // - // This should probably go away once we support more boards - // + /* This should probably go away once we support more boards */ ASSERT((ArmBoardBlock->BoardType == MACH_TYPE_FEROCEON) || (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB) || (ArmBoardBlock->BoardType == MACH_TYPE_OMAP3_BEAGLE)); - // - // Save data required for memory initialization - // - ArmBoardMemoryMapRangeCount = ArmBoardBlock->MemoryMapEntryCount; - ASSERT(ArmBoardMemoryMapRangeCount != 0); - ASSERT(ArmBoardMemoryMapRangeCount < 16); - for (i = 0; i < ArmBoardMemoryMapRangeCount; i++) - { - // - // Copy each entry - // - RtlCopyMemory(&ArmBoardMemoryMap[i], - &ArmBoardBlock->MemoryMap[i], - sizeof(ADDRESS_RANGE)); - } - - // - // Call FreeLDR's portable entrypoint with our command-line - // + /* Call FreeLDR's portable entrypoint with our command-line */ BootMain(ArmBoardBlock->CommandLine); } -BOOLEAN -ArmDiskNormalizeSystemPath(IN OUT PCHAR SystemPath, - IN unsigned Size) +VOID +ArmPrepareForReactOS(IN BOOLEAN Setup) { - /* Only RAMDISK supported for now */ - if (!strstr(SystemPath, "ramdisk(0)")) return FALSE; - return TRUE; + return; } BOOLEAN @@ -95,28 +101,42 @@ ArmDiskGetBootPath(OUT PCHAR BootPath, PCONFIGURATION_COMPONENT_DATA ArmHwDetect(VOID) { - PCONFIGURATION_COMPONENT_DATA RootNode; + ARM_CACHE_REGISTER CacheReg; - // - // Create the root node - // + /* Create the root node */ + if (ArmHwDetectRan++) return RootNode; FldrCreateSystemKey(&RootNode); - // - // TODO: - // There's no such thing as "PnP" on embedded hardware. - // The boot loader will send us a device tree, similar to ACPI - // or OpenFirmware device trees, and we will convert it to ARC. - // + /* + * TODO: + * There's no such thing as "PnP" on embedded hardware. + * The boot loader will send us a device tree, similar to ACPI + * or OpenFirmware device trees, and we will convert it to ARC. + */ - // - // Register RAMDISK Device - // + /* Get cache information */ + CacheReg = KeArmCacheRegisterGet(); + FirstLevelDcacheSize = SizeBits[CacheReg.DSize]; + FirstLevelDcacheFillSize = LenBits[CacheReg.DLength]; + FirstLevelDcacheFillSize <<= 2; + FirstLevelIcacheSize = SizeBits[CacheReg.ISize]; + FirstLevelIcacheFillSize = LenBits[CacheReg.ILength]; + FirstLevelIcacheFillSize <<= 2; + SecondLevelDcacheSize = + SecondLevelDcacheFillSize = + SecondLevelIcacheSize = + SecondLevelIcacheFillSize = 0; + + /* Register RAMDISK Device */ RamDiskInitialize(); - // - // Return the root node - // + /* Fill out the ARC disk block */ + reactos_arc_disk_info.Signature = 0xBADAB00F; + reactos_arc_disk_info.CheckSum = 0xDEADBABE; + reactos_arc_disk_info.ArcName = "ramdisk(0)"; + reactos_disk_count = 1; + + /* Return the root node */ return RootNode; } @@ -124,34 +144,26 @@ ULONG ArmMemGetMemoryMap(OUT PBIOS_MEMORY_MAP BiosMemoryMap, IN ULONG MaxMemoryMapSize) { - // - // Return whatever the board returned to us (CS0 Base + Size and FLASH0) - // - RtlCopyMemory(BiosMemoryMap, - ArmBoardBlock->MemoryMap, - ArmBoardBlock->MemoryMapEntryCount * sizeof(BIOS_MEMORY_MAP)); + /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */ + memcpy(BiosMemoryMap, + ArmBoardBlock->MemoryMap, + ArmBoardBlock->MemoryMapEntryCount * sizeof(BIOS_MEMORY_MAP)); return ArmBoardBlock->MemoryMapEntryCount; } VOID MachInit(IN PCCH CommandLine) { - // - // Setup board-specific ARM routines - // + /* Setup board-specific ARM routines */ switch (ArmBoardBlock->BoardType) { - // - // Check for Feroceon-base boards - // + /* Check for Feroceon-base boards */ case MACH_TYPE_FEROCEON: TuiPrintf("Not implemented\n"); while (TRUE); break; - // - // Check for ARM Versatile PB boards - // + /* Check for ARM Versatile PB boards */ case MACH_TYPE_VERSATILE_PB: /* Copy Machine Routines from Firmware Table */ @@ -161,16 +173,7 @@ MachInit(IN PCCH CommandLine) MachVtbl.VideoClearScreen = ArmBoardBlock->VideoClearScreen; MachVtbl.VideoSetDisplayMode = ArmBoardBlock->VideoSetDisplayMode; MachVtbl.VideoGetDisplaySize = ArmBoardBlock->VideoGetDisplaySize; - MachVtbl.VideoGetBufferSize = ArmBoardBlock->VideoGetBufferSize; - MachVtbl.VideoSetTextCursorPosition = ArmBoardBlock->VideoSetTextCursorPosition; - MachVtbl.VideoSetTextCursorPosition = ArmBoardBlock->VideoSetTextCursorPosition; - MachVtbl.VideoHideShowTextCursor = ArmBoardBlock->VideoHideShowTextCursor; MachVtbl.VideoPutChar = ArmBoardBlock->VideoPutChar; - MachVtbl.VideoCopyOffScreenBufferToVRAM = ArmBoardBlock->VideoCopyOffScreenBufferToVRAM; - MachVtbl.VideoIsPaletteFixed = ArmBoardBlock->VideoIsPaletteFixed; - MachVtbl.VideoSetPaletteColor = ArmBoardBlock->VideoSetPaletteColor; - MachVtbl.VideoGetPaletteColor = ArmBoardBlock->VideoGetPaletteColor; - MachVtbl.VideoSync = ArmBoardBlock->VideoSync; MachVtbl.GetTime = ArmBoardBlock->GetTime; /* Setup the disk and file system buffers */ @@ -178,10 +181,10 @@ MachInit(IN PCCH CommandLine) gFileSysBuffer = 0x00090000; break; - // - // Check for TI OMAP3 boards - // For now that means only Beagle, but ZOOM and others should be ok too - // + /* + * Check for TI OMAP3 boards + * For now that means only Beagle, but ZOOM and others should be ok too + */ case MACH_TYPE_OMAP3_BEAGLE: TuiPrintf("Not implemented\n"); while (TRUE); @@ -191,22 +194,9 @@ MachInit(IN PCCH CommandLine) ASSERT(FALSE); } - // - // Setup generic ARM routines for all boards - // + /* Setup generic ARM routines for all boards */ MachVtbl.PrepareForReactOS = ArmPrepareForReactOS; MachVtbl.GetMemoryMap = ArmMemGetMemoryMap; MachVtbl.HwDetect = ArmHwDetect; - - // - // Setup disk I/O routines - // MachVtbl.DiskGetBootPath = ArmDiskGetBootPath; - MachVtbl.DiskNormalizeSystemPath = ArmDiskNormalizeSystemPath; - - // - // We can now print to the console - // - TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString()); - TuiPrintf("Bootargs: %s\n\n", CommandLine); } diff --git a/reactos/boot/freeldr/freeldr/bootmgr.c b/reactos/boot/freeldr/freeldr/bootmgr.c index a83f294cef3..2a8e7be272b 100644 --- a/reactos/boot/freeldr/freeldr/bootmgr.c +++ b/reactos/boot/freeldr/freeldr/bootmgr.c @@ -218,6 +218,7 @@ VOID RunLoader(VOID) IniOpenSection("Operating Systems", &SectionId); IniReadSettingByName(SectionId, SectionName, SettingValue, sizeof(SettingValue)); +#ifndef _M_ARM // Install the drive mapper according to this sections drive mappings #ifdef __i386__ DriveMapMapDrivesInSection(SectionName); @@ -270,6 +271,9 @@ VOID RunLoader(VOID) { LoadAndBootDrive(SectionName); } +#endif +#else + LoadAndBootWindows(SectionName, SettingValue, _WIN32_WINNT_WS03); #endif } diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild index 8d8287bba5d..b4abb4a703c 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -7,19 +7,6 @@ include/reactos/libs include/reactos/elf - - -fno-inline - -fno-zero-initialized-in-bss - - - - - -ffreestanding - -fno-builtin - -Os - - - @@ -73,7 +60,6 @@ boot.s - loader.c macharm.c @@ -102,6 +88,11 @@ + + + wlmemory.c + + ntsetup.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index 16076bf18f4..9f42e74ee92 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -7,10 +7,6 @@ include - - -fno-inline - -fno-zero-initialized-in-bss - mm.c time.c @@ -56,6 +52,7 @@ libsupp.c + directui.c gui.c minitui.c noui.c @@ -68,24 +65,13 @@ palette.c video.c - - - conversion.c - peloader.c - winldr.c - wlmemory.c - wlregistry.c - - - - - conversion.c - peloader.c - winldr.c - wlmemory.c - wlregistry.c - - + + conversion.c + peloader.c + winldr.c + wlmemory.c + wlregistry.c + freeldr.c debug.c version.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild index 29bf32cf9ef..b5127e6b4ed 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild @@ -4,10 +4,6 @@ include include - - -fno-inline - -fno-zero-initialized-in-bss - diff --git a/reactos/boot/freeldr/freeldr/freeldr_main.rbuild b/reactos/boot/freeldr/freeldr/freeldr_main.rbuild index 4a93dff79f0..fbb410e86a4 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_main.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_main.rbuild @@ -4,9 +4,5 @@ include include - - -fno-inline - -fno-zero-initialized-in-bss - bootmgr.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild b/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild index 57d87958c20..836ecf628dd 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild @@ -3,10 +3,6 @@ include include - - -fno-inline - -fno-zero-initialized-in-bss - diff --git a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h index c09d5bfed4a..265079c7fc8 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h @@ -16,12 +16,6 @@ #include "../../../../../armllb/inc/osloader.h" #include "../../../../../armllb/inc/machtype.h" -// -// Static heap for ARC Hardware Component Tree -// 16KB oughta be enough for anyone. -// -#define HW_MAX_ARC_HEAP_SIZE 16 * 1024 - // // ARC Component Configuration Routines // @@ -31,21 +25,16 @@ FldrCreateSystemKey( OUT PCONFIGURATION_COMPONENT_DATA *SystemKey ); -VOID -NTAPI -FldrCreateComponentKey( - IN PCONFIGURATION_COMPONENT_DATA SystemKey, - IN CONFIGURATION_CLASS Class, - IN CONFIGURATION_TYPE Type, - IN IDENTIFIER_FLAG Flags, - IN ULONG Key, - IN ULONG Affinity, - IN PCHAR IdentifierString, - IN PCM_PARTIAL_RESOURCE_LIST ResourceList, - IN ULONG Size, - OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey -); +#define HW_MAX_ARC_HEAP_SIZE 256 extern PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; +extern ULONG FirstLevelDcacheSize; +extern ULONG FirstLevelDcacheFillSize; +extern ULONG FirstLevelIcacheSize; +extern ULONG FirstLevelIcacheFillSize; +extern ULONG SecondLevelDcacheSize; +extern ULONG SecondLevelDcacheFillSize; +extern ULONG SecondLevelIcacheSize; +extern ULONG SecondLevelIcacheFillSize; #endif diff --git a/reactos/boot/freeldr/freeldr/reactos/imageldr.c b/reactos/boot/freeldr/freeldr/reactos/imageldr.c index 1e50115c83f..296e3afc10a 100644 --- a/reactos/boot/freeldr/freeldr/reactos/imageldr.c +++ b/reactos/boot/freeldr/freeldr/reactos/imageldr.c @@ -1,3 +1,4 @@ +#ifndef _M_ARM #include #include @@ -780,5 +781,5 @@ FrLdrMapImage(IN PFILE Image, /* Return the final mapped address */ return LoadBase; } - +#endif /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index 0700dca676e..12c8c6647e4 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -18,6 +18,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -889,6 +890,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) * Load boot drivers */ FrLdrLoadBootDrivers(szBootPath, 40); + UiDrawProgressBarCenter(100, 100, szLoadingMsg); //UiUnInitialize("Booting ReactOS..."); // @@ -901,5 +903,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) // FrLdrStartup(0x2badb002); } +#endif /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c new file mode 100644 index 00000000000..660656a5722 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c @@ -0,0 +1,256 @@ +/* + * PROJECT: ReactOS Boot Loader + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/freeldr/arch/arm/loader.c + * PURPOSE: ARM Kernel Loader + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ***************************************************************/ + +#include +#include +#include +#include + +#define PFN_SHIFT 12 +#define LARGE_PFN_SHIFT 20 + +#define PTE_BASE 0xC0000000 +#define PDE_BASE 0xC0400000 +#define PDR_BASE 0xFFD00000 +#define MMIO_BASE 0x10000000 +#define VECTOR_BASE 0xFFFF0000 + +#define LowMemPageTableIndex 0 +#define KernelPageTableIndex (KSEG0_BASE >> PDE_SHIFT) +#define StartupPtePageTableIndex (PTE_BASE >> PDE_SHIFT) +#define StartupPdePageTableIndex (PDE_BASE >> PDE_SHIFT) +#define MmioPageTableIndex (MMIO_BASE >> PDE_SHIFT) +#define PdrPageTableIndex (PDR_BASE >> PDE_SHIFT) +#define VectorPageTableIndex (VECTOR_BASE >> PDE_SHIFT) + +/* Converts a Physical Address into a Page Frame Number */ +#define PaToPfn(p) ((p) >> PFN_SHIFT) +#define PaToLargePfn(p) ((p) >> LARGE_PFN_SHIFT) +#define PaPtrToPfn(p) (((ULONG_PTR)(p)) >> PFN_SHIFT) + +/* Converts a Physical Address into a Coarse Page Table PFN */ +#define PaPtrToPdePfn(p) (((ULONG_PTR)(p)) >> CPT_SHIFT) + +typedef struct _KPDR_PAGE +{ + PAGE_DIRECTORY_ARM PageDir; // 0xC0400000 [0xFFD00000] + CHAR HyperSpace[233 * PAGE_SIZE]; // 0xC0404000 [0xFFD04000] + PAGE_TABLE_ARM KernelPageTable[3]; // 0xC04ED000 [0xFFDED000] + CHAR SharedData[PAGE_SIZE]; // 0xC04F0000 [0xFFDF0000] + CHAR KernelStack[KERNEL_STACK_SIZE]; // 0xC04F1000 [0xFFDF1000] + CHAR PanicStack[KERNEL_STACK_SIZE]; // 0xC04F4000 [0xFFDF4000] + CHAR InterruptStack[KERNEL_STACK_SIZE]; // 0xC04F7000 [0xFFDF7000] + CHAR InitialProcess[PAGE_SIZE]; // 0xC04FA000 [0xFFDFA000] + CHAR InitialThread[PAGE_SIZE]; // 0xC04FB000 [0xFFDFB000] + CHAR Prcb[PAGE_SIZE]; // 0xC04FC000 [0xFFDFC000] + PAGE_TABLE_ARM PageDirPageTable; // 0xC04FD000 [0xFFDFD000] + PAGE_TABLE_ARM VectorPageTable; // 0xC04FE000 [0xFFDFE000] + CHAR Pcr[PAGE_SIZE]; // 0xC04FF000 [0xFFDFF000] +} KPDR_PAGE, *PKPDR_PAGE; + +C_ASSERT(sizeof(KPDR_PAGE) == (1 * 1024 * 1024)); + +HARDWARE_PTE_ARMV6 TempPte; +HARDWARE_LARGE_PTE_ARMV6 TempLargePte; +HARDWARE_PDE_ARMV6 TempPde; +PKPDR_PAGE PdrPage; + +/* FUNCTIONS **************************************************************/ + +BOOLEAN +MempSetupPaging(IN ULONG StartPage, + IN ULONG NumberOfPages) +{ + return TRUE; +} + +VOID +MempUnmapPage(IN ULONG Page) +{ + return; +} + +VOID +MempDump(VOID) +{ + return; +} + +BOOLEAN +WinLdrMapSpecialPages(ULONG PcrBasePage) +{ + ULONG i; + PHARDWARE_PTE_ARMV6 PointerPte; + PHARDWARE_PDE_ARMV6 PointerPde; + PHARDWARE_LARGE_PTE_ARMV6 LargePte; + PFN_NUMBER Pfn; + + /* Setup the Startup PDE */ + LargePte = &PdrPage->PageDir.Pte[StartupPdePageTableIndex]; + TempLargePte.PageFrameNumber = PaToLargePfn((ULONG_PTR)&PdrPage->PageDir); + *LargePte = TempLargePte; + + /* Map-in the PDR */ + LargePte = &PdrPage->PageDir.Pte[PdrPageTableIndex]; + *LargePte = TempLargePte; + + /* After this point, any MiAddressToPde is guaranteed not to fault */ + + /* + * Link them in the Startup PDE. + * Note these are the entries in the PD at (MiAddressToPde(PTE_BASE)). + */ + PointerPde = &PdrPage->PageDir.Pde[StartupPtePageTableIndex]; + Pfn = PaPtrToPdePfn(&PdrPage->PageDirPageTable); + for (i = 0; i < 4; i++) + { + TempPde.PageFrameNumber = Pfn++; + *PointerPde++ = TempPde; + } + + /* + * Now map these page tables in PTE space (MiAddressToPte(PTE_BASE)). + * Note that they all live on a single page, since each is 1KB. + */ + PointerPte = &PdrPage->PageDirPageTable.Pte[0x300]; + TempPte.PageFrameNumber = PaPtrToPfn(&PdrPage->PageDirPageTable); + *PointerPte = TempPte; + + /* + * After this point, MiAddressToPte((PDE_BASE) to MiAddressToPte(PDE_TOP)) + * is guaranteed not to fault. + * Any subsequent page allocation will first need its page table created + * and mapped in the PTE_BASE first, then the page table itself will be + * editable through its flat PTE address. + */ + + /* Setup the Vector PDE */ + PointerPde = &PdrPage->PageDir.Pde[VectorPageTableIndex]; + TempPde.PageFrameNumber = PaPtrToPdePfn(&PdrPage->VectorPageTable); + *PointerPde = TempPde; + + /* Setup the Vector PTEs */ + PointerPte = &PdrPage->VectorPageTable.Pte[0xF0]; + TempPte.PageFrameNumber = 0; + *PointerPte = TempPte; + + /* TODO: Map in the kernel CPTs */ + return TRUE; +} + +VOID +WinLdrSetupForNt(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PVOID *GdtIdt, + IN ULONG *PcrBasePage, + IN ULONG *TssBasePage) +{ + PKPDR_PAGE PdrPage = (PVOID)0xFFD00000; + + /* Load cache information */ + LoaderBlock->u.Arm.FirstLevelDcacheSize = FirstLevelDcacheSize; + LoaderBlock->u.Arm.FirstLevelDcacheFillSize = FirstLevelDcacheFillSize; + LoaderBlock->u.Arm.FirstLevelIcacheSize = FirstLevelIcacheSize; + LoaderBlock->u.Arm.FirstLevelIcacheFillSize = FirstLevelIcacheFillSize; + LoaderBlock->u.Arm.SecondLevelDcacheSize = SecondLevelDcacheSize; + LoaderBlock->u.Arm.SecondLevelDcacheFillSize = SecondLevelDcacheFillSize; + LoaderBlock->u.Arm.SecondLevelIcacheSize = SecondLevelIcacheSize; + LoaderBlock->u.Arm.SecondLevelIcacheFillSize = SecondLevelIcacheSize; + + /* Write initial context information */ + LoaderBlock->KernelStack = (ULONG_PTR)PdrPage->KernelStack; + LoaderBlock->KernelStack += KERNEL_STACK_SIZE; + LoaderBlock->u.Arm.PanicStack = (ULONG_PTR)PdrPage->PanicStack; + LoaderBlock->u.Arm.PanicStack += KERNEL_STACK_SIZE; + LoaderBlock->u.Arm.InterruptStack = (ULONG_PTR)PdrPage->InterruptStack; + LoaderBlock->u.Arm.InterruptStack += KERNEL_STACK_SIZE; + LoaderBlock->Prcb = (ULONG_PTR)PdrPage->Prcb; + LoaderBlock->Process = (ULONG_PTR)PdrPage->InitialProcess; + LoaderBlock->Thread = (ULONG_PTR)PdrPage->InitialThread; +} + +BOOLEAN +MempAllocatePageTables(VOID) +{ + ULONG i; + PHARDWARE_PTE_ARMV6 PointerPte; + PHARDWARE_PDE_ARMV6 PointerPde; + PHARDWARE_LARGE_PTE_ARMV6 LargePte; + PFN_NUMBER Pfn; + + /* Setup templates */ + TempPte.Accessed = TempPte.Valid = TempLargePte.LargePage = TempLargePte.Accessed = TempPde.Valid = 1; + + /* Allocate the 1MB "PDR" (Processor Data Region). Must be 1MB aligned */ + PdrPage = MmAllocateMemoryAtAddress(sizeof(KPDR_PAGE), (PVOID)0x700000, LoaderMemoryData); + + /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */ + LargePte = &PdrPage->PageDir.Pte[LowMemPageTableIndex]; + *LargePte = TempLargePte; + + /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */ + LargePte = &PdrPage->PageDir.Pte[MmioPageTableIndex]; + Pfn = PaToLargePfn(0x10000000); + for (i = 0; i < 2; i++) + { + TempLargePte.PageFrameNumber = Pfn++; + *LargePte++ = TempLargePte; + } + + /* Setup the Kernel PDEs */ + PointerPde = &PdrPage->PageDir.Pde[KernelPageTableIndex]; + Pfn = PaPtrToPdePfn(PdrPage->KernelPageTable); + for (i = 0; i < 12; i++) + { + TempPde.PageFrameNumber = Pfn; + *PointerPde++ = TempPde; + Pfn++; + } + + /* Setup the Kernel PTEs */ + PointerPte = PdrPage->KernelPageTable[0].Pte; + Pfn = 0; + for (i = 0; i < 3072; i++) + { + TempPte.PageFrameNumber = Pfn++; + *PointerPte++ = TempPte; + } + + /* Done */ + return TRUE; +} + +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, + IN ULONG Pcr, + IN ULONG Tss) +{ + ARM_CONTROL_REGISTER ControlRegister; + ARM_TTB_REGISTER TtbRegister; + ARM_DOMAIN_REGISTER DomainRegister; + + /* Set the TTBR */ + TtbRegister.AsUlong = (ULONG_PTR)&PdrPage->PageDir; + ASSERT(TtbRegister.Reserved == 0); + KeArmTranslationTableRegisterSet(TtbRegister); + + /* Disable domains and simply use access bits on PTEs */ + DomainRegister.AsUlong = 0; + DomainRegister.Domain0 = ClientDomain; + KeArmDomainRegisterSet(DomainRegister); + + /* Enable ARMv6+ paging (MMU), caches and the access bit */ + ControlRegister = KeArmControlRegisterGet(); + ControlRegister.MmuEnabled = TRUE; + ControlRegister.ICacheEnabled = TRUE; + ControlRegister.DCacheEnabled = TRUE; + ControlRegister.ForceAp = TRUE; + ControlRegister.ExtendedPageTables = TRUE; + KeArmControlRegisterSet(ControlRegister); +} diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c index 668dea3c33d..bfa68ab904e 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -198,6 +198,10 @@ MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, } } +#ifdef _M_ARM +#define PKTSS PVOID +#endif + BOOLEAN WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, ULONG PcrBasePage, From a12bfcf5d5db8c3579a47de09524c9bfa17e021e Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 9 Feb 2010 12:03:59 +0000 Subject: [PATCH 47/97] [DSOUND_NEW] - Implement starting / stopping primary sound buffer - Implement retrieving capabilities for secondary sound buffer - Import sound mixing routines from wine, not yet used svn path=/trunk/; revision=45527 --- .../dll/directx/dsound_new/dsound_convert.c | 435 ++++++++++++++++++ reactos/dll/directx/dsound_new/primary.c | 64 ++- reactos/dll/directx/dsound_new/secondary.c | 25 +- 3 files changed, 516 insertions(+), 8 deletions(-) create mode 100644 reactos/dll/directx/dsound_new/dsound_convert.c diff --git a/reactos/dll/directx/dsound_new/dsound_convert.c b/reactos/dll/directx/dsound_new/dsound_convert.c new file mode 100644 index 00000000000..0a6e474d09d --- /dev/null +++ b/reactos/dll/directx/dsound_new/dsound_convert.c @@ -0,0 +1,435 @@ +/* DirectSound format conversion and mixing routines + * + * Copyright 2007 Maarten Lankhorst + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* 8 bits is unsigned, the rest is signed. + * First I tried to reuse existing stuff from alsa-lib, after that + * didn't work, I gave up and just went for individual hacks. + * + * 24 bit is expensive to do, due to unaligned access. + * In dlls/winex11.drv/dib_convert.c convert_888_to_0888_asis there is a way + * around it, but I'm happy current code works, maybe something for later. + * + * The ^ 0x80 flips the signed bit, this is the conversion from + * signed (-128.. 0.. 127) to unsigned (0...255) + * This is only temporary: All 8 bit data should be converted to signed. + * then when fed to the sound card, it should be converted to unsigned again. + * + * Sound is LITTLE endian + */ + +#include "config.h" + +#include + +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "winternl.h" +#include "wine/debug.h" +#include "dsound.h" +#include "dsdriver.h" +#include "dsound_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dsound); + +#ifdef WORDS_BIGENDIAN +#define le16(x) RtlUshortByteSwap((x)) +#define le32(x) RtlUlongByteSwap((x)) +#else +#define le16(x) (x) +#define le32(x) (x) +#endif + +static inline void src_advance(const void **src, UINT stride, INT *count, UINT *freqAcc, UINT adj) +{ + *freqAcc += adj; + if (*freqAcc >= (1 << DSOUND_FREQSHIFT)) + { + ULONG adv = (*freqAcc >> DSOUND_FREQSHIFT); + *freqAcc &= (1 << DSOUND_FREQSHIFT) - 1; + *(const char **)src += adv * stride; + *count -= adv; + } +} + +static void convert_8_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + *(BYTE *)dst = *(const BYTE *)src; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_8_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD dest = *(const BYTE *)src, *dest16 = dst; + *dest16 = le16(dest * 257 - 32768); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_8_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE dest = *(const BYTE *)src; + BYTE *dest24 = dst; + dest24[0] = dest; + dest24[1] = dest; + dest24[2] = dest - 0x80; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_8_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD dest = *(const BYTE *)src, *dest32 = dst; + *dest32 = le32(dest * 16843009 - 2147483648U); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dst8 = dst; + *dst8 = (le16(*(const WORD *)src)) / 256; + *dst8 -= 0x80; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + *(WORD *)dst = *(const WORD *)src; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD dest = le16(*(const WORD *)src); + BYTE *dest24 = dst; + + dest24[0] = dest / 256; + dest24[1] = dest; + dest24[2] = dest / 256; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD dest = *(const WORD *)src, *dest32 = dst; + *dest32 = dest * 65537; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dst8 = dst; + *dst8 = ((const BYTE *)src)[2]; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD *dest16 = dst; + const BYTE *source = src; + *dest16 = le16(source[2] * 256 + source[1]); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dest24 = dst; + const BYTE *src24 = src; + + dest24[0] = src24[0]; + dest24[1] = src24[1]; + dest24[2] = src24[2]; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD *dest32 = dst; + const BYTE *source = src; + *dest32 = le32(source[2] * 16777217 + source[1] * 65536 + source[0] * 256); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dst8 = dst; + *dst8 = (le32(*(const DWORD *)src) / 16777216); + *dst8 -= 0x80; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD *dest16 = dst; + *dest16 = le16(le32(*(const DWORD *)src) / 65536); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD dest = le32(*(const DWORD *)src); + BYTE *dest24 = dst; + + dest24[0] = dest / 256; + dest24[1] = dest / 65536; + dest24[2] = dest / 16777216; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD *dest = dst; + *dest = *(const DWORD *)src; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +const bitsconvertfunc convertbpp[4][4] = { + { convert_8_to_8, convert_8_to_16, convert_8_to_24, convert_8_to_32 }, + { convert_16_to_8, convert_16_to_16, convert_16_to_24, convert_16_to_32 }, + { convert_24_to_8, convert_24_to_16, convert_24_to_24, convert_24_to_32 }, + { convert_32_to_8, convert_32_to_16, convert_32_to_24, convert_32_to_32 }, +}; + +static void mix8(signed char *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + while (len--) + /* 8-bit WAV is unsigned, it's here converted to signed, normalize function will convert it back again */ + *(dst++) += (signed char)((BYTE)*(src++) - (BYTE)0x80); +} + +static void mix16(SHORT *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 2; + while (len--) + { + *dst += le16(*src); + ++dst; ++src; + } +} + +static void mix24(BYTE *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 3; + while (len--) + { + DWORD field; + field = ((DWORD)src[2] << 16) + ((DWORD)src[1] << 8) + (DWORD)src[0]; + if (src[2] & 0x80) + field |= 0xFF000000U; + *(dst++) += field; + ++src; + } +} + +static void mix32(INT *src, LONGLONG *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 4; + while (len--) + *(dst++) += le32(*(src++)); +} + +const mixfunc mixfunctions[4] = { + (mixfunc)mix8, + (mixfunc)mix16, + (mixfunc)mix24, + (mixfunc)mix32 +}; + +static void norm8(INT *src, signed char *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + while (len--) + { + *dst = (*src) + 0x80; + if (*src < -0x80) + *dst = 0; + else if (*src > 0x7f) + *dst = 0xff; + ++dst; + ++src; + } +} + +static void norm16(INT *src, SHORT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 2; + while (len--) + { + *dst = le16(*src); + if (*src <= -0x8000) + *dst = le16(0x8000); + else if (*src > 0x7fff) + *dst = le16(0x7fff); + ++dst; + ++src; + } +} + +static void norm24(INT *src, BYTE *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 3; + while (len--) + { + if (*src <= -0x800000) + { + dst[0] = 0; + dst[1] = 0; + dst[2] = 0x80; + } + else if (*src > 0x7fffff) + { + dst[0] = 0xff; + dst[1] = 0xff; + dst[2] = 0x7f; + } + else + { + dst[0] = *src; + dst[1] = *src >> 8; + dst[2] = *src >> 16; + } + ++dst; + ++src; + } +} + +static void norm32(LONGLONG *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 4; + while (len--) + { + *dst = le32(*src); + if (*src <= -(LONGLONG)0x80000000) + *dst = le32(0x80000000); + else if (*src > 0x7fffffff) + *dst = le32(0x7fffffff); + ++dst; + ++src; + } +} + +const normfunc normfunctions[4] = { + (normfunc)norm8, + (normfunc)norm16, + (normfunc)norm24, + (normfunc)norm32, +}; diff --git a/reactos/dll/directx/dsound_new/primary.c b/reactos/dll/directx/dsound_new/primary.c index 9b5e822e8bc..ab57c706420 100644 --- a/reactos/dll/directx/dsound_new/primary.c +++ b/reactos/dll/directx/dsound_new/primary.c @@ -229,8 +229,37 @@ PrimaryDirectSoundBuffer8Impl_fnPlay( DWORD dwPriority, DWORD dwFlags) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (dwReserved1 != 0 || !(dwFlags & DSBPLAY_LOOPING)) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + PrimaryDirectSoundBuffer_AcquireLock(iface); + + if (This->State == KSSTATE_STOP) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE); + ASSERT(This->State == KSSTATE_ACQUIRE); + } + + if (This->State == KSSTATE_ACQUIRE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE); + ASSERT(This->State == KSSTATE_PAUSE); + } + + if (This->State == KSSTATE_PAUSE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_RUN); + ASSERT(This->State == KSSTATE_RUN); + } + + PrimaryDirectSoundBuffer_ReleaseLock(iface); + + return DS_OK; } HRESULT @@ -239,8 +268,8 @@ PrimaryDirectSoundBuffer8Impl_fnSetCurrentPosition( LPDIRECTSOUNDBUFFER8 iface, DWORD dwNewPosition) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + /* The position of a primary buffer can't be set */ + return DSERR_INVALIDCALL; } HRESULT @@ -303,8 +332,31 @@ WINAPI PrimaryDirectSoundBuffer8Impl_fnStop( LPDIRECTSOUNDBUFFER8 iface) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + PrimaryDirectSoundBuffer_AcquireLock(iface); + + if (This->State == KSSTATE_RUN) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE); + ASSERT(This->State == KSSTATE_PAUSE); + } + + if (This->State == KSSTATE_PAUSE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE); + ASSERT(This->State == KSSTATE_ACQUIRE); + } + + if (This->State == KSSTATE_ACQUIRE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_STOP); + ASSERT(This->State == KSSTATE_STOP); + } + + PrimaryDirectSoundBuffer_ReleaseLock(iface); + + return DS_OK; } diff --git a/reactos/dll/directx/dsound_new/secondary.c b/reactos/dll/directx/dsound_new/secondary.c index 4474c2665ea..c2f29bf58a4 100644 --- a/reactos/dll/directx/dsound_new/secondary.c +++ b/reactos/dll/directx/dsound_new/secondary.c @@ -17,6 +17,7 @@ typedef struct LPFILTERINFO Filter; DWORD dwLevel; + DWORD dwFlags; LPWAVEFORMATEX Format; PUCHAR Buffer; DWORD BufferSize; @@ -97,8 +98,27 @@ SecondaryDirectSoundBuffer8Impl_fnGetCaps( LPDIRECTSOUNDBUFFER8 iface, LPDSBCAPS pDSBufferCaps) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pDSBufferCaps) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + if (pDSBufferCaps->dwSize < sizeof(DSBCAPS)) + { + /* invalid buffer size */ + return DSERR_INVALIDPARAM; + } + + /* get buffer details */ + pDSBufferCaps->dwUnlockTransferRate = 0; + pDSBufferCaps->dwPlayCpuOverhead = 0; + pDSBufferCaps->dwSize = This->BufferSize; + pDSBufferCaps->dwFlags = This->dwFlags; + + return DS_OK; } HRESULT @@ -528,6 +548,7 @@ NewSecondarySoundBuffer( This->lpVtbl = &vt_DirectSoundBuffer8; This->Filter = Filter; This->dwLevel = dwLevel; + This->dwFlags = lpcDSBufferDesc->dwFlags; This->State = KSSTATE_STOP; This->Flags = 0; This->Position = 0; From d1a65611788d7875b5c00b8a3e511029cc1a40a6 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 9 Feb 2010 13:14:19 +0000 Subject: [PATCH 48/97] [DSOUND_NEW] - Implement getting volume, volume pan, and frequency for secondary sound buffer - Semi-stub setting volume, volume pan and frequency for secondary... svn path=/trunk/; revision=45529 --- reactos/dll/directx/dsound_new/secondary.c | 111 ++++++++++++++++++--- 1 file changed, 95 insertions(+), 16 deletions(-) diff --git a/reactos/dll/directx/dsound_new/secondary.c b/reactos/dll/directx/dsound_new/secondary.c index c2f29bf58a4..216d76d197d 100644 --- a/reactos/dll/directx/dsound_new/secondary.c +++ b/reactos/dll/directx/dsound_new/secondary.c @@ -18,6 +18,9 @@ typedef struct LPFILTERINFO Filter; DWORD dwLevel; DWORD dwFlags; + DWORD dwFrequency; + LONG Volume; + LONG VolumePan; LPWAVEFORMATEX Format; PUCHAR Buffer; DWORD BufferSize; @@ -139,8 +142,8 @@ HRESULT WINAPI SecondaryDirectSoundBuffer8Impl_fnGetFormat( LPDIRECTSOUNDBUFFER8 iface, - LPWAVEFORMATEX pwfxFormat, - DWORD dwSizeAllocated, + LPWAVEFORMATEX pwfxFormat, + DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) { DWORD FormatSize; @@ -186,8 +189,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetVolume( LPDIRECTSOUNDBUFFER8 iface, LPLONG plVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!plVolume) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get volume */ + *plVolume = This->Volume; + + return DS_OK; } HRESULT @@ -196,8 +209,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetPan( LPDIRECTSOUNDBUFFER8 iface, LPLONG plPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!plPan) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *plPan = This->VolumePan; + + return DS_OK; } HRESULT @@ -206,8 +229,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetFrequency( LPDIRECTSOUNDBUFFER8 iface, LPDWORD pdwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pdwFrequency) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *pdwFrequency = This->dwFrequency; + + return DS_OK; } HRESULT @@ -243,8 +276,8 @@ SecondaryDirectSoundBuffer8Impl_fnInitialize( LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + /* RTFM */ + return DSERR_ALREADYINITIALIZED; } HRESULT @@ -361,6 +394,7 @@ SecondaryDirectSoundBuffer8Impl_fnSetFormat( LPDIRECTSOUNDBUFFER8 iface, LPCWAVEFORMATEX pcfxFormat) { + /* RTFM */ return DSERR_INVALIDCALL; } @@ -370,8 +404,19 @@ SecondaryDirectSoundBuffer8Impl_fnSetVolume( LPDIRECTSOUNDBUFFER8 iface, LONG lVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + + /* Store volume */ + This->Volume = lVolume; + + return DS_OK; } HRESULT @@ -380,8 +425,18 @@ SecondaryDirectSoundBuffer8Impl_fnSetPan( LPDIRECTSOUNDBUFFER8 iface, LONG lPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* Store volume pan */ + This->VolumePan = lPan; + + return DS_OK; } HRESULT @@ -390,8 +445,29 @@ SecondaryDirectSoundBuffer8Impl_fnSetFrequency( LPDIRECTSOUNDBUFFER8 iface, DWORD dwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (dwFrequency == DSBFREQUENCY_ORIGINAL) + { + /* restore original frequency */ + dwFrequency = This->Format->nSamplesPerSec; + } + + if (dwFrequency < DSBFREQUENCY_MIN || dwFrequency > DSBFREQUENCY_MAX) + { + /* invalid frequency */ + return DSERR_INVALIDPARAM; + } + + if (dwFrequency != This->dwFrequency) + { + /* FIXME handle frequency change */ + } + + /* store frequency */ + This->dwFrequency = dwFrequency; + + return DS_OK; } HRESULT @@ -549,7 +625,10 @@ NewSecondarySoundBuffer( This->Filter = Filter; This->dwLevel = dwLevel; This->dwFlags = lpcDSBufferDesc->dwFlags; + This->dwFrequency = lpcDSBufferDesc->lpwfxFormat->nSamplesPerSec; This->State = KSSTATE_STOP; + This->Volume = DSBVOLUME_MAX; + This->VolumePan = DSBPAN_CENTER; This->Flags = 0; This->Position = 0; This->BufferSize = lpcDSBufferDesc->dwBufferBytes; From 05051294e4f73fcbfeebd9f1925ddb8913d53994 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 9 Feb 2010 14:24:50 +0000 Subject: [PATCH 49/97] [DSOUND_NEW] - Add more parameter checks - Implement a few more functions for the primary sound buffer svn path=/trunk/; revision=45530 --- reactos/dll/directx/dsound_new/directsound.c | 16 +- reactos/dll/directx/dsound_new/precomp.h | 3 +- reactos/dll/directx/dsound_new/primary.c | 163 ++++++++++++++++--- 3 files changed, 157 insertions(+), 25 deletions(-) diff --git a/reactos/dll/directx/dsound_new/directsound.c b/reactos/dll/directx/dsound_new/directsound.c index 754f56b0028..8a630c2c055 100644 --- a/reactos/dll/directx/dsound_new/directsound.c +++ b/reactos/dll/directx/dsound_new/directsound.c @@ -121,6 +121,12 @@ IDirectSound8_fnCreateSoundBuffer( return DSERR_INVALIDPARAM; } + if (lpcDSBufferDesc->dwBufferBytes != 0) + { + /* buffer size must be zero for primary sound buffer */ + return DSERR_INVALIDPARAM; + } + if (This->PrimaryBuffer) { /* primary buffer already exists */ @@ -129,7 +135,7 @@ IDirectSound8_fnCreateSoundBuffer( return S_OK; } - hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel); + hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags); if (SUCCEEDED(hResult)) { /* store primary buffer */ @@ -145,9 +151,15 @@ IDirectSound8_fnCreateSoundBuffer( return DSERR_INVALIDPARAM; } + if (lpcDSBufferDesc->dwBufferBytes < DSBSIZE_MIN || lpcDSBufferDesc->dwBufferBytes > DSBSIZE_MAX) + { + /* buffer size must be within bounds for secondary sound buffer*/ + return DSERR_INVALIDPARAM; + } + if (!This->PrimaryBuffer) { - hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel); + hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags); if (SUCCEEDED(hResult)) { /* store primary buffer */ diff --git a/reactos/dll/directx/dsound_new/precomp.h b/reactos/dll/directx/dsound_new/precomp.h index 36139b745c1..5a5d0dc29b0 100644 --- a/reactos/dll/directx/dsound_new/precomp.h +++ b/reactos/dll/directx/dsound_new/precomp.h @@ -201,7 +201,8 @@ HRESULT NewPrimarySoundBuffer( LPDIRECTSOUNDBUFFER8 *OutBuffer, LPFILTERINFO Filter, - DWORD dwLevel); + DWORD dwLevel, + DWORD dwFlags); HRESULT PrimaryDirectSoundBuffer_SetFormat( diff --git a/reactos/dll/directx/dsound_new/primary.c b/reactos/dll/directx/dsound_new/primary.c index ab57c706420..ca7a285f004 100644 --- a/reactos/dll/directx/dsound_new/primary.c +++ b/reactos/dll/directx/dsound_new/primary.c @@ -17,6 +17,10 @@ typedef struct LPFILTERINFO Filter; DWORD dwLevel; + DWORD dwFlags; + DWORD dwFrequency; + LONG Volume; + LONG VolumePan; WAVEFORMATEX Format; HANDLE hPin; CRITICAL_SECTION Lock; @@ -94,8 +98,27 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps( LPDIRECTSOUNDBUFFER8 iface, LPDSBCAPS pDSBufferCaps) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pDSBufferCaps) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + if (pDSBufferCaps->dwSize < sizeof(DSBCAPS)) + { + /* invalid buffer size */ + return DSERR_INVALIDPARAM; + } + + /* get buffer details */ + pDSBufferCaps->dwUnlockTransferRate = 0; + pDSBufferCaps->dwPlayCpuOverhead = 0; + pDSBufferCaps->dwSize = 0; //FIXME + pDSBufferCaps->dwFlags = This->dwFlags; + + return DS_OK; } HRESULT @@ -105,7 +128,21 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition( LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) { - UNIMPLEMENTED + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (This->dwLevel < DSSCL_PRIORITY) + { + /* needs priority level */ + return DSERR_PRIOLEVELNEEDED; + } + + if (!pdwCurrentPlayCursor && !pdwCurrentWriteCursor) + { + /* all parameters are null */ + return DSERR_INVALIDPARAM; + } + + UNIMPLEMENTED; return DSERR_INVALIDPARAM; } @@ -160,8 +197,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume( LPDIRECTSOUNDBUFFER8 iface, LPLONG plVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!plVolume) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get volume */ + *plVolume = This->Volume; + + return DS_OK; } HRESULT @@ -170,8 +217,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan( LPDIRECTSOUNDBUFFER8 iface, LPLONG plPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!plPan) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *plPan = This->VolumePan; + + return DS_OK; } HRESULT @@ -180,8 +237,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency( LPDIRECTSOUNDBUFFER8 iface, LPDWORD pdwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pdwFrequency) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *pdwFrequency = This->dwFrequency; + + return DS_OK; } HRESULT @@ -190,8 +257,22 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus( LPDIRECTSOUNDBUFFER8 iface, LPDWORD pdwStatus) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pdwStatus) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + *pdwStatus = 0; + if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE) + { + /* buffer is playing */ + *pdwStatus |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING; + } + + return DS_OK; } HRESULT @@ -201,8 +282,8 @@ PrimaryDirectSoundBuffer8Impl_fnInitialize( LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + /* RTFM */ + return DSERR_ALREADYINITIALIZED; } HRESULT @@ -303,8 +384,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetVolume( LPDIRECTSOUNDBUFFER8 iface, LONG lVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* TODO: call volume node */ + + /* Store volume */ + This->Volume = lVolume; + + return DS_OK; } HRESULT @@ -313,8 +406,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetPan( LPDIRECTSOUNDBUFFER8 iface, LONG lPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* TODO: call volume node */ + + /* Store volume pan */ + This->VolumePan = lPan; + + return DS_OK; } HRESULT @@ -323,8 +428,16 @@ PrimaryDirectSoundBuffer8Impl_fnSetFrequency( LPDIRECTSOUNDBUFFER8 iface, DWORD dwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (This->dwLevel < DSSCL_PRIORITY) + { + /* needs priority level */ + return DSERR_PRIOLEVELNEEDED; + } + + /* invalid request */ + return DSERR_CONTROLUNAVAIL; } HRESULT @@ -374,8 +487,6 @@ PrimaryDirectSoundBuffer8Impl_fnUnlock( } - - HRESULT WINAPI PrimaryDirectSoundBuffer8Impl_fnRestore( @@ -593,7 +704,10 @@ PrimaryDirectSoundBuffer_SetFormat( Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped); DPRINT("PinId %u Result %u\n", PinId, Result); if (Result == ERROR_SUCCESS) + { + This->dwFrequency = pcfxFormat->nSamplesPerSec; break; + } This->hPin = NULL; DeviceId++; @@ -635,7 +749,8 @@ HRESULT NewPrimarySoundBuffer( LPDIRECTSOUNDBUFFER8 *OutBuffer, LPFILTERINFO Filter, - DWORD dwLevel) + DWORD dwLevel, + DWORD dwFlags) { LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer)); @@ -649,6 +764,10 @@ NewPrimarySoundBuffer( This->lpVtbl = &vt_DirectSoundBuffer8; This->Filter = Filter; This->dwLevel = dwLevel; + This->dwFlags = dwFlags; + This->dwFrequency = 0; + This->Volume = DSBVOLUME_MAX; + This->VolumePan = DSBPAN_CENTER; This->hPin = NULL; InitializeCriticalSection(&This->Lock); From 8aff466da397a3cc354b80fab0034c290e396aad Mon Sep 17 00:00:00 2001 From: evb Date: Tue, 9 Feb 2010 18:05:01 +0000 Subject: [PATCH 50/97] - Fix wrong initialization of different modes and stacks. svn path=/trunk/; revision=45532 --- reactos/ntoskrnl/ke/arm/boot.s | 42 ++++++++-------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/boot.s b/reactos/ntoskrnl/ke/arm/boot.s index bd6e8a80e32..eff065cacbc 100644 --- a/reactos/ntoskrnl/ke/arm/boot.s +++ b/reactos/ntoskrnl/ke/arm/boot.s @@ -14,48 +14,24 @@ NESTED_ENTRY KiSystemStartup PROLOG_END KiSystemStartup - /* Put us in FIQ mode */ - mrs r3, cpsr - orr r3, r1, #CPSR_FIQ_MODE - msr cpsr, r3 - - /* Set FIQ stack and registers */ + /* Put us in FIQ mode, set IRQ stack */ + msr cpsr_c, #CPSR_FIQ_MODE ldr sp, [a1, #LpbInterruptStack] - mov r8, #0 - mov r9, #0 - mov r10, #0 /* Repeat for IRQ mode */ - mrs r3, cpsr - orr r3, r1, #CPSR_IRQ_MODE - msr cpsr, r3 + msr cpsr_c, #CPSR_IRQ_MODE ldr sp, [a1, #LpbInterruptStack] - mov r8, #0 - mov r9, #0 - mov r10, #0 - /* Put us in ABORT mode */ - mrs r3, cpsr - orr r3, r1, #CPSR_ABORT_MODE - msr cpsr, r3 - - /* Set panic stack */ + /* Put us in ABORT mode and set the panic stack */ + msr cpsr_c, #CPSR_ABORT_MODE ldr sp, [a1, #LpbPanicStack] - /* Put us in UND (Undefined) mode */ - mrs r3, cpsr - orr r3, r1, #CPSR_UND_MODE - msr cpsr, r3 - - /* Set panic stack */ + /* Repeat for UND (Undefined) mode */ + msr cpsr_c, #CPSR_UND_MODE ldr sp, [a1, #LpbPanicStack] - /* Put us into SVC (Supervisor) mode */ - mrs r3, cpsr - orr r3, r1, #CPSR_SVC_MODE - msr cpsr, r3 - - /* Switch to boot kernel stack */ + /* Put us into SVC (Supervisor) mode and set the kernel stack */ + msr cpsr_c, #CPSR_SVC_MODE ldr sp, [a1, #LpbKernelStack] /* Go to C code */ From c7fe125d088c2f81854a232b55c13632e285ccba Mon Sep 17 00:00:00 2001 From: Benedikt Freisen Date: Tue, 9 Feb 2010 18:06:18 +0000 Subject: [PATCH 51/97] [paint] fix rectangular selection tool svn path=/trunk/; revision=45533 --- reactos/base/applications/paint/mouse.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/paint/mouse.c index 383d5d9016e..4f5c13031fd 100644 --- a/reactos/base/applications/paint/mouse.c +++ b/reactos/base/applications/paint/mouse.c @@ -251,15 +251,18 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) resetToU1(); if ((rectSel_src[2] != 0) && (rectSel_src[3] != 0)) { - DeleteObject(SelectObject - (hSelDC, hSelBm = - (HBITMAP) CreateDIBWithProperties(rectSel_src[2], rectSel_src[3]))); DeleteObject(hSelMask); + hSelMask = CreateBitmap(rectSel_src[2], rectSel_src[3], 1, 1, NULL); + DeleteObject(SelectObject(hSelDC, hSelMask)); + Rect(hSelDC, 0, 0, rectSel_src[2], rectSel_src[3], 0x00ffffff, 0x00ffffff, 1, 2); + SelectObject(hSelDC, hSelBm = CreateDIBWithProperties(rectSel_src[2], rectSel_src[3])); + resetToU1(); BitBlt(hSelDC, 0, 0, rectSel_src[2], rectSel_src[3], hDrawingDC, rectSel_src[0], rectSel_src[1], SRCCOPY); Rect(hdc, rectSel_src[0], rectSel_src[1], rectSel_src[0] + rectSel_src[2], rectSel_src[1] + rectSel_src[3], bgColor, bgColor, 0, TRUE); newReversible(); + placeSelWin(); ShowWindow(hSelection, SW_SHOW); } From 1bfa0a72c89b89e3afc467a8460acf8433388548 Mon Sep 17 00:00:00 2001 From: evb Date: Tue, 9 Feb 2010 18:06:26 +0000 Subject: [PATCH 52/97] - Make KeFlushProcessTb work. Since no MPCore support, CPU TLB is flushed instead. Maybe should use ASIDs later. svn path=/trunk/; revision=45534 --- reactos/ntoskrnl/include/internal/arm/ke.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h index 7bd1c6e161e..e8bdaf5db1b 100644 --- a/reactos/ntoskrnl/include/internal/arm/ke.h +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -77,10 +77,7 @@ FORCEINLINE VOID KeFlushProcessTb(VOID) { - // - // We need to implement this! - // - ASSERTMSG("Need ARM flush routine\n", FALSE); + KeArmFlushTlb(); } FORCEINLINE From 75538f4c0a8168a726832b8d16a6918030d09fc2 Mon Sep 17 00:00:00 2001 From: Colin Finck Date: Tue, 9 Feb 2010 18:14:58 +0000 Subject: [PATCH 53/97] The big RosBE 1.5 compatibility patch. You will need RosBE 1.5 from this point! - Set the minimum GCC version to 4.4.0 and minimum Binutils version to 20091016. - Remove the -fno-unit-at-a-time hacks. - Remove dgorbachev's temporary hacks for user-mode C++ applications. - Merge ntoskrnl's "precomp.h" and "ntoskrnl.h" again, the PCH issues have been fixed. - Use our "ofmt_stub.a" to be compatible with newer MinGW Runtime versions. - Use LD's new -exclude-all-symbols option to not auto-export all symbols in case no DEF file or __declspec(dllexport) was specified. We used to patch our LD version to work around this problem. - Use LD's --start-group and --end-group parameters to allow a more flexible linking order. - Use GCC's -fno-set-stack-executable for amd64 and i386 targets to disable adding the __enable_execute_stack code. - Change the makefile's name to "makefile-$(ARCH).auto" for all architectures. - Remove some -Wno-error flags. See issue #4810 for more details. svn path=/trunk/; revision=45535 --- reactos/Makefile | 6 +- reactos/ReactOS-generic.rbuild | 5 - reactos/ReactOS-i386.rbuild | 2 +- .../games/solitaire/solitaire.cpp | 2 - .../base/applications/games/spider/spider.cpp | 3 - reactos/dll/directx/ddraw/ddraw.rbuild | 2 - reactos/dll/directx/wine/ddraw/ddraw.rbuild | 3 - reactos/dll/win32/actxprxy/actxprxy.rbuild | 1 - reactos/dll/win32/advapi32/advapi32.rbuild | 1 - reactos/dll/win32/crypt32/crypt32.rbuild | 2 - reactos/dll/win32/gdi32/gdi32.rbuild | 4 - reactos/dll/win32/kernel32/kernel32.rbuild | 4 - reactos/dll/win32/ole32/ole32.rbuild | 2 - reactos/dll/win32/psapi/psapi.rbuild | 4 - reactos/dll/win32/qmgrprxy/qmgrprxy.rbuild | 1 - reactos/dll/win32/rpcrt4/rpcrt4.rbuild | 2 - reactos/dll/win32/setupapi/setupapi.rbuild | 2 - reactos/dll/win32/syssetup/syssetup.rbuild | 2 - reactos/dll/win32/user32/user32.rbuild | 4 - reactos/dll/win32/wintrust/wintrust.rbuild | 2 - reactos/dll/win32/wlanapi/wlanapi.rbuild | 2 - .../drivers/input/kbdclass/kbdclass.rbuild | 2 - .../drivers/input/mouclass/mouclass.rbuild | 2 - reactos/drivers/network/afd/afd.rbuild | 4 - reactos/drivers/network/tcpip/tcpip.rbuild | 4 - reactos/lib/rtl/rtl.rbuild | 4 - reactos/ntoskrnl/include/ntoskrnl.h | 100 +++++++++++++++++- reactos/ntoskrnl/include/precomp.h | 98 ----------------- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 7 +- .../subsystems/win32/win32k/objects/gdiobj.c | 4 +- reactos/subsystems/win32/win32k/win32k.rbuild | 5 - .../rbuild/backend/mingw/compilers/gcc.mak | 6 ++ .../tools/rbuild/backend/mingw/linkers/ld.mak | 7 +- reactos/tools/rbuild/backend/mingw/mingw.cpp | 54 ++++++---- reactos/tools/rbuild/backend/mingw/rules.mak | 8 +- 35 files changed, 148 insertions(+), 213 deletions(-) delete mode 100644 reactos/ntoskrnl/include/precomp.h diff --git a/reactos/Makefile b/reactos/Makefile index 9a8acc0c880..1e7cbd2fcbf 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -169,11 +169,7 @@ else endif ifeq ($(ROS_AUTOMAKE),) - ifeq ($(ARCH),i386) - ROS_AUTOMAKE=makefile.auto - else - ROS_AUTOMAKE=makefile-$(ARCH).auto - endif + ROS_AUTOMAKE=makefile-$(ARCH).auto endif all: $(ROS_AUTOMAKE) diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild index e6668389440..aac81472f1d 100644 --- a/reactos/ReactOS-generic.rbuild +++ b/reactos/ReactOS-generic.rbuild @@ -120,11 +120,6 @@ -Wno-strict-aliasing -Wpointer-arith -Wno-multichar - diff --git a/reactos/ReactOS-i386.rbuild b/reactos/ReactOS-i386.rbuild index 897fadbfa2e..75a6b785298 100644 --- a/reactos/ReactOS-i386.rbuild +++ b/reactos/ReactOS-i386.rbuild @@ -1,6 +1,6 @@ - + diff --git a/reactos/base/applications/games/solitaire/solitaire.cpp b/reactos/base/applications/games/solitaire/solitaire.cpp index e53efda79ce..4046b92ff2a 100644 --- a/reactos/base/applications/games/solitaire/solitaire.cpp +++ b/reactos/base/applications/games/solitaire/solitaire.cpp @@ -196,8 +196,6 @@ int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int iCm SaveSettings(); - try { throw 0; } catch (int i) { } /* HACK */ - return msg.wParam; } diff --git a/reactos/base/applications/games/spider/spider.cpp b/reactos/base/applications/games/spider/spider.cpp index 96188e0c518..49676433234 100644 --- a/reactos/base/applications/games/spider/spider.cpp +++ b/reactos/base/applications/games/spider/spider.cpp @@ -154,9 +154,6 @@ int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int iCm DispatchMessage(&msg); } } - - try { throw 0; } catch (int i) { } /* HACK */ - return msg.wParam; } diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild index 70f70d09219..a678e62164e 100644 --- a/reactos/dll/directx/ddraw/ddraw.rbuild +++ b/reactos/dll/directx/ddraw/ddraw.rbuild @@ -69,6 +69,4 @@ DirectD3D3_Vtable.c DirectD3D7_Vtable.c - - -fno-unit-at-a-time diff --git a/reactos/dll/directx/wine/ddraw/ddraw.rbuild b/reactos/dll/directx/wine/ddraw/ddraw.rbuild index 9a905af1940..f8d9c92c279 100644 --- a/reactos/dll/directx/wine/ddraw/ddraw.rbuild +++ b/reactos/dll/directx/wine/ddraw/ddraw.rbuild @@ -42,7 +42,4 @@ viewport.c wineheaders - - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/actxprxy/actxprxy.rbuild b/reactos/dll/win32/actxprxy/actxprxy.rbuild index 04a760bd2db..87a50a17c83 100644 --- a/reactos/dll/win32/actxprxy/actxprxy.rbuild +++ b/reactos/dll/win32/actxprxy/actxprxy.rbuild @@ -15,7 +15,6 @@ rpcrt4 pseh usrmarshal.c - -fno-unit-at-a-time actxprxy_servprov.idl diff --git a/reactos/dll/win32/advapi32/advapi32.rbuild b/reactos/dll/win32/advapi32/advapi32.rbuild index 0396365b7b9..17e120ba9ce 100644 --- a/reactos/dll/win32/advapi32/advapi32.rbuild +++ b/reactos/dll/win32/advapi32/advapi32.rbuild @@ -59,5 +59,4 @@ token.c advapi32.rc - -fno-unit-at-a-time diff --git a/reactos/dll/win32/crypt32/crypt32.rbuild b/reactos/dll/win32/crypt32/crypt32.rbuild index e622fa27ed9..7884c27a317 100644 --- a/reactos/dll/win32/crypt32/crypt32.rbuild +++ b/reactos/dll/win32/crypt32/crypt32.rbuild @@ -42,6 +42,4 @@ message.c crypt32.rc version.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/gdi32/gdi32.rbuild b/reactos/dll/win32/gdi32/gdi32.rbuild index 5e47b5bc0a4..063b53221d8 100644 --- a/reactos/dll/win32/gdi32/gdi32.rbuild +++ b/reactos/dll/win32/gdi32/gdi32.rbuild @@ -8,11 +8,9 @@ pseh dxguid ntdll - dllmain.c @@ -49,6 +47,4 @@ path.c gdi32.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/kernel32/kernel32.rbuild b/reactos/dll/win32/kernel32/kernel32.rbuild index 91135019d9f..261b7b3645a 100644 --- a/reactos/dll/win32/kernel32/kernel32.rbuild +++ b/reactos/dll/win32/kernel32/kernel32.rbuild @@ -13,12 +13,8 @@ 0x0600 errcodes - - - -fno-unit-at-a-time -fno-exceptions -fno-rtti diff --git a/reactos/dll/win32/ole32/ole32.rbuild b/reactos/dll/win32/ole32/ole32.rbuild index 1c7969f8da7..24f60c87a32 100644 --- a/reactos/dll/win32/ole32/ole32.rbuild +++ b/reactos/dll/win32/ole32/ole32.rbuild @@ -63,8 +63,6 @@ dcom.idl irot.idl . - - -fno-unit-at-a-time irot.idl diff --git a/reactos/dll/win32/psapi/psapi.rbuild b/reactos/dll/win32/psapi/psapi.rbuild index 812265a2b27..7c21b6cc5a3 100644 --- a/reactos/dll/win32/psapi/psapi.rbuild +++ b/reactos/dll/win32/psapi/psapi.rbuild @@ -5,12 +5,8 @@ epsapi pseh ntdll - malloc.c psapi.c psapi.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/qmgrprxy/qmgrprxy.rbuild b/reactos/dll/win32/qmgrprxy/qmgrprxy.rbuild index 64dc200cd8c..cea10b90855 100644 --- a/reactos/dll/win32/qmgrprxy/qmgrprxy.rbuild +++ b/reactos/dll/win32/qmgrprxy/qmgrprxy.rbuild @@ -15,7 +15,6 @@ rpcrt4 pseh version.rc - -fno-unit-at-a-time qmgrprxy.idl diff --git a/reactos/dll/win32/rpcrt4/rpcrt4.rbuild b/reactos/dll/win32/rpcrt4/rpcrt4.rbuild index a0dd9e14e40..ad1008bed48 100644 --- a/reactos/dll/win32/rpcrt4/rpcrt4.rbuild +++ b/reactos/dll/win32/rpcrt4/rpcrt4.rbuild @@ -39,8 +39,6 @@ rpcrt4.rc epm.idl . - - -fno-unit-at-a-time epm.idl diff --git a/reactos/dll/win32/setupapi/setupapi.rbuild b/reactos/dll/win32/setupapi/setupapi.rbuild index 81c1dd70394..bb3e0e37c56 100644 --- a/reactos/dll/win32/setupapi/setupapi.rbuild +++ b/reactos/dll/win32/setupapi/setupapi.rbuild @@ -39,6 +39,4 @@ stubs.c rpc.c setupapi.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/syssetup/syssetup.rbuild b/reactos/dll/win32/syssetup/syssetup.rbuild index d2909ce527b..4fd7e6249da 100644 --- a/reactos/dll/win32/syssetup/syssetup.rbuild +++ b/reactos/dll/win32/syssetup/syssetup.rbuild @@ -20,6 +20,4 @@ logfile.c wizard.c syssetup.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/user32/user32.rbuild b/reactos/dll/win32/user32/user32.rbuild index 6fd34e68547..e905d747d31 100644 --- a/reactos/dll/win32/user32/user32.rbuild +++ b/reactos/dll/win32/user32/user32.rbuild @@ -11,11 +11,9 @@ pseh ntdll -fms-extensions - button.c combo.c @@ -76,6 +74,4 @@ winpos.c user32.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/wintrust/wintrust.rbuild b/reactos/dll/win32/wintrust/wintrust.rbuild index 1c73efd7038..910d2278f8e 100644 --- a/reactos/dll/win32/wintrust/wintrust.rbuild +++ b/reactos/dll/win32/wintrust/wintrust.rbuild @@ -18,6 +18,4 @@ asn.c softpub.c version.rc - - -fno-unit-at-a-time diff --git a/reactos/dll/win32/wlanapi/wlanapi.rbuild b/reactos/dll/win32/wlanapi/wlanapi.rbuild index 781a8ae7a44..f17b4c263a4 100644 --- a/reactos/dll/win32/wlanapi/wlanapi.rbuild +++ b/reactos/dll/win32/wlanapi/wlanapi.rbuild @@ -8,6 +8,4 @@ pseh ntdll main.c - - -fno-unit-at-a-time diff --git a/reactos/drivers/input/kbdclass/kbdclass.rbuild b/reactos/drivers/input/kbdclass/kbdclass.rbuild index 37fda368f08..480896a80ed 100644 --- a/reactos/drivers/input/kbdclass/kbdclass.rbuild +++ b/reactos/drivers/input/kbdclass/kbdclass.rbuild @@ -9,6 +9,4 @@ misc.c setup.c kbdclass.rc - - -fno-unit-at-a-time diff --git a/reactos/drivers/input/mouclass/mouclass.rbuild b/reactos/drivers/input/mouclass/mouclass.rbuild index bcbcc4ce25d..1b75a0111cd 100644 --- a/reactos/drivers/input/mouclass/mouclass.rbuild +++ b/reactos/drivers/input/mouclass/mouclass.rbuild @@ -8,6 +8,4 @@ misc.c mouclass.c mouclass.rc - - -fno-unit-at-a-time diff --git a/reactos/drivers/network/afd/afd.rbuild b/reactos/drivers/network/afd/afd.rbuild index aef02b46a6b..6e56ce23b07 100644 --- a/reactos/drivers/network/afd/afd.rbuild +++ b/reactos/drivers/network/afd/afd.rbuild @@ -8,9 +8,7 @@ ntoskrnl hal - bind.c @@ -27,6 +25,4 @@ write.c afd.rc - - -fno-unit-at-a-time diff --git a/reactos/drivers/network/tcpip/tcpip.rbuild b/reactos/drivers/network/tcpip/tcpip.rbuild index ea9d3a6d5e1..f3c6114e568 100644 --- a/reactos/drivers/network/tcpip/tcpip.rbuild +++ b/reactos/drivers/network/tcpip/tcpip.rbuild @@ -13,11 +13,9 @@ chew ntoskrnl hal - lan.c @@ -36,6 +34,4 @@ wait.c tcpip.rc - - -fno-unit-at-a-time diff --git a/reactos/lib/rtl/rtl.rbuild b/reactos/lib/rtl/rtl.rbuild index 6d89eeb18c9..0b15a1c8cda 100644 --- a/reactos/lib/rtl/rtl.rbuild +++ b/reactos/lib/rtl/rtl.rbuild @@ -107,9 +107,5 @@ version.c wait.c workitem.c - - - -fno-unit-at-a-time diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index 71f4f655551..9c6a06777f9 100644 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -1,5 +1,101 @@ -#include "precomp.h" +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: ntoskrnl/include/ntoskrnl.h + * PURPOSE: Main Kernel Header + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + +/* INCLUDES ******************************************************************/ + +/* ARM Bringup Hack */ +#ifdef _M_ARM +#define DbgPrint DbgPrintEarly +#endif + +/* Version Data */ +#undef __MSVCRT__ +#include + +/* DDK/IFS/NDK Headers */ +#define _REALLY_GET_CALLERS_CALLER +#include +#include +#undef DECLSPEC_IMPORT +#define DECLSPEC_IMPORT +#include +#include +#include +#undef NTHALAPI +#define NTHALAPI __declspec(dllimport) +#include +#undef TEXT +#define TEXT(s) L##s +#include + +/* FIXME: Temporary until Winldr is used */ +#include + +/* C Headers */ +#include +#include +#include +#include +#include + +/* SEH support with PSEH */ +#include + +/* ReactOS Headers */ +#include +#include + +/* SetupLDR Support */ +#include + +/* KD Support */ +#define NOEXTAPI +#include +#include +#include +#ifndef _WINKD_ +#include +#endif + +/* PNP GUIDs */ +#include + +/* Internal Headers */ +#include "internal/ntoskrnl.h" +#include "config.h" -/* Headers that shouldn't be precompiled due to GCC bugs */ #include #include "internal/probe.h" + +// +// Define the internal versions of external and public global data +// +#define IoFileObjectType _IoFileObjectType +#define PsThreadType _PsThreadType +#define PsProcessType _PsProcessType +#define ExEventObjectType _ExEventObjectType +#define ExSemaphoreObjectType _ExSemaphoreObjectType +#define KdDebuggerEnabled _KdDebuggerEnabled +#define KdDebuggerNotPresent _KdDebuggerNotPresent +#define NlsOemLeadByteInfo _NlsOemLeadByteInfo +extern PUSHORT _NlsOemLeadByteInfo; +#define FsRtlLegalAnsiCharacterArray _FsRtlLegalAnsiCharacterArray +#undef LEGAL_ANSI_CHARACTER_ARRAY +#undef NLS_MB_CODE_PAGE_TAG +#undef NLS_OEM_LEAD_BYTE_INFO +#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray +#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag +#define NLS_OEM_LEAD_BYTE_INFO _NlsOemLeadByteInfo +#undef KD_DEBUGGER_ENABLED +#undef KD_DEBUGGER_NOT_PRESENT +#define KD_DEBUGGER_ENABLED KdDebuggerEnabled +#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent +#define HalDispatchTable _HalDispatchTable +#undef HALDISPATCH +#define HALDISPATCH (&HalDispatchTable) +#define ExRaiseStatus RtlRaiseStatus diff --git a/reactos/ntoskrnl/include/precomp.h b/reactos/ntoskrnl/include/precomp.h deleted file mode 100644 index 8948bae44f0..00000000000 --- a/reactos/ntoskrnl/include/precomp.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel - * FILE: ntoskrnl/include/ntoskrnl.h - * PURPOSE: Main Kernel Header - * PROGRAMMER: Alex Ionescu (alex@relsoft.net) - */ - -/* INCLUDES ******************************************************************/ - -/* ARM Bringup Hack */ -#ifdef _M_ARM -#define DbgPrint DbgPrintEarly -#endif - -/* Version Data */ -#undef __MSVCRT__ -#include - -/* DDK/IFS/NDK Headers */ -#define _REALLY_GET_CALLERS_CALLER -#include -#include -#undef DECLSPEC_IMPORT -#define DECLSPEC_IMPORT -#include -#include -#include -#undef NTHALAPI -#define NTHALAPI __declspec(dllimport) -#include -#undef TEXT -#define TEXT(s) L##s -#include - -/* FIXME: Temporary until Winldr is used */ -#include - -/* C Headers */ -#include -#include -#include -#include -#include - -/* SEH support with PSEH */ -#include - -/* ReactOS Headers */ -#include -#include - -/* SetupLDR Support */ -#include - -/* KD Support */ -#define NOEXTAPI -#include -#include -#include -#ifndef _WINKD_ -#include -#endif - -/* PNP GUIDs */ -#include - -/* Internal Headers */ -#include "internal/ntoskrnl.h" -#include "config.h" - -// -// Define the internal versions of external and public global data -// -#define IoFileObjectType _IoFileObjectType -#define PsThreadType _PsThreadType -#define PsProcessType _PsProcessType -#define ExEventObjectType _ExEventObjectType -#define ExSemaphoreObjectType _ExSemaphoreObjectType -#define KdDebuggerEnabled _KdDebuggerEnabled -#define KdDebuggerNotPresent _KdDebuggerNotPresent -#define NlsOemLeadByteInfo _NlsOemLeadByteInfo -extern PUSHORT _NlsOemLeadByteInfo; -#define FsRtlLegalAnsiCharacterArray _FsRtlLegalAnsiCharacterArray -#undef LEGAL_ANSI_CHARACTER_ARRAY -#undef NLS_MB_CODE_PAGE_TAG -#undef NLS_OEM_LEAD_BYTE_INFO -#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray -#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag -#define NLS_OEM_LEAD_BYTE_INFO _NlsOemLeadByteInfo -#undef KD_DEBUGGER_ENABLED -#undef KD_DEBUGGER_NOT_PRESENT -#define KD_DEBUGGER_ENABLED KdDebuggerEnabled -#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent -#define HalDispatchTable _HalDispatchTable -#undef HALDISPATCH -#define HALDISPATCH (&HalDispatchTable) -#define ExRaiseStatus RtlRaiseStatus diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 2a308d433b5..0de8a3faaa4 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -30,11 +30,9 @@ bootvid wdmguid bugcodes - @@ -502,7 +500,4 @@ ntoskrnl.rc ntoskrnl_$(ARCH).lnk - - - -fno-unit-at-a-time diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 1c0dc8e8b3c..5af1413e69a 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -30,7 +30,7 @@ #include "gdidbg.c" -/* static */ /* FIXME: -fno-unit-at-a-time breaks this */ +static BOOL INTERNAL_CALL GDI_CleanupDummy(PVOID ObjectBody); /** GLOBALS *******************************************************************/ @@ -140,7 +140,7 @@ DeAllocTypeDataDump(INT TypeInfo) /* * Dummy GDI Cleanup Callback */ -/* static */ /* FIXME: -fno-unit-at-a-time breaks this */ +static BOOL INTERNAL_CALL GDI_CleanupDummy(PVOID ObjectBody) { diff --git a/reactos/subsystems/win32/win32k/win32k.rbuild b/reactos/subsystems/win32/win32k/win32k.rbuild index b5658babf67..eaefbff9ee0 100644 --- a/reactos/subsystems/win32/win32k/win32k.rbuild +++ b/reactos/subsystems/win32/win32k/win32k.rbuild @@ -20,9 +20,7 @@ /wd4276 - dib8gen.c @@ -205,8 +203,5 @@ stubs.c umpdstubs.c - - - -fno-unit-at-a-time diff --git a/reactos/tools/rbuild/backend/mingw/compilers/gcc.mak b/reactos/tools/rbuild/backend/mingw/compilers/gcc.mak index ad4aebf9351..36857302df9 100644 --- a/reactos/tools/rbuild/backend/mingw/compilers/gcc.mak +++ b/reactos/tools/rbuild/backend/mingw/compilers/gcc.mak @@ -12,6 +12,12 @@ CPPFLAG_UNICODE:=-DUNICODE -D_UNICODE BUILTIN_CFLAGS+= -fno-optimize-sibling-calls BUILTIN_CXXFLAGS+= -fno-optimize-sibling-calls +# Add -fno-set-stack-executable required for x86/MinGW +ifneq (,$(filter $(ARCH),amd64 i386)) + BUILTIN_CFLAGS+= -fno-set-stack-executable + BUILTIN_CXXFLAGS+= -fno-set-stack-executable +endif + #(module, source, dependencies, cflags, output) define RBUILD_DEPENDS diff --git a/reactos/tools/rbuild/backend/mingw/linkers/ld.mak b/reactos/tools/rbuild/backend/mingw/linkers/ld.mak index dbba33ea4f6..cbcc2bc0edb 100644 --- a/reactos/tools/rbuild/backend/mingw/linkers/ld.mak +++ b/reactos/tools/rbuild/backend/mingw/linkers/ld.mak @@ -1,5 +1,6 @@ -LDFLAG_DLL:=-shared -LDFLAG_DRIVER:=-shared --subsystem=native +# -exclude-all-symbols disables autoexporting all symbols *if none were found* (either in a DEF file or using __declspec(dllexport) +LDFLAG_DLL:=-shared -exclude-all-symbols +LDFLAG_DRIVER:=-shared --subsystem=native -exclude-all-symbols LDFLAG_NOSTDLIB:=-nostartfiles -nostdlib LDFLAG_CONSOLE:=--subsystem=console LDFLAG_WINDOWS:=--subsystem=windows @@ -40,7 +41,7 @@ $(1)_CLEANFILES+=${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(5): ${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(7) $(3) $$(RSYM_TARGET) $$(PEFIXUP_TARGET) | ${call RBUILD_dir,$(5)} $$(ECHO_LD) #~ $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(7) ${call RBUILD_ldflags,$(1),$(4)} -o $$@ - $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(10) $(7) $(10) ${call RBUILD_ldflags,$(1),$(4)} -o $$@ + $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp --start-group $(10) $(7) --end-group ${call RBUILD_ldflags,$(1),$(4)} -o $$@ ifneq ($(or $(6),$$(MODULETYPE$$($(1)_TYPE)_KMODE)),) $$(ECHO_PEFIXUP) $$(Q)$$(PEFIXUP_TARGET) $$@ $(if $(6),-exports) $$(if $$(MODULETYPE$($(1)_TYPE)_KMODE),-sections) diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index 770e395562d..597b26baad5 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -480,8 +480,11 @@ MingwBackend::GenerateGlobalVariables () const fputs ( "BUILTIN_CXXINCLUDES+= $(TARGET_CPPFLAGS)\n", fMakefile ); fprintf ( fMakefile, "PROJECT_CCLIBS := \"$(shell ${TARGET_CC} -print-libgcc-file-name)\"\n" ); - fprintf ( fMakefile, "PROJECT_CXXLIBS := \"$(shell ${TARGET_CPP} -print-file-name=libstdc++.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libgcc.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingw32.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingwex.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libcoldname.a)\"\n" ); - + + // We use our proprietary "ofmt_stub.a" to implement a stub for "_get_output_format" required by "libmingwex.a". + // This archive just contains the compiled "ofmt_stub.s" supplied with the MinGW Runtime sources. + fprintf ( fMakefile, "PROJECT_CXXLIBS := \"$(shell ${TARGET_CPP} -print-file-name=libstdc++.a)\" \"$(shell ${TARGET_CPP} -print-libgcc-file-name)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingw32.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libmingwex.a)\" \"$(shell ${TARGET_CPP} -print-file-name=ofmt_stub.a)\" \"$(shell ${TARGET_CPP} -print-file-name=libcoldname.a)\"\n" ); + /* hack to get libgcc_eh.a, should check mingw version or something */ if (Environment::GetArch() == "amd64") { @@ -844,7 +847,7 @@ MingwBackend::GetVersionString ( const string& versionCommand ) buffer[i] = '\0'; pclose ( fp ); - char separators[] = " ()"; + char separators[] = " ()\n"; char *token; char *prevtoken = NULL; @@ -888,7 +891,7 @@ MingwBackend::GetNetwideAssemblerVersion ( const string& nasmCommand ) string MingwBackend::GetCompilerVersion ( const string& compilerCommand ) { - string versionCommand = ssprintf ( "%s --version gcc", + string versionCommand = ssprintf ( "%s --version", compilerCommand.c_str (), NUL, NUL ); @@ -908,7 +911,7 @@ MingwBackend::GetBinutilsVersion ( const string& binutilsCommand ) bool MingwBackend::IsSupportedCompilerVersion ( const string& compilerVersion ) { - if ( strcmp ( compilerVersion.c_str (), "3.4.2") < 0 ) + if ( strcmp ( compilerVersion.c_str (), "4.4.0") < 0 ) return false; else return true; @@ -970,27 +973,32 @@ MingwBackend::GetBinutilsVersionDate ( const string& binutilsCommand ) bool MingwBackend::IsSupportedBinutilsVersion ( const string& binutilsVersion ) { - if ( manualBinutilsSetting ) return true; - - /* linux */ - if ( binutilsVersion.find('.') != std::string::npos ) + int digit = binutilsVersion.find_last_of("."); + if(digit == -1) { - /* TODO: blacklist versions on version number instead of date */ - return true; - } - - /* - * - Binutils older than 2003/10/01 have broken windres which can't handle - * icons with alpha channel. - * - Binutils between 2004/09/02 and 2004/10/08 have broken handling of - * forward exports in dlltool. - */ - if ( ( ( strcmp ( binutilsVersion.c_str (), "20040902") >= 0 ) && - ( strcmp ( binutilsVersion.c_str (), "20041008") <= 0 ) ) || - ( strcmp ( binutilsVersion.c_str (), "20031001") < 0 ) ) + printf("Unable to detect binutils version!\n"); return false; + } + + string date = string(binutilsVersion, digit + 1); + if(date.length() == 8) + { + /* This is a real date in the format YYYYMMDD. + Check whether we have at least Binutils 20091016 (the oldest one + we were still using after upgrading to RosBE 1.5). */ + if(strcmp(date.c_str(), "20091016") < 0) + return false; + } else - return true; + { + /* This is no date, so binutilsVersion should just contain the version + number. + Binutils 2.20 will hopefully contain the required features. */ + if(strcmp(binutilsVersion.c_str(), "2.20") < 0) + return false; + } + + return true; } void diff --git a/reactos/tools/rbuild/backend/mingw/rules.mak b/reactos/tools/rbuild/backend/mingw/rules.mak index 13da68a5c77..f83f84fe25d 100644 --- a/reactos/tools/rbuild/backend/mingw/rules.mak +++ b/reactos/tools/rbuild/backend/mingw/rules.mak @@ -263,7 +263,7 @@ ${call RBUILD_intermediate_path_noext,$(2)}_c: $(2) $(3) $$(widl_TARGET) | ${cal $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H ${call RBUILD_intermediate_path_noext,$(2)}_c.h -c -C ${call RBUILD_intermediate_path_noext,$(2)}_c.c $(2) $${checkpoint} $$@>$(NUL) -${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_c.c,,-fno-unit-at-a-time,${call RBUILD_intermediate_path_noext,$(2)}_c.o} +${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_c.c,,,${call RBUILD_intermediate_path_noext,$(2)}_c.o} endef @@ -279,7 +279,7 @@ ${call RBUILD_intermediate_path_noext,$(2)}_s: $(2) $(3) $$(widl_TARGET) | ${cal $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H ${call RBUILD_intermediate_path_noext,$(2)}_s.h -s -S ${call RBUILD_intermediate_path_noext,$(2)}_s.c $(2) $${checkpoint} $$@>$(NUL) -${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_s.c,,-fno-unit-at-a-time,${call RBUILD_intermediate_path_noext,$(2)}_s.o} +${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_s.c,,,${call RBUILD_intermediate_path_noext,$(2)}_s.o} endef @@ -295,7 +295,7 @@ ${call RBUILD_intermediate_path_noext,$(2)}_p: $(2) $(3) $$(widl_TARGET) | ${cal $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -h -H ${call RBUILD_intermediate_path_noext,$(2)}_p.h -p -P ${call RBUILD_intermediate_path_noext,$(2)}_p.c $(2) $${checkpoint} $$@>$(NUL) -${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_p.c,,-fno-unit-at-a-time,${call RBUILD_intermediate_path_noext,$(2)}_p.o} +${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_p.c,,,${call RBUILD_intermediate_path_noext,$(2)}_p.o} endef @@ -308,7 +308,7 @@ ${call RBUILD_intermediate_path_noext,$(2)}_i.c: $(2) $(3) $$(widl_TARGET) | ${c $$(ECHO_WIDL) $$(Q)$$(widl_TARGET) ${call RBUILD_midlflags,$(1),$(4),-I${call RBUILD_dir,$(2)}} -u -U $$@ $$< -${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_i.c,,-fno-unit-at-a-time,${call RBUILD_intermediate_path_noext,$(2)}_i.o} +${call RBUILD_CC,$(1),${call RBUILD_intermediate_path_noext,$(2)}_i.c,,,${call RBUILD_intermediate_path_noext,$(2)}_i.o} endef From d4cca547fc97416fc07d745aae5916bc1624f993 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Tue, 9 Feb 2010 19:02:56 +0000 Subject: [PATCH 54/97] Demote "may be used uninitialized" errors into warnings again. svn path=/trunk/; revision=45536 --- reactos/ReactOS-generic.rbuild | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild index aac81472f1d..82159f42d0e 100644 --- a/reactos/ReactOS-generic.rbuild +++ b/reactos/ReactOS-generic.rbuild @@ -117,9 +117,9 @@ -fno-strict-aliasing - -Wno-strict-aliasing -Wpointer-arith -Wno-multichar + -Wno-error=uninitialized From cca78c7b110238eae9c1df578dc419b5f24c0d4e Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Tue, 9 Feb 2010 20:08:06 +0000 Subject: [PATCH 55/97] Fix REL build. svn path=/trunk/; revision=45538 --- reactos/boot/freeldr/freeldr/debug.c | 2 +- reactos/boot/freeldr/freeldr/include/debug.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c index 5496c03d5ad..6aebbd18252 100644 --- a/reactos/boot/freeldr/freeldr/debug.c +++ b/reactos/boot/freeldr/freeldr/debug.c @@ -21,7 +21,7 @@ #include -#if defined(DBG) && !defined(_M_ARM) +#if DBG && !defined(_M_ARM) //#define DEBUG_ALL //#define DEBUG_INIFILE diff --git a/reactos/boot/freeldr/freeldr/include/debug.h b/reactos/boot/freeldr/freeldr/include/debug.h index e8f376e5555..c7d57f6fb49 100644 --- a/reactos/boot/freeldr/freeldr/include/debug.h +++ b/reactos/boot/freeldr/freeldr/include/debug.h @@ -39,7 +39,7 @@ extern char* g_file; extern int g_line; -#if defined(DBG) && !defined(_M_ARM) +#if DBG && !defined(_M_ARM) VOID DbgPrintMask(ULONG Mask, char *format, ...); VOID DebugInit(VOID); From e815fe376bf12f54161d941016d217af7d391aed Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Tue, 9 Feb 2010 20:21:54 +0000 Subject: [PATCH 56/97] Fix REL build, part 2. svn path=/trunk/; revision=45539 --- reactos/boot/freeldr/freeldr/comm/rs232.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/comm/rs232.c b/reactos/boot/freeldr/freeldr/comm/rs232.c index dee31ced877..0ef92cef2cd 100644 --- a/reactos/boot/freeldr/freeldr/comm/rs232.c +++ b/reactos/boot/freeldr/freeldr/comm/rs232.c @@ -277,6 +277,8 @@ VOID Rs232PortPutByte(UCHAR ByteToSend) WRITE_PORT_UCHAR (SER_THR(Rs232PortBase), ByteToSend); } +#endif /* DBG */ + BOOLEAN Rs232PortInUse(ULONG Base) { #if DBG @@ -286,5 +288,4 @@ BOOLEAN Rs232PortInUse(ULONG Base) #endif } -#endif /* DBG */ -#endif +#endif /* not _M_ARM */ From 29200c4aa6de62b2115173472a7a1cfe03dee31c Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 22:53:41 +0000 Subject: [PATCH 57/97] [NTOS]: Setup the template PTE and PDE used on ARM. svn path=/trunk/; revision=45540 --- reactos/ntoskrnl/mm/arm/page.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/mm/arm/page.c b/reactos/ntoskrnl/mm/arm/page.c index 30969fd5c87..27761ec18b1 100644 --- a/reactos/ntoskrnl/mm/arm/page.c +++ b/reactos/ntoskrnl/mm/arm/page.c @@ -15,7 +15,7 @@ /* GLOBALS ********************************************************************/ ULONG MmGlobalKernelPageDirectory[4096]; -//MMPTE MiArmTemplatePte, MiArmTemplatePde; +MMPDE HyperTemplatePde; /* PRIVATE FUNCTIONS **********************************************************/ @@ -248,9 +248,15 @@ MmInitGlobalKernelPageDirectory(VOID) PULONG CurrentPageDirectory = (PULONG)PDE_BASE; extern MMPTE HyperTemplatePte; - /* Setup template */ - HyperTemplatePte.u.Hard.Valid = HyperTemplatePte.u.Hard.Access = 1; - + /* Setup PTE template */ + HyperTemplatePte.u.Long = 0; + HyperTemplatePte.u.Hard.Valid = 1; + HyperTemplatePte.u.Hard.Access = 1; + + /* Setup PDE template */ + HyperTemplatePde.u.Long = 0; + HyperTemplatePde.u.Hard.Valid = 1; + /* Loop the 2GB of address space which belong to the kernel */ for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++) { From 5095fd3746ed8a9aa88cc59c94f0dde916af58e6 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 9 Feb 2010 22:54:02 +0000 Subject: [PATCH 58/97] Implement device location information override support and add the location override value for PS/2 mice. PS/2 keyboards be added next. Please translate the location override string. svn path=/trunk/; revision=45541 --- reactos/dll/win32/devmgr/advprop.c | 3 +- reactos/dll/win32/devmgr/hwpage.c | 3 +- reactos/dll/win32/devmgr/misc.c | 125 +++++++++++++++++++---------- reactos/dll/win32/devmgr/precomp.h | 3 +- reactos/media/inf/msmouse.inf | Bin 18914 -> 19248 bytes 5 files changed, 87 insertions(+), 47 deletions(-) diff --git a/reactos/dll/win32/devmgr/advprop.c b/reactos/dll/win32/devmgr/advprop.c index eadd5218269..f3f69553306 100644 --- a/reactos/dll/win32/devmgr/advprop.c +++ b/reactos/dll/win32/devmgr/advprop.c @@ -1405,7 +1405,8 @@ GetParentNode: } /* set the device location edit control text */ - if (GetDeviceLocationString(DeviceInfoData->DevInst, + if (GetDeviceLocationString(DeviceInfoSet, + DeviceInfoData, dap->ParentDevInst, dap->szTemp, sizeof(dap->szTemp) / sizeof(dap->szTemp[0]))) diff --git a/reactos/dll/win32/devmgr/hwpage.c b/reactos/dll/win32/devmgr/hwpage.c index 190c22048ac..0b26bd67866 100644 --- a/reactos/dll/win32/devmgr/hwpage.c +++ b/reactos/dll/win32/devmgr/hwpage.c @@ -181,7 +181,8 @@ UpdateControlStates(IN PHARDWARE_PAGE_DATA hpd) } /* get the location string */ - if (GetDeviceLocationString(HwDevInfo->DevInfoData.DevInst, + if (GetDeviceLocationString(HwDevInfo->ClassDevInfo->hDevInfo, + &HwDevInfo->DevInfoData, 0, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) && diff --git a/reactos/dll/win32/devmgr/misc.c b/reactos/dll/win32/devmgr/misc.c index f6549c70188..4e8c2330a3b 100644 --- a/reactos/dll/win32/devmgr/misc.c +++ b/reactos/dll/win32/devmgr/misc.c @@ -317,7 +317,8 @@ GetDeviceManufacturerString(IN HDEVINFO DeviceInfoSet, BOOL -GetDeviceLocationString(IN DEVINST dnDevInst OPTIONAL, +GetDeviceLocationString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, IN DEVINST dnParentDevInst OPTIONAL, OUT LPWSTR szBuffer, IN DWORD BufferSize) @@ -326,68 +327,104 @@ GetDeviceLocationString(IN DEVINST dnDevInst OPTIONAL, ULONG DataSize; CONFIGRET cRet; LPWSTR szFormatted; + HKEY hKey; + DWORD dwSize, dwType; BOOL Ret = FALSE; DataSize = BufferSize * sizeof(WCHAR); szBuffer[0] = L'\0'; - if (dnParentDevInst != 0) + + hKey = SetupDiOpenDevRegKey(DeviceInfoSet, + DeviceInfoData, + DICS_FLAG_GLOBAL, + 0, + DIREG_DRV, + KEY_QUERY_VALUE); + if (hKey != INVALID_HANDLE_VALUE) { - /* query the parent node name */ - if (CM_Get_DevNode_Registry_Property(dnParentDevInst, - CM_DRP_DEVICEDESC, - &RegDataType, - szBuffer, - &DataSize, - 0) == CR_SUCCESS && - RegDataType == REG_SZ && - LoadAndFormatString(hDllInstance, - IDS_DEVONPARENT, - &szFormatted, - szBuffer) != 0) + /* query the LocationInformationOverride value */ + dwSize = BufferSize; + if (RegQueryValueEx(hKey, + L"LocationInformationOverride", + NULL, + &dwType, + (LPBYTE)szBuffer, + &dwSize) == ERROR_SUCCESS && + dwType == REG_SZ && + szBuffer[0] != L'\0') { - wcsncpy(szBuffer, - szFormatted, - BufferSize - 1); - szBuffer[BufferSize - 1] = L'\0'; - LocalFree((HLOCAL)szFormatted); Ret = TRUE; } - } - else if (dnDevInst != 0) - { - cRet = CM_Get_DevNode_Registry_Property(dnDevInst, - CM_DRP_LOCATION_INFORMATION, - &RegDataType, - szBuffer, - &DataSize, - 0); - if (cRet == CR_SUCCESS && RegDataType == REG_SZ) + else { - /* FIXME - check string for NULL termination! */ - Ret = TRUE; + szBuffer[0] = L'\0'; } - if (Ret && szBuffer[0] >= L'0' && szBuffer[0] <= L'9') + RegCloseKey(hKey); + } + + + if (!Ret) + { + if (dnParentDevInst != 0) { - /* convert the string to an integer value and create a - formatted string */ - ULONG ulLocation = (ULONG)wcstoul(szBuffer, - NULL, - 10); - if (LoadAndFormatString(hDllInstance, - IDS_LOCATIONSTR, - &szFormatted, - ulLocation, - szBuffer) != 0) + /* query the parent node name */ + if (CM_Get_DevNode_Registry_Property(dnParentDevInst, + CM_DRP_DEVICEDESC, + &RegDataType, + szBuffer, + &DataSize, + 0) == CR_SUCCESS && + RegDataType == REG_SZ && + LoadAndFormatString(hDllInstance, + IDS_DEVONPARENT, + &szFormatted, + szBuffer) != 0) { wcsncpy(szBuffer, szFormatted, BufferSize - 1); szBuffer[BufferSize - 1] = L'\0'; LocalFree((HLOCAL)szFormatted); + Ret = TRUE; + } + } + else if (DeviceInfoData->DevInst != 0) + { + cRet = CM_Get_DevNode_Registry_Property(DeviceInfoData->DevInst, + CM_DRP_LOCATION_INFORMATION, + &RegDataType, + szBuffer, + &DataSize, + 0); + if (cRet == CR_SUCCESS && RegDataType == REG_SZ) + { + /* FIXME - check string for NULL termination! */ + Ret = TRUE; + } + + if (Ret && szBuffer[0] >= L'0' && szBuffer[0] <= L'9') + { + /* convert the string to an integer value and create a + formatted string */ + ULONG ulLocation = (ULONG)wcstoul(szBuffer, + NULL, + 10); + if (LoadAndFormatString(hDllInstance, + IDS_LOCATIONSTR, + &szFormatted, + ulLocation, + szBuffer) != 0) + { + wcsncpy(szBuffer, + szFormatted, + BufferSize - 1); + szBuffer[BufferSize - 1] = L'\0'; + LocalFree((HLOCAL)szFormatted); + } + else + Ret = FALSE; } - else - Ret = FALSE; } } diff --git a/reactos/dll/win32/devmgr/precomp.h b/reactos/dll/win32/devmgr/precomp.h index 30111113a3b..1094d57eea8 100644 --- a/reactos/dll/win32/devmgr/precomp.h +++ b/reactos/dll/win32/devmgr/precomp.h @@ -70,7 +70,8 @@ GetDeviceManufacturerString(IN HDEVINFO DeviceInfoSet, IN DWORD BufferSize); BOOL -GetDeviceLocationString(IN DEVINST dnDevInst OPTIONAL, +GetDeviceLocationString(IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, IN DEVINST dnParentDevInst OPTIONAL, OUT LPWSTR szBuffer, IN DWORD BufferSize); diff --git a/reactos/media/inf/msmouse.inf b/reactos/media/inf/msmouse.inf index 94f5e15ffb1f9cae19b5ad5f5086fd564b0f7142..a1beeac90c767a24fe1737cda68742687d8b6224 100644 GIT binary patch delta 346 zcmaDfnQ_B3#tr{O>pd8}8G;ye7!<(RhasOKnIVy(gdr2i%46^Z;xr(uh#?nA)Ssb@ zAr&ZA1XPs*WPx-WfJs#bbQ93ksxt60aDlNkgD!*avdG%8(9(sX)sWfKJE*k|jV#Dlh~v1T*L}7y((iKz=DhF;I;HPzT5ZC7aJn$#Xgr vYfUQHV2~xnK*Ljkp^^=x!PZS~R2Ah<1X^1R6wLrTr+D&NDdWu&DyLKdg~LUE delta 32 qcmV+*0N?+xmI30E0kHlRvvd~N1e3fi8nezD{s@z_8!EGACCVlHhYpJX From bf310b5d1ad371336715609392c82547eef47a3c Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 22:56:21 +0000 Subject: [PATCH 59/97] [NTOS]: Implement new and correct MiAddressToPte, ToPde, ToPdeOffset, and MiPdeToAddres and MiAddressToPte on ARM. Remove deprecated ARM page definitions. [NTOS]: Move HYPER_SPACE to 0xC0500000 since it must be on its own PDE. We need to revisit some FreeLDR Mm decisions later. [NTOS]: Move certain arch-specific definitions from mm.h to the arch-specific mm.h [NTOS]: Fix certain parts of ARM3 which made the assumption that a PDE shares the same structure as a PTE. This is true on all architectures except ARM. We now define a new MMPDE type specifically for PDEs. On x86 it is defined to MMPTE with no changes. svn path=/trunk/; revision=45542 --- reactos/ntoskrnl/include/internal/arm/mm.h | 186 +++----------------- reactos/ntoskrnl/include/internal/i386/mm.h | 28 +++ reactos/ntoskrnl/include/internal/mm.h | 29 --- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 3 +- reactos/ntoskrnl/mm/ARM3/pagfault.c | 7 +- 5 files changed, 63 insertions(+), 190 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index 26fa9e6e8c8..68eb3262250 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -25,7 +25,7 @@ #define PTE_BASE 0xC0000000 #define PTE_TOP 0xC03FFFFF #define PDE_BASE 0xC0400000 -#define HYPER_SPACE 0xC0404000 +#define HYPER_SPACE 0xC0500000 #if 0 typedef struct _HARDWARE_PDE_ARMV6 @@ -123,167 +123,39 @@ PULONG MmGetPageDirectory(VOID); /* Easy accessing PFN in PTE */ #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) +#define NR_SECTION_PAGE_TABLES 1024 +#define NR_SECTION_PAGE_ENTRIES 256 -#if 1 +/* See PDR definition */ +#define MI_HYPERSPACE_PTES (256 - 1) +#define MI_ZERO_PTES (32) +#define MI_MAPPING_RANGE_START ((ULONG)HYPER_SPACE) +#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ + MI_HYPERSPACE_PTES * PAGE_SIZE) +#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ + PAGE_SIZE) -// -// FIXFIX: This is all wrong now!!! -// +/* Retrives the PDE entry for the given VA */ +#define MiGetPdeAddress(x) ((PMMPDE)(PDE_BASE + (((ULONG)(x) >> 20) << 2))) +#define MiAddressToPde(x) MiGetPdeAddress(x) + +/* Retrieves the PTE entry for the given VA */ +#define MiGetPteAddress(x) ((PMMPTE)(PTE_BASE + (((ULONG)(x) >> 12) << 2))) +#define MiAddressToPte(x) MiGetPteAddress(x) -// -// Take 0x80812345 and extract: -// PTE_BASE[0x808][0x12] -// -#define MiGetPteAddress(x) \ - (PMMPTE)(PTE_BASE + \ - (((ULONG)(x) >> 20) << 12) + \ - ((((ULONG)(x) >> 12) & 0xFF) << 2)) +/* Retrives the PDE offset for the given VA */ +#define MiGetPdeOffset(x) (((ULONG)(x)) >> 20) -#define MiGetPdeAddress(x) \ - (PMMPDE_HARDWARE)(PDE_BASE + \ - (((ULONG)(x) >> 20) << 2)) +/* Convert a PTE into a corresponding address */ +#define MiPteToAddress(x) ((PVOID)((ULONG)(x) << 10)) +#define MiPdeToAddress(x) ((PVOID)((ULONG)(x) << 18)) -#define MiGetPdeOffset(x) (((ULONG)(x)) >> 22) +#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \ + ((x) / (4*1024*1024)) -// -// FIXME: THESE ARE WRONG ATM. -// -#define MiAddressToPde(x) \ -((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PDE_BASE)) -#define MiAddressToPte(x) \ -((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE)) -#define MiAddressToPteOffset(x) \ -((((ULONG)(x)) << 10) >> 22) - - -// -// Convert a PTE into a corresponding address -// -#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10)) - -#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) -#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) -#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) - -// -// FIXFIX: This is all wrong now!!! -// -typedef union _ARM_PTE -{ - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Ignored:2; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored1:1; - ULONG BaseAddress:22; - } Coarse; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored:1; - ULONG Access:2; - ULONG Ignored1:8; - ULONG BaseAddress:12; - } Section; - struct - { - ULONG Type:2; - ULONG Reserved:3; - ULONG Domain:4; - ULONG Ignored:3; - ULONG BaseAddress:20; - } Fine; - } L1; - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG Ignored:4; - ULONG BaseAddress:16; - } Large; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG BaseAddress:20; - } Small; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Ignored:4; - ULONG BaseAddress:22; - } Tiny; - } L2; - ULONG AsUlong; -} ARM_PTE, *PARM_PTE; - -typedef struct _ARM_TRANSLATION_TABLE -{ - ARM_PTE Pte[4096]; -} ARM_TRANSLATION_TABLE, *PARM_TRANSLATION_TABLE; - -typedef struct _ARM_COARSE_PAGE_TABLE -{ - ARM_PTE Pte[256]; - ULONG Padding[768]; -} ARM_COARSE_PAGE_TABLE, *PARM_COARSE_PAGE_TABLE; - -typedef enum _ARM_L1_PTE_TYPE -{ - FaultPte, - CoarsePte, - SectionPte, - FinePte -} ARM_L1_PTE_TYPE; - -typedef enum _ARM_L2_PTE_TYPE -{ - LargePte = 1, - SmallPte, - TinyPte -} ARM_L2_PTE_TYPE; - -typedef enum _ARM_PTE_ACCESS -{ - FaultAccess, - SupervisorAccess, - SharedAccess, - UserAccess -} ARM_PTE_ACCESS; - -#endif +#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \ + ((((x)) % (4*1024*1024)) / (4*1024)) + +#define MM_CACHE_LINE_SIZE 64 #endif diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index b818d5fc303..143a43e7cd1 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -59,4 +59,32 @@ PULONG MmGetPageDirectory(VOID); #define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.Writable = 1) #endif +#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \ + ((x) / (4*1024*1024)) + +#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \ + ((((x)) % (4*1024*1024)) / (4*1024)) + +#define NR_SECTION_PAGE_TABLES 1024 +#define NR_SECTION_PAGE_ENTRIES 1024 + +#define TEB_BASE 0x7FFDE000 + +#define MI_HYPERSPACE_PTES (256 - 1) +#define MI_ZERO_PTES (32) +#define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE +#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ + MI_HYPERSPACE_PTES * PAGE_SIZE) +#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ + PAGE_SIZE) + +/* On x86, these two are the same */ +#define MMPDE MMPTE +#define PMMPDE PMMPTE + +/* +* FIXME - different architectures have different cache line sizes... +*/ +#define MM_CACHE_LINE_SIZE 32 + #endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */ diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 79adab4672b..61e4d658b3f 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -108,28 +108,10 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE; /* Number of list heads to use */ #define MI_FREE_POOL_LISTS 4 -#define MI_HYPERSPACE_PTES (256 - 1) -#define MI_ZERO_PTES (32) -#define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE -#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ - MI_HYPERSPACE_PTES * PAGE_SIZE) -#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ - PAGE_SIZE) /* Signature of free pool blocks */ #define MM_FREE_POOL_TAG 'lprF' -#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \ - ((x) / (4*1024*1024)) - -#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \ - ((((x)) % (4*1024*1024)) / (4*1024)) - -#define NR_SECTION_PAGE_TABLES 1024 -#define NR_SECTION_PAGE_ENTRIES 1024 - -#define TEB_BASE 0x7FFDE000 - /* Although Microsoft says this isn't hardcoded anymore, they won't be able to change it. Stuff depends on it */ #define MM_VIRTMEM_GRANULARITY (64 * 1024) @@ -169,17 +151,6 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE; */ #define MM_POOL_ALIGNMENT 8 -/* - * Maximum size of the kmalloc area (this is totally arbitary) - */ -#define MM_KERNEL_MAP_SIZE (16*1024*1024) -#define MM_KERNEL_MAP_BASE (0xf0c00000) - -/* - * FIXME - different architectures have different cache line sizes... - */ -#define MM_CACHE_LINE_SIZE 32 - #define MM_ROUND_UP(x,s) \ ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1))) diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 0076759380f..f1953bafffe 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -579,7 +579,8 @@ MmProbeAndLockPages(IN PMDL Mdl, PETHREAD Thread; PMMSUPPORT AddressSpace; NTSTATUS ProbeStatus; - PMMPTE PointerPte, PointerPde, LastPte; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde; PFN_NUMBER PageFrameIndex; PMMPFN Pfn1; BOOLEAN UsePfnLock; diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 278b74af026..f4d9cd7ed92 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -24,7 +24,7 @@ NTSTATUS FASTCALL MiCheckPdeForPagedPool(IN PVOID Address) { - PMMPTE PointerPde; + PMMPDE PointerPde; NTSTATUS Status = STATUS_SUCCESS; // @@ -37,7 +37,7 @@ MiCheckPdeForPagedPool(IN PVOID Address) // Send a hint to the page fault handler that this is only a valid fault // if we already detected this was access within the page table range // - PointerPde = MiAddressToPte(Address); + PointerPde = (PMMPDE)MiAddressToPte(Address); Status = STATUS_WAIT_1; } else if (Address < MmSystemRangeStart) @@ -200,7 +200,8 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, IN PVOID TrapInformation) { KIRQL OldIrql = KeGetCurrentIrql(), LockIrql; - PMMPTE PointerPde, PointerPte; + PMMPTE PointerPte; + PMMPDE PointerPde; MMPTE TempPte; PETHREAD CurrentThread; NTSTATUS Status; From 3a6220a5f060ad14612a090d17b9521e212b9826 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 9 Feb 2010 22:57:14 +0000 Subject: [PATCH 60/97] [NDK]: Add MMPDE structure for ARM. svn path=/trunk/; revision=45543 --- reactos/include/ndk/arm/mmtypes.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/reactos/include/ndk/arm/mmtypes.h b/reactos/include/ndk/arm/mmtypes.h index 45c5de17e26..febadda1cd5 100644 --- a/reactos/include/ndk/arm/mmtypes.h +++ b/reactos/include/ndk/arm/mmtypes.h @@ -170,6 +170,31 @@ typedef union _MMPTE_HARDWARE ULONG AsUlong; } MMPTE_HARDWARE, *PMMPTE_HARDWARE; +typedef union _MMPDE_HARDWARE +{ + struct + { + ULONG Valid:1; + ULONG LargePage:1; + ULONG Buffered:1; + ULONG Cached:1; + ULONG NoExecute:1; + ULONG Domain:4; + ULONG Ecc:1; + ULONG PageFrameNumber:22; + }; + ULONG AsUlong; +} MMPDE_HARDWARE, *PMMPDE_HARDWARE; + +typedef struct _MMPDE +{ + union + { + MMPDE_HARDWARE Hard; + ULONG Long; + } u; +} MMPDE, *PMMPDE; + // // Use the right PTE structure // From f11ee9cfaf179211f6104912b3892fcef6a603f9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 10 Feb 2010 00:55:58 +0000 Subject: [PATCH 61/97] - Merge r45531 and r45545 from aicom-network-branch svn path=/trunk/; revision=45546 --- reactos/lib/drivers/ip/transport/tcp/event.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 9badd7bcd97..4534da39c05 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -107,11 +107,11 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { /* Memory management routines * - * By far the most requests for memory are either for 128 or 2048 byte blocks, + * By far the most requests for memory are either for 128 or 2049 byte blocks, * so we want to satisfy those from lookaside lists. Unfortunately, the * TCPFree() function doesn't pass the size of the block to be freed, so we * need to keep track of it ourselves. We do it by prepending each block with - * 4 bytes, indicating if this is a 'L'arge (2048), 'S'mall (128) or 'O'ther + * 4 bytes, indicating if this is a 'L'arge (2049), 'S'mall (128) or 'O'ther * block. */ @@ -119,7 +119,7 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { #define MEM_PROFILE 0 #define SMALL_SIZE 128 -#define LARGE_SIZE 2048 +#define LARGE_SIZE 2049 #define SIGNATURE_LARGE 'LLLL' #define SIGNATURE_SMALL 'SSSS' From 3caee550bcd88d8e2ee6bd15849af60787cf9f10 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Feb 2010 02:00:56 +0000 Subject: [PATCH 62/97] [NTOS]: Combine ARM3 phase 0 and 1 even it means calling back into TurdMM for one function call. [NTOS]: Separate out platform-specific parts of ARM3 initialization instead of having everything in an arch-specific file. No functional code changes. svn path=/trunk/; revision=45547 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 1973 +++++++--------------- reactos/ntoskrnl/mm/ARM3/miarm.h | 41 + reactos/ntoskrnl/mm/ARM3/mminit.c | 840 +++++++++ reactos/ntoskrnl/mm/mminit.c | 8 - reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 5 files changed, 1458 insertions(+), 1405 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/mminit.c diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index b446b09c649..7c9ca592cf1 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -12,185 +12,12 @@ #define NDEBUG #include -#line 15 "ARM³::INIT" +#line 15 "ARM³::INIT:X86" #define MODULE_INVOLVED_IN_ARM3 #include "../../ARM3/miarm.h" /* GLOBALS ********************************************************************/ -// -// These are all registry-configurable, but by default, the memory manager will -// figure out the most appropriate values. -// -ULONG MmMaximumNonPagedPoolPercent; -ULONG MmSizeOfNonPagedPoolInBytes; -ULONG MmMaximumNonPagedPoolInBytes; - -// -// These numbers describe the discrete equation components of the nonpaged -// pool sizing algorithm. -// -// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja -// along with the algorithm that uses them, which is implemented later below. -// -ULONG MmMinimumNonPagedPoolSize = 256 * 1024; -ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024; -ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; -ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; - -// -// The memory layout (and especially variable names) of the NT kernel mode -// components can be a bit hard to twig, especially when it comes to the non -// paged area. -// -// There are really two components to the non-paged pool: -// -// - The initial nonpaged pool, sized dynamically up to a maximum. -// - The expansion nonpaged pool, sized dynamically up to a maximum. -// -// The initial nonpaged pool is physically continuous for performance, and -// immediately follows the PFN database, typically sharing the same PDE. It is -// a very small resource (32MB on a 1GB system), and capped at 128MB. -// -// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after -// the PFN database (which starts at 0xB0000000). -// -// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB -// for a 1GB system). On ARM³ however, it is currently capped at 128MB. -// -// The address where the initial nonpaged pool starts is aptly named -// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes -// bytes. -// -// Expansion nonpaged pool starts at an address described by the variable called -// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes -// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd -// (because of the way it's calculated) at 0xFFBE0000. -// -// Initial nonpaged pool is allocated and mapped early-on during boot, but what -// about the expansion nonpaged pool? It is instead composed of special pages -// which belong to what are called System PTEs. These PTEs are the matter of a -// later discussion, but they are also considered part of the "nonpaged" OS, due -// to the fact that they are never paged out -- once an address is described by -// a System PTE, it is always valid, until the System PTE is torn down. -// -// System PTEs are actually composed of two "spaces", the system space proper, -// and the nonpaged pool expansion space. The latter, as we've already seen, -// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs -// that the system will support, the remaining address space below this address -// is used to hold the system space PTEs. This address, in turn, is held in the -// variable named MmNonPagedSystemStart, which itself is never allowed to go -// below 0xEB000000 (thus creating an upper bound on the number of System PTEs). -// -// This means that 330MB are reserved for total nonpaged system VA, on top of -// whatever the initial nonpaged pool allocation is. -// -// The following URLs, valid as of April 23rd, 2008, support this evidence: -// -// http://www.cs.miami.edu/~burt/journal/NT/memory.html -// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ -// -PVOID MmNonPagedSystemStart; -PVOID MmNonPagedPoolStart; -PVOID MmNonPagedPoolExpansionStart; -PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; - -// -// This is where paged pool starts by default -// -PVOID MmPagedPoolStart = MI_PAGED_POOL_START; -PVOID MmPagedPoolEnd; - -// -// And this is its default size -// -ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE; -PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE; - -// -// Session space starts at 0xBFFFFFFF and grows downwards -// By default, it includes an 8MB image area where we map win32k and video card -// drivers, followed by a 4MB area containing the session's working set. This is -// then followed by a 20MB mapped view area and finally by the session's paged -// pool, by default 16MB. -// -// On a normal system, this results in session space occupying the region from -// 0xBD000000 to 0xC0000000 -// -// See miarm.h for the defines that determine the sizing of this region. On an -// NT system, some of these can be configured through the registry, but we don't -// support that yet. -// -PVOID MiSessionSpaceEnd; // 0xC0000000 -PVOID MiSessionImageEnd; // 0xC0000000 -PVOID MiSessionImageStart; // 0xBF800000 -PVOID MiSessionViewStart; // 0xBE000000 -PVOID MiSessionPoolEnd; // 0xBE000000 -PVOID MiSessionPoolStart; // 0xBD000000 -PVOID MmSessionBase; // 0xBD000000 -ULONG MmSessionSize; -ULONG MmSessionViewSize; -ULONG MmSessionPoolSize; -ULONG MmSessionImageSize; - -// -// The system view space, on the other hand, is where sections that are memory -// mapped into "system space" end up. -// -// By default, it is a 16MB region. -// -PVOID MiSystemViewStart; -ULONG MmSystemViewSize; - -// -// A copy of the system page directory (the page directory associated with the -// System process) is kept (double-mapped) by the manager in order to lazily -// map paged pool PDEs into external processes when they fault on a paged pool -// address. -// -PFN_NUMBER MmSystemPageDirectory; -PMMPTE MmSystemPagePtes; - -// -// The system cache starts right after hyperspace. The first few pages are for -// keeping track of the system working set list. -// -// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000 -// -PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START; - -// -// Windows NT seems to choose between 7000, 11000 and 50000 -// On systems with more than 32MB, this number is then doubled, and further -// aligned up to a PDE boundary (4MB). -// -ULONG MmNumberOfSystemPtes; - -// -// This is how many pages the PFN database will take up -// In Windows, this includes the Quark Color Table, but not in ARM³ -// -ULONG MxPfnAllocation; - -// -// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track -// of pages that are not actually valid physical memory, such as ACPI reserved -// regions, BIOS address ranges, or holes in physical memory address space which -// could indicate device-mapped I/O memory. -// -// In fact, the lack of a PFN entry for a page usually indicates that this is -// I/O space instead. -// -// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning -// a bit to each. If the bit is set, then the page is valid physical RAM. -// -RTL_BITMAP MiPfnBitMap; - -// -// This structure describes the different pieces of RAM-backed address space -// -PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; - // // Before we have a PFN database, memory comes straight from our physical memory // blocks, which is nice because it's guaranteed contiguous and also because once @@ -202,76 +29,8 @@ PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; -// -// This is where we keep track of the most basic physical layout markers -// -ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1; - -// -// The total number of pages mapped by the boot loader, which include the kernel -// HAL, boot drivers, registry, NLS files and other loader data structures is -// kept track of here. This depends on "LoaderPagesSpanned" being correct when -// coming from the loader. -// -// This number is later aligned up to a PDE boundary. -// -ULONG MmBootImageSize; - -// -// These three variables keep track of the core separation of address space that -// exists between kernel mode and user mode. -// -ULONG MmUserProbeAddress; -PVOID MmHighestUserAddress; -PVOID MmSystemRangeStart; - - - -PVOID MmSystemCacheStart; -PVOID MmSystemCacheEnd; -MMSUPPORT MmSystemCacheWs; - -// -// This is where hyperspace ends (followed by the system cache working set) -// -PVOID MmHyperSpaceEnd; - -// -// Page coloring algorithm data -// -ULONG MmSecondaryColors; -ULONG MmSecondaryColorMask; - -// -// Actual (registry-configurable) size of a GUI thread's stack -// -ULONG MmLargeStackSize; - /* PRIVATE FUNCTIONS **********************************************************/ -// -// In Bavaria, this is probably a hate crime -// -VOID -FASTCALL -MiSyncARM3WithROS(IN PVOID AddressStart, - IN PVOID AddressEnd) -{ - // - // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder - // - ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); - while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) - { - // - // This both odious and heinous - // - extern ULONG MmGlobalKernelPageDirectory[1024]; - MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde]; - Pde++; - } -} - PFN_NUMBER NTAPI MxGetNextPage(IN PFN_NUMBER PageCount) @@ -302,372 +61,9 @@ MxGetNextPage(IN PFN_NUMBER PageCount) return Pfn; } -PFN_NUMBER -NTAPI -MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PBOOLEAN IncludeType) -{ - PLIST_ENTRY NextEntry; - PFN_NUMBER PageCount = 0; - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; - - // - // Now loop through the descriptors - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // Grab each one, and check if it's one we should include - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType < LoaderMaximum) && - (IncludeType[MdBlock->MemoryType])) - { - // - // Add this to our running total - // - PageCount += MdBlock->PageCount; - } - - // - // Try the next descriptor - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // Return the total - // - return PageCount; -} - -PPHYSICAL_MEMORY_DESCRIPTOR -NTAPI -MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PBOOLEAN IncludeType) -{ - PLIST_ENTRY NextEntry; - ULONG Run = 0, InitialRuns = 0; - PFN_NUMBER NextPage = -1, PageCount = 0; - PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer; - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; - - // - // Scan the memory descriptors - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // For each one, increase the memory allocation estimate - // - InitialRuns++; - NextEntry = NextEntry->Flink; - } - - // - // Allocate the maximum we'll ever need - // - Buffer = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + - sizeof(PHYSICAL_MEMORY_RUN) * - (InitialRuns - 1), - 'lMmM'); - if (!Buffer) return NULL; - - // - // For now that's how many runs we have - // - Buffer->NumberOfRuns = InitialRuns; - - // - // Now loop through the descriptors again - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // Grab each one, and check if it's one we should include - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType < LoaderMaximum) && - (IncludeType[MdBlock->MemoryType])) - { - // - // Add this to our running total - // - PageCount += MdBlock->PageCount; - - // - // Check if the next page is described by the next descriptor - // - if (MdBlock->BasePage == NextPage) - { - // - // Combine it into the same physical run - // - ASSERT(MdBlock->PageCount != 0); - Buffer->Run[Run - 1].PageCount += MdBlock->PageCount; - NextPage += MdBlock->PageCount; - } - else - { - // - // Otherwise just duplicate the descriptor's contents - // - Buffer->Run[Run].BasePage = MdBlock->BasePage; - Buffer->Run[Run].PageCount = MdBlock->PageCount; - NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount; - - // - // And in this case, increase the number of runs - // - Run++; - } - } - - // - // Try the next descriptor - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // We should not have been able to go past our initial estimate - // - ASSERT(Run <= Buffer->NumberOfRuns); - - // - // Our guess was probably exaggerated... - // - if (InitialRuns > Run) - { - // - // Allocate a more accurately sized buffer - // - NewBuffer = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + - sizeof(PHYSICAL_MEMORY_RUN) * - (Run - 1), - 'lMmM'); - if (NewBuffer) - { - // - // Copy the old buffer into the new, then free it - // - RtlCopyMemory(NewBuffer->Run, - Buffer->Run, - sizeof(PHYSICAL_MEMORY_RUN) * Run); - ExFreePool(Buffer); - - // - // Now use the new buffer - // - Buffer = NewBuffer; - } - } - - // - // Write the final numbers, and return it - // - Buffer->NumberOfRuns = Run; - Buffer->NumberOfPages = PageCount; - return Buffer; -} - -VOID -NTAPI -MiBuildPagedPool(VOID) -{ - PMMPTE PointerPte, PointerPde; - MMPTE TempPte = HyperTemplatePte; - PFN_NUMBER PageFrameIndex; - KIRQL OldIrql; - ULONG Size, BitMapSize; - - // - // Get the page frame number for the system page directory - // - PointerPte = MiAddressToPte(PDE_BASE); - MmSystemPageDirectory = PFN_FROM_PTE(PointerPte); - - // - // Allocate a system PTE which will hold a copy of the page directory - // - PointerPte = MiReserveSystemPtes(1, SystemPteSpace); - ASSERT(PointerPte); - MmSystemPagePtes = MiPteToAddress(PointerPte); - - // - // Make this system PTE point to the system page directory. - // It is now essentially double-mapped. This will be used later for lazy - // evaluation of PDEs accross process switches, similarly to how the Global - // page directory array in the old ReactOS Mm is used (but in a less hacky - // way). - // - TempPte = HyperTemplatePte; - TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - // - // Let's get back to paged pool work: size it up. - // By default, it should be twice as big as nonpaged pool. - // - MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes; - if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart - - (ULONG_PTR)MmPagedPoolStart)) - { - // - // On the other hand, we have limited VA space, so make sure that the VA - // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set - // whatever maximum is possible. - // - MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart - - (ULONG_PTR)MmPagedPoolStart; - } - - // - // Get the size in pages and make sure paged pool is at least 32MB. - // - Size = MmSizeOfPagedPoolInBytes; - if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE; - Size = BYTES_TO_PAGES(Size); - - // - // Now check how many PTEs will be required for these many pages. - // - Size = (Size + (1024 - 1)) / 1024; - - // - // Recompute the page-aligned size of the paged pool, in bytes and pages. - // - MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024; - MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT; - - // - // Let's be really sure this doesn't overflow into nonpaged system VA - // - ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <= - (ULONG_PTR)MmNonPagedSystemStart); - - // - // This is where paged pool ends - // - MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart + - MmSizeOfPagedPoolInBytes) - 1); - - // - // So now get the PDE for paged pool and zero it out - // - PointerPde = MiAddressToPde(MmPagedPoolStart); - RtlZeroMemory(PointerPde, - (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE)); - - // - // Next, get the first and last PTE - // - PointerPte = MiAddressToPte(MmPagedPoolStart); - MmPagedPoolInfo.FirstPteForPagedPool = PointerPte; - MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd); - - // - // Lock the PFN database - // - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - // - // Allocate a page and map the first paged pool PDE - // - PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); - TempPte.u.Hard.PageFrameNumber = PageFrameIndex; - ASSERT(PointerPde->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPde = TempPte; - - // - // Release the PFN database lock - // - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - - // - // We only have one PDE mapped for now... at fault time, additional PDEs - // will be allocated to handle paged pool growth. This is where they'll have - // to start. - // - MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1; - - // - // We keep track of each page via a bit, so check how big the bitmap will - // have to be (make sure to align our page count such that it fits nicely - // into a 4-byte aligned bitmap. - // - // We'll also allocate the bitmap header itself part of the same buffer. - // - Size = Size * 1024; - ASSERT(Size == MmSizeOfPagedPoolInPages); - BitMapSize = Size; - Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG)); - - // - // Allocate the allocation bitmap, which tells us which regions have not yet - // been mapped into memory - // - MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool, - Size, - ' mM'); - ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap); - - // - // Initialize it such that at first, only the first page's worth of PTEs is - // marked as allocated (incidentially, the first PDE we allocated earlier). - // - RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap, - (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1), - BitMapSize); - RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap); - RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024); - - // - // We have a second bitmap, which keeps track of where allocations end. - // Given the allocation bitmap and a base address, we can therefore figure - // out which page is the last page of that allocation, and thus how big the - // entire allocation is. - // - MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool, - Size, - ' mM'); - ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap); - RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap, - (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1), - BitMapSize); - - // - // Since no allocations have been made yet, there are no bits set as the end - // - RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap); - - // - // Initialize paged pool. - // - InitializePool(PagedPool, 0); - - // - // Initialize the paged pool mutex - // - KeInitializeGuardedMutex(&MmPagedPoolMutex); -} - NTSTATUS NTAPI -MmArmInitSystem(IN ULONG Phase, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) +MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PLIST_ENTRY NextEntry; PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; @@ -676,876 +72,659 @@ MmArmInitSystem(IN ULONG Phase, PMMPTE StartPde, EndPde, PointerPte, LastPte; MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte; PVOID NonPagedPoolExpansionVa; - ULONG OldCount, i, L2Associativity; - BOOLEAN IncludeType[LoaderMaximum]; - PVOID Bitmap; - PPHYSICAL_MEMORY_RUN Run; + ULONG OldCount, L2Associativity; PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; + + // + // The large kernel stack is cutomizable, but use default value for now + // + MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; + + // + // Set CR3 for the system process + // + PointerPte = MiAddressToPde(PTE_BASE); + PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT; + PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex; // - // Instantiate memory that we don't consider RAM/usable - // We use the same exclusions that Windows does, in order to try to be - // compatible with WinLDR-style booting + // Blow away user-mode // - for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE; - IncludeType[LoaderBad] = FALSE; - IncludeType[LoaderFirmwarePermanent] = FALSE; - IncludeType[LoaderSpecialMemory] = FALSE; - IncludeType[LoaderBBTMemory] = FALSE; - if (Phase == 0) + StartPde = MiAddressToPde(0); + EndPde = MiAddressToPde(KSEG0_BASE); + RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE)); + + // + // Loop the memory descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) { // - // Define the basic user vs. kernel address space separation + // Get the memory block // - MmSystemRangeStart = (PVOID)KSEG0_BASE; - MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000; - MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1); + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); // - // Get the size of the boot loader's image allocations and then round - // that region up to a PDE size, so that any PDEs we might create for - // whatever follows are separate from the PDEs that boot loader might've - // already created (and later, we can blow all that away if we want to). + // Skip invisible memory // - MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned; - MmBootImageSize *= PAGE_SIZE; - MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1); - ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0); - - // - // Set the size of session view, pool, and image - // - MmSessionSize = MI_SESSION_SIZE; - MmSessionViewSize = MI_SESSION_VIEW_SIZE; - MmSessionPoolSize = MI_SESSION_POOL_SIZE; - MmSessionImageSize = MI_SESSION_IMAGE_SIZE; - - // - // Set the size of system view - // - MmSystemViewSize = MI_SYSTEM_VIEW_SIZE; - - // - // This is where it all ends - // - MiSessionImageEnd = (PVOID)PTE_BASE; - - // - // This is where we will load Win32k.sys and the video driver - // - MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - - MmSessionImageSize); - - // - // So the view starts right below the session working set (itself below - // the image area) - // - MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - - MmSessionImageSize - - MI_SESSION_WORKING_SET_SIZE - - MmSessionViewSize); - - // - // Session pool follows - // - MiSessionPoolEnd = MiSessionViewStart; - MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd - - MmSessionPoolSize); - - // - // And it all begins here - // - MmSessionBase = MiSessionPoolStart; - - // - // Sanity check that our math is correct - // - ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE); - - // - // Session space ends wherever image session space ends - // - MiSessionSpaceEnd = MiSessionImageEnd; - - // - // System view space ends at session space, so now that we know where - // this is, we can compute the base address of system view space itself. - // - MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase - - MmSystemViewSize); - - // - // Count physical pages on the system - // - PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType); - - // - // Check if this is a machine with less than 19MB of RAM - // - if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING) + if ((MdBlock->MemoryType != LoaderFirmwarePermanent) && + (MdBlock->MemoryType != LoaderSpecialMemory) && + (MdBlock->MemoryType != LoaderHALCachedMemory) && + (MdBlock->MemoryType != LoaderBBTMemory)) { // - // Use the very minimum of system PTEs + // Check if BURNMEM was used // - MmNumberOfSystemPtes = 7000; - } - else - { - // - // Use the default, but check if we have more than 32MB of RAM - // - MmNumberOfSystemPtes = 11000; - if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST) + if (MdBlock->MemoryType != LoaderBad) { // - // Double the amount of system PTEs + // Count this in the total of pages // - MmNumberOfSystemPtes <<= 1; + MmNumberOfPhysicalPages += MdBlock->PageCount; } - } - - DPRINT("System PTE count has been tuned to %d (%d bytes)\n", - MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); - - // - // - // Start of Architecture Specific Initialization Code - // - // - - // - // The large kernel stack is cutomizable, but use default value for now - // - MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; - - // - // Setup template - // - HyperTemplatePte.u.Long = 0; - HyperTemplatePte.u.Hard.Valid = 1; - HyperTemplatePte.u.Hard.Write = 1; - HyperTemplatePte.u.Hard.Dirty = 1; - HyperTemplatePte.u.Hard.Accessed = 1; - if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Hard.Global = 1; - - // - // Set CR3 for the system process - // - PointerPte = MiAddressToPde(PTE_BASE); - PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT; - PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex; - - // - // Blow away user-mode - // - StartPde = MiAddressToPde(0); - EndPde = MiAddressToPde(KSEG0_BASE); - RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE)); - - // - // Loop the memory descriptors - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // Get the memory block - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); // - // Skip invisible memory + // Check if this is the new lowest page // - if ((MdBlock->MemoryType != LoaderFirmwarePermanent) && - (MdBlock->MemoryType != LoaderSpecialMemory) && - (MdBlock->MemoryType != LoaderHALCachedMemory) && - (MdBlock->MemoryType != LoaderBBTMemory)) + if (MdBlock->BasePage < MmLowestPhysicalPage) { // - // Check if BURNMEM was used + // Update the lowest page // - if (MdBlock->MemoryType != LoaderBad) + MmLowestPhysicalPage = MdBlock->BasePage; + } + + // + // Check if this is the new highest page + // + PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount; + if (PageFrameIndex > MmHighestPhysicalPage) + { + // + // Update the highest page + // + MmHighestPhysicalPage = PageFrameIndex - 1; + } + + // + // Check if this is free memory + // + if ((MdBlock->MemoryType == LoaderFree) || + (MdBlock->MemoryType == LoaderLoadedProgram) || + (MdBlock->MemoryType == LoaderFirmwareTemporary) || + (MdBlock->MemoryType == LoaderOsloaderStack)) + { + // + // Check if this is the largest memory descriptor + // + if (MdBlock->PageCount > FreePages) { // - // Count this in the total of pages + // For now, it is // - MmNumberOfPhysicalPages += MdBlock->PageCount; + MxFreeDescriptor = MdBlock; } // - // Check if this is the new lowest page + // More free pages // - if (MdBlock->BasePage < MmLowestPhysicalPage) - { - // - // Update the lowest page - // - MmLowestPhysicalPage = MdBlock->BasePage; - } - - // - // Check if this is the new highest page - // - PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount; - if (PageFrameIndex > MmHighestPhysicalPage) - { - // - // Update the highest page - // - MmHighestPhysicalPage = PageFrameIndex - 1; - } - - // - // Check if this is free memory - // - if ((MdBlock->MemoryType == LoaderFree) || - (MdBlock->MemoryType == LoaderLoadedProgram) || - (MdBlock->MemoryType == LoaderFirmwareTemporary) || - (MdBlock->MemoryType == LoaderOsloaderStack)) - { - // - // Check if this is the largest memory descriptor - // - if (MdBlock->PageCount > FreePages) - { - // - // For now, it is - // - MxFreeDescriptor = MdBlock; - } - - // - // More free pages - // - FreePages += MdBlock->PageCount; - } + FreePages += MdBlock->PageCount; } - - // - // Keep going - // - NextEntry = MdBlock->ListEntry.Flink; } // - // Save original values of the free descriptor, since it'll be - // altered by early allocations + // Keep going // - MxOldFreeDescriptor = *MxFreeDescriptor; - - // - // Check if this is a machine with less than 256MB of RAM, and no overide - // - if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && - !(MmSizeOfNonPagedPoolInBytes)) - { - // - // Force the non paged pool to be 2MB so we can reduce RAM usage - // - MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024; - } - - // - // Hyperspace ends here - // - MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1); - - // - // Check if the user gave a ridicuously large nonpaged pool RAM size - // - if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > - (MmNumberOfPhysicalPages * 7 / 8)) - { - // - // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! - // - MmSizeOfNonPagedPoolInBytes = 0; - } - - // - // Check if no registry setting was set, or if the setting was too low - // - if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) - { - // - // Start with the minimum (256 KB) and add 32 KB for each MB above 4 - // - MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; - MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / - 256 * MmMinAdditionNonPagedPoolPerMb; - } - - // - // Check if the registy setting or our dynamic calculation was too high - // - if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) - { - // - // Set it to the maximum - // - MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; - } - - // - // Check if a percentage cap was set through the registry - // - if (MmMaximumNonPagedPoolPercent) - { - // - // Don't feel like supporting this right now - // - UNIMPLEMENTED; - } - - // - // Page-align the nonpaged pool size - // - MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); - - // - // Now, check if there was a registry size for the maximum size - // - if (!MmMaximumNonPagedPoolInBytes) - { - // - // Start with the default (1MB) - // - MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; - - // - // Add space for PFN database - // - MmMaximumNonPagedPoolInBytes += (ULONG) - PAGE_ALIGN((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); - - // - // Add 400KB for each MB above 4 - // - MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * - MmMaxAdditionNonPagedPoolPerMb; - } - - // - // Make sure there's at least 16 pages + the PFN available for expansion - // - PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) + - ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * - sizeof(MMPFN)); - if (MmMaximumNonPagedPoolInBytes < PoolPages) - { - // - // Set it to the minimum value for the maximum (yuck!) - // - MmMaximumNonPagedPoolInBytes = PoolPages; - } - - // - // Systems with 2GB of kernel address space get double the size - // - PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2; - - // - // Don't let the maximum go too high - // - if (MmMaximumNonPagedPoolInBytes > PoolPages) - { - // - // Set it to the upper limit - // - MmMaximumNonPagedPoolInBytes = PoolPages; - } - - // - // Check if this is a system with > 128MB of non paged pool - // - if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) - { - // - // FIXME: Unsure about additional checks needed - // - DPRINT1("Untested path\n"); - } - - // - // Get L2 cache information - // - L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; - MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; - if (L2Associativity) MmSecondaryColors /= L2Associativity; - - // - // Compute final color mask and count - // - MmSecondaryColors >>= PAGE_SHIFT; - if (!MmSecondaryColors) MmSecondaryColors = 1; - MmSecondaryColorMask = MmSecondaryColors - 1; - - // - // Store it - // - KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; - - // - // Calculate the number of bytes for the PFN database - // and then convert to pages - // - MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); - MxPfnAllocation >>= PAGE_SHIFT; - - // - // We have to add one to the count here, because in the process of - // shifting down to the page size, we actually ended up getting the - // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages). - // Later on, we'll shift this number back into bytes, which would cause - // us to end up with only 0x5F000 bytes -- when we actually want to have - // 0x60000 bytes. - // - MxPfnAllocation++; - - // - // Now calculate the nonpaged pool expansion VA region - // - MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - - MmMaximumNonPagedPoolInBytes + - MmSizeOfNonPagedPoolInBytes); - MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart); - NonPagedPoolExpansionVa = MmNonPagedPoolStart; - DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n", - MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes); - - // - // Now calculate the nonpaged system VA region, which includes the - // nonpaged pool expansion (above) and the system PTEs. Note that it is - // then aligned to a PDE boundary (4MB). - // - MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - - (MmNumberOfSystemPtes + 1) * PAGE_SIZE); - MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & - ~((4 * 1024 * 1024) - 1)); - - // - // Don't let it go below the minimum - // - if (MmNonPagedSystemStart < (PVOID)0xEB000000) - { - // - // This is a hard-coded limit in the Windows NT address space - // - MmNonPagedSystemStart = (PVOID)0xEB000000; - - // - // Reduce the amount of system PTEs to reach this point - // - MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart - - (ULONG_PTR)MmNonPagedSystemStart) >> - PAGE_SHIFT; - MmNumberOfSystemPtes--; - ASSERT(MmNumberOfSystemPtes > 1000); - } - - // - // Check if we are in a situation where the size of the paged pool - // is so large that it overflows into nonpaged pool - // - if (MmSizeOfPagedPoolInBytes > - ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart)) - { - // - // We need some recalculations here - // - DPRINT1("Paged pool is too big!\n"); - } - - // - // Normally, the PFN database should start after the loader images. - // This is already the case in ReactOS, but for now we want to co-exist - // with the old memory manager, so we'll create a "Shadow PFN Database" - // instead, and arbitrarly start it at 0xB0000000. - // - MmPfnDatabase = (PVOID)0xB0000000; - ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0); - - // - // Non paged pool comes after the PFN database - // - MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase + - (MxPfnAllocation << PAGE_SHIFT)); - - // - // Now we actually need to get these many physical pages. Nonpaged pool - // is actually also physically contiguous (but not the expansion) - // - PageFrameIndex = MxGetNextPage(MxPfnAllocation + - (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT)); - ASSERT(PageFrameIndex != 0); - DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex); - DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation); - - // - // Now we need some pages to create the page tables for the NP system VA - // which includes system PTEs and expansion NP - // - StartPde = MiAddressToPde(MmNonPagedSystemStart); - EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - while (StartPde <= EndPde) - { - // - // Sanity check - // - ASSERT(StartPde->u.Hard.Valid == 0); - - // - // Get a page - // - TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; - - // - // Zero out the page table - // - PointerPte = MiPteToAddress(StartPde); - RtlZeroMemory(PointerPte, PAGE_SIZE); - - // - // Next - // - StartPde++; - } - - // - // Now we need pages for the page tables which will map initial NP - // - StartPde = MiAddressToPde(MmPfnDatabase); - EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + - MmSizeOfNonPagedPoolInBytes - 1)); - while (StartPde <= EndPde) - { - // - // Sanity check - // - ASSERT(StartPde->u.Hard.Valid == 0); - - // - // Get a page - // - TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; - - // - // Zero out the page table - // - PointerPte = MiPteToAddress(StartPde); - RtlZeroMemory(PointerPte, PAGE_SIZE); - - // - // Next - // - StartPde++; - } - - // - // Now remember where the expansion starts - // - MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa; - - // - // Last step is to actually map the nonpaged pool - // - PointerPte = MiAddressToPte(MmNonPagedPoolStart); - LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart + - MmSizeOfNonPagedPoolInBytes - 1)); - while (PointerPte <= LastPte) - { - // - // Use one of our contigous pages - // - TempPte.u.Hard.PageFrameNumber = PageFrameIndex++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte++ = TempPte; - } - - // - // Sanity check: make sure we have properly defined the system PTE space - // - ASSERT(MiAddressToPte(MmNonPagedSystemStart) < - MiAddressToPte(MmNonPagedPoolExpansionStart)); - - // - // Now go ahead and initialize the ARM³ nonpaged pool - // - MiInitializeArmPool(); - - // - // Get current page data, since we won't be using MxGetNextPage as it - // would corrupt our state - // - FreePage = MxFreeDescriptor->BasePage; - FreePageCount = MxFreeDescriptor->PageCount; - PagesLeft = 0; - - // - // Loop the memory descriptors - // - NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead) - { - // - // Get the descriptor - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || - (MdBlock->MemoryType == LoaderBBTMemory) || - (MdBlock->MemoryType == LoaderSpecialMemory)) - { - // - // These pages are not part of the PFN database - // - NextEntry = MdBlock->ListEntry.Flink; - continue; - } - - // - // Next, check if this is our special free descriptor we've found - // - if (MdBlock == MxFreeDescriptor) - { - // - // Use the real numbers instead - // - BasePage = MxOldFreeDescriptor.BasePage; - PageCount = MxOldFreeDescriptor.PageCount; - } - else - { - // - // Use the descriptor's numbers - // - BasePage = MdBlock->BasePage; - PageCount = MdBlock->PageCount; - } - - // - // Get the PTEs for this range - // - PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]); - LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1); - DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); - - // - // Loop them - // - while (PointerPte <= LastPte) - { - // - // We'll only touch PTEs that aren't already valid - // - if (PointerPte->u.Hard.Valid == 0) - { - // - // Use the next free page - // - TempPte.u.Hard.PageFrameNumber = FreePage; - ASSERT(FreePageCount != 0); - - // - // Consume free pages - // - FreePage++; - FreePageCount--; - if (!FreePageCount) - { - // - // Out of memory - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - FreePageCount, - MxOldFreeDescriptor.PageCount, - 1); - } - - // - // Write out this PTE - // - PagesLeft++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - // - // Zero this page - // - RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); - } - - // - // Next! - // - PointerPte++; - } - - // - // Do the next address range - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // Now update the free descriptors to consume the pages we used up during - // the PFN allocation loop - // - MxFreeDescriptor->BasePage = FreePage; - MxFreeDescriptor->PageCount = FreePageCount; + NextEntry = MdBlock->ListEntry.Flink; } - else if (Phase == 1) // IN BETWEEN, THE PFN DATABASE IS NOW CREATED + + // + // Save original values of the free descriptor, since it'll be + // altered by early allocations + // + MxOldFreeDescriptor = *MxFreeDescriptor; + + // + // Check if this is a machine with less than 256MB of RAM, and no overide + // + if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && + !(MmSizeOfNonPagedPoolInBytes)) { // - // Reset the descriptor back so we can create the correct memory blocks + // Force the non paged pool to be 2MB so we can reduce RAM usage // - *MxFreeDescriptor = MxOldFreeDescriptor; + MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024; + } + + // + // Hyperspace ends here + // + MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1); + + // + // Check if the user gave a ridicuously large nonpaged pool RAM size + // + if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > + (MmNumberOfPhysicalPages * 7 / 8)) + { + // + // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! + // + MmSizeOfNonPagedPoolInBytes = 0; + } + + // + // Check if no registry setting was set, or if the setting was too low + // + if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) + { + // + // Start with the minimum (256 KB) and add 32 KB for each MB above 4 + // + MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; + MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / + 256 * MmMinAdditionNonPagedPoolPerMb; + } + + // + // Check if the registy setting or our dynamic calculation was too high + // + if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) + { + // + // Set it to the maximum + // + MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; + } + + // + // Check if a percentage cap was set through the registry + // + if (MmMaximumNonPagedPoolPercent) + { + // + // Don't feel like supporting this right now + // + UNIMPLEMENTED; + } + + // + // Page-align the nonpaged pool size + // + MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); + + // + // Now, check if there was a registry size for the maximum size + // + if (!MmMaximumNonPagedPoolInBytes) + { + // + // Start with the default (1MB) + // + MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; // - // Initialize the nonpaged pool + // Add space for PFN database // - InitializePool(NonPagedPool, 0); + MmMaximumNonPagedPoolInBytes += (ULONG) + PAGE_ALIGN((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); // - // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs! + // Add 400KB for each MB above 4 // - PointerPte = MiAddressToPte(MmNonPagedSystemStart); - OldCount = MmNumberOfSystemPtes; - MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) - - PointerPte; + MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * + MmMaxAdditionNonPagedPoolPerMb; + } + + // + // Make sure there's at least 16 pages + the PFN available for expansion + // + PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) + + ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * + sizeof(MMPFN)); + if (MmMaximumNonPagedPoolInBytes < PoolPages) + { + // + // Set it to the minimum value for the maximum (yuck!) + // + MmMaximumNonPagedPoolInBytes = PoolPages; + } + + // + // Systems with 2GB of kernel address space get double the size + // + PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2; + + // + // Don't let the maximum go too high + // + if (MmMaximumNonPagedPoolInBytes > PoolPages) + { + // + // Set it to the upper limit + // + MmMaximumNonPagedPoolInBytes = PoolPages; + } + + // + // Check if this is a system with > 128MB of non paged pool + // + if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) + { + // + // FIXME: Unsure about additional checks needed + // + DPRINT1("Untested path\n"); + } + + // + // Get L2 cache information + // + L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; + MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; + if (L2Associativity) MmSecondaryColors /= L2Associativity; + + // + // Compute final color mask and count + // + MmSecondaryColors >>= PAGE_SHIFT; + if (!MmSecondaryColors) MmSecondaryColors = 1; + MmSecondaryColorMask = MmSecondaryColors - 1; + + // + // Store it + // + KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; + + // + // Calculate the number of bytes for the PFN database + // and then convert to pages + // + MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); + MxPfnAllocation >>= PAGE_SHIFT; + + // + // We have to add one to the count here, because in the process of + // shifting down to the page size, we actually ended up getting the + // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages). + // Later on, we'll shift this number back into bytes, which would cause + // us to end up with only 0x5F000 bytes -- when we actually want to have + // 0x60000 bytes. + // + MxPfnAllocation++; + + // + // Now calculate the nonpaged pool expansion VA region + // + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - + MmMaximumNonPagedPoolInBytes + + MmSizeOfNonPagedPoolInBytes); + MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart); + NonPagedPoolExpansionVa = MmNonPagedPoolStart; + DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n", + MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes); + + // + // Now calculate the nonpaged system VA region, which includes the + // nonpaged pool expansion (above) and the system PTEs. Note that it is + // then aligned to a PDE boundary (4MB). + // + MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - + (MmNumberOfSystemPtes + 1) * PAGE_SIZE); + MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & + ~((4 * 1024 * 1024) - 1)); + + // + // Don't let it go below the minimum + // + if (MmNonPagedSystemStart < (PVOID)0xEB000000) + { + // + // This is a hard-coded limit in the Windows NT address space + // + MmNonPagedSystemStart = (PVOID)0xEB000000; + + // + // Reduce the amount of system PTEs to reach this point + // + MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart - + (ULONG_PTR)MmNonPagedSystemStart) >> + PAGE_SHIFT; MmNumberOfSystemPtes--; - DPRINT("Final System PTE count: %d (%d bytes)\n", - MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); - + ASSERT(MmNumberOfSystemPtes > 1000); + } + + // + // Check if we are in a situation where the size of the paged pool + // is so large that it overflows into nonpaged pool + // + if (MmSizeOfPagedPoolInBytes > + ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart)) + { // - // Create the system PTE space + // We need some recalculations here // - MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); - + DPRINT1("Paged pool is too big!\n"); + } + + // + // Normally, the PFN database should start after the loader images. + // This is already the case in ReactOS, but for now we want to co-exist + // with the old memory manager, so we'll create a "Shadow PFN Database" + // instead, and arbitrarly start it at 0xB0000000. + // + MmPfnDatabase = (PVOID)0xB0000000; + ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0); + + // + // Non paged pool comes after the PFN database + // + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase + + (MxPfnAllocation << PAGE_SHIFT)); + + // + // Now we actually need to get these many physical pages. Nonpaged pool + // is actually also physically contiguous (but not the expansion) + // + PageFrameIndex = MxGetNextPage(MxPfnAllocation + + (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT)); + ASSERT(PageFrameIndex != 0); + DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex); + DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation); + + // + // Now we need some pages to create the page tables for the NP system VA + // which includes system PTEs and expansion NP + // + StartPde = MiAddressToPde(MmNonPagedSystemStart); + EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); + while (StartPde <= EndPde) + { // - // Get the PDE For hyperspace + // Sanity check // - StartPde = MiAddressToPde(HYPER_SPACE); - - // - // Allocate a page for it and create it - // - PageFrameIndex = MmAllocPage(MC_SYSTEM, 0); - TempPde.u.Hard.PageFrameNumber = PageFrameIndex; - TempPde.u.Hard.Global = FALSE; // Hyperspace is local! ASSERT(StartPde->u.Hard.Valid == 0); + + // + // Get a page + // + TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); ASSERT(TempPde.u.Hard.Valid == 1); *StartPde = TempPde; // - // Zero out the page table now + // Zero out the page table // - PointerPte = MiAddressToPte(HYPER_SPACE); + PointerPte = MiPteToAddress(StartPde); RtlZeroMemory(PointerPte, PAGE_SIZE); // - // Setup the mapping PTEs + // Next // - MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); - MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); - MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; + StartPde++; + } + // + // Now we need pages for the page tables which will map initial NP + // + StartPde = MiAddressToPde(MmPfnDatabase); + EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes - 1)); + while (StartPde <= EndPde) + { // - // Reserve system PTEs for zeroing PTEs and clear them + // Sanity check // - MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES, - SystemPteSpace); - RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE)); + ASSERT(StartPde->u.Hard.Valid == 0); // - // Set the counter to maximum to boot with + // Get a page // - MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; // - // Sync us up with ReactOS Mm + // Zero out the page table // - MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); - MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); - - // - // Build the physical memory block - // - MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock, - IncludeType); - - // - // Allocate enough buffer for the PFN bitmap - // Align it up to a 32-bit boundary - // - Bitmap = ExAllocatePoolWithTag(NonPagedPool, - (((MmHighestPhysicalPage + 1) + 31) / 32) * 4, - ' mM'); - if (!Bitmap) - { - // - // This is critical - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - MmLowestPhysicalPage, - MmHighestPhysicalPage, - 0x101); - } + PointerPte = MiPteToAddress(StartPde); + RtlZeroMemory(PointerPte, PAGE_SIZE); // - // Initialize it and clear all the bits to begin with + // Next // - RtlInitializeBitMap(&MiPfnBitMap, - Bitmap, - MmHighestPhysicalPage + 1); - RtlClearAllBits(&MiPfnBitMap); - - // - // Loop physical memory runs - // - for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) - { - // - // Get the run - // - Run = &MmPhysicalMemoryBlock->Run[i]; - DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n", - Run->BasePage << PAGE_SHIFT, - (Run->BasePage + Run->PageCount) << PAGE_SHIFT); + StartPde++; + } - // - // Make sure it has pages inside it - // - if (Run->PageCount) - { - // - // Set the bits in the PFN bitmap - // - RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount); - } - } - + // + // Now remember where the expansion starts + // + MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa; + + // + // Last step is to actually map the nonpaged pool + // + PointerPte = MiAddressToPte(MmNonPagedPoolStart); + LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes - 1)); + while (PointerPte <= LastPte) + { // - // Size up paged pool and build the shadow system page directory + // Use one of our contigous pages // - MiBuildPagedPool(); + TempPte.u.Hard.PageFrameNumber = PageFrameIndex++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte++ = TempPte; } // - // Always return success for now + // Sanity check: make sure we have properly defined the system PTE space // + ASSERT(MiAddressToPte(MmNonPagedSystemStart) < + MiAddressToPte(MmNonPagedPoolExpansionStart)); + + // + // Now go ahead and initialize the ARM³ nonpaged pool + // + MiInitializeArmPool(); + + // + // Get current page data, since we won't be using MxGetNextPage as it + // would corrupt our state + // + FreePage = MxFreeDescriptor->BasePage; + FreePageCount = MxFreeDescriptor->PageCount; + PagesLeft = 0; + + // + // Loop the memory descriptors + // + NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead) + { + // + // Get the descriptor + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || + (MdBlock->MemoryType == LoaderBBTMemory) || + (MdBlock->MemoryType == LoaderSpecialMemory)) + { + // + // These pages are not part of the PFN database + // + NextEntry = MdBlock->ListEntry.Flink; + continue; + } + + // + // Next, check if this is our special free descriptor we've found + // + if (MdBlock == MxFreeDescriptor) + { + // + // Use the real numbers instead + // + BasePage = MxOldFreeDescriptor.BasePage; + PageCount = MxOldFreeDescriptor.PageCount; + } + else + { + // + // Use the descriptor's numbers + // + BasePage = MdBlock->BasePage; + PageCount = MdBlock->PageCount; + } + + // + // Get the PTEs for this range + // + PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1); + DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); + + // + // Loop them + // + while (PointerPte <= LastPte) + { + // + // We'll only touch PTEs that aren't already valid + // + if (PointerPte->u.Hard.Valid == 0) + { + // + // Use the next free page + // + TempPte.u.Hard.PageFrameNumber = FreePage; + ASSERT(FreePageCount != 0); + + // + // Consume free pages + // + FreePage++; + FreePageCount--; + if (!FreePageCount) + { + // + // Out of memory + // + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + FreePageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + // + // Write out this PTE + // + PagesLeft++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + // + // Zero this page + // + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + // + // Next! + // + PointerPte++; + } + + // + // Do the next address range + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // Now update the free descriptors to consume the pages we used up during + // the PFN allocation loop + // + MxFreeDescriptor->BasePage = FreePage; + MxFreeDescriptor->PageCount = FreePageCount; + + /* Call back into shitMM to setup the PFN database */ + MmInitializePageList(); + + // + // Reset the descriptor back so we can create the correct memory blocks + // + *MxFreeDescriptor = MxOldFreeDescriptor; + + // + // Initialize the nonpaged pool + // + InitializePool(NonPagedPool, 0); + + // + // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs! + // + PointerPte = MiAddressToPte(MmNonPagedSystemStart); + OldCount = MmNumberOfSystemPtes; + MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) - + PointerPte; + MmNumberOfSystemPtes--; + DPRINT("Final System PTE count: %d (%d bytes)\n", + MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + + // + // Create the system PTE space + // + MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); + + // + // Get the PDE For hyperspace + // + StartPde = MiAddressToPde(HYPER_SPACE); + + // + // Allocate a page for it and create it + // + PageFrameIndex = MmAllocPage(MC_SYSTEM, 0); + TempPde.u.Hard.PageFrameNumber = PageFrameIndex; + TempPde.u.Hard.Global = FALSE; // Hyperspace is local! + ASSERT(StartPde->u.Hard.Valid == 0); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; + + // + // Zero out the page table now + // + PointerPte = MiAddressToPte(HYPER_SPACE); + RtlZeroMemory(PointerPte, PAGE_SIZE); + + // + // Setup the mapping PTEs + // + MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); + MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); + MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; + + // + // Reserve system PTEs for zeroing PTEs and clear them + // + MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES, + SystemPteSpace); + RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE)); + + // + // Set the counter to maximum to boot with + // + MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 02c42a8b27e..a0d7befcedd 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -168,6 +168,20 @@ extern SIZE_T MmAllocatedNonPagedPool; extern ULONG_PTR MmSubsectionBase; extern ULONG MmSpecialPoolTag; extern PVOID MmHyperSpaceEnd; +extern PMMWSL MmSystemCacheWorkingSetList; +extern ULONG MmMinimumNonPagedPoolSize; +extern ULONG MmMinAdditionNonPagedPoolPerMb; +extern ULONG MmDefaultMaximumNonPagedPool; +extern ULONG MmMaxAdditionNonPagedPoolPerMb; +extern ULONG MmSecondaryColors; +extern ULONG MmSecondaryColorMask; +extern ULONG MmNumberOfSystemPtes; +extern ULONG MmMaximumNonPagedPoolPercent; + +// +// Actual (registry-configurable) size of a GUI thread's stack +// +ULONG MmLargeStackSize; NTSTATUS NTAPI @@ -176,6 +190,33 @@ MmArmInitSystem( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +NTSTATUS +NTAPI +MiInitMachineDependent( + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + +PPHYSICAL_MEMORY_DESCRIPTOR +NTAPI +MmInitializeMemoryLimits( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType +); + +PFN_NUMBER +NTAPI +MiPagesInLoaderBlock( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType +); + +VOID +FASTCALL +MiSyncARM3WithROS( + IN PVOID AddressStart, + IN PVOID AddressEnd +); + NTSTATUS NTAPI MmArmAccessFault( diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c new file mode 100644 index 00000000000..9829bb23218 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -0,0 +1,840 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/mminit.c + * PURPOSE: ARM Memory Manager Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::INIT" +#define MODULE_INVOLVED_IN_ARM3 +#include "miarm.h" + +/* GLOBALS ********************************************************************/ + +// +// These are all registry-configurable, but by default, the memory manager will +// figure out the most appropriate values. +// +ULONG MmMaximumNonPagedPoolPercent; +ULONG MmSizeOfNonPagedPoolInBytes; +ULONG MmMaximumNonPagedPoolInBytes; + +// +// These numbers describe the discrete equation components of the nonpaged +// pool sizing algorithm. +// +// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja +// along with the algorithm that uses them, which is implemented later below. +// +ULONG MmMinimumNonPagedPoolSize = 256 * 1024; +ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024; +ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; +ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; + +// +// The memory layout (and especially variable names) of the NT kernel mode +// components can be a bit hard to twig, especially when it comes to the non +// paged area. +// +// There are really two components to the non-paged pool: +// +// - The initial nonpaged pool, sized dynamically up to a maximum. +// - The expansion nonpaged pool, sized dynamically up to a maximum. +// +// The initial nonpaged pool is physically continuous for performance, and +// immediately follows the PFN database, typically sharing the same PDE. It is +// a very small resource (32MB on a 1GB system), and capped at 128MB. +// +// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after +// the PFN database (which starts at 0xB0000000). +// +// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB +// for a 1GB system). On ARM³ however, it is currently capped at 128MB. +// +// The address where the initial nonpaged pool starts is aptly named +// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes +// bytes. +// +// Expansion nonpaged pool starts at an address described by the variable called +// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes +// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd +// (because of the way it's calculated) at 0xFFBE0000. +// +// Initial nonpaged pool is allocated and mapped early-on during boot, but what +// about the expansion nonpaged pool? It is instead composed of special pages +// which belong to what are called System PTEs. These PTEs are the matter of a +// later discussion, but they are also considered part of the "nonpaged" OS, due +// to the fact that they are never paged out -- once an address is described by +// a System PTE, it is always valid, until the System PTE is torn down. +// +// System PTEs are actually composed of two "spaces", the system space proper, +// and the nonpaged pool expansion space. The latter, as we've already seen, +// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs +// that the system will support, the remaining address space below this address +// is used to hold the system space PTEs. This address, in turn, is held in the +// variable named MmNonPagedSystemStart, which itself is never allowed to go +// below 0xEB000000 (thus creating an upper bound on the number of System PTEs). +// +// This means that 330MB are reserved for total nonpaged system VA, on top of +// whatever the initial nonpaged pool allocation is. +// +// The following URLs, valid as of April 23rd, 2008, support this evidence: +// +// http://www.cs.miami.edu/~burt/journal/NT/memory.html +// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ +// +PVOID MmNonPagedSystemStart; +PVOID MmNonPagedPoolStart; +PVOID MmNonPagedPoolExpansionStart; +PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; + +// +// This is where paged pool starts by default +// +PVOID MmPagedPoolStart = MI_PAGED_POOL_START; +PVOID MmPagedPoolEnd; + +// +// And this is its default size +// +ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE; +PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE; + +// +// Session space starts at 0xBFFFFFFF and grows downwards +// By default, it includes an 8MB image area where we map win32k and video card +// drivers, followed by a 4MB area containing the session's working set. This is +// then followed by a 20MB mapped view area and finally by the session's paged +// pool, by default 16MB. +// +// On a normal system, this results in session space occupying the region from +// 0xBD000000 to 0xC0000000 +// +// See miarm.h for the defines that determine the sizing of this region. On an +// NT system, some of these can be configured through the registry, but we don't +// support that yet. +// +PVOID MiSessionSpaceEnd; // 0xC0000000 +PVOID MiSessionImageEnd; // 0xC0000000 +PVOID MiSessionImageStart; // 0xBF800000 +PVOID MiSessionViewStart; // 0xBE000000 +PVOID MiSessionPoolEnd; // 0xBE000000 +PVOID MiSessionPoolStart; // 0xBD000000 +PVOID MmSessionBase; // 0xBD000000 +ULONG MmSessionSize; +ULONG MmSessionViewSize; +ULONG MmSessionPoolSize; +ULONG MmSessionImageSize; + +// +// The system view space, on the other hand, is where sections that are memory +// mapped into "system space" end up. +// +// By default, it is a 16MB region. +// +PVOID MiSystemViewStart; +ULONG MmSystemViewSize; + +// +// A copy of the system page directory (the page directory associated with the +// System process) is kept (double-mapped) by the manager in order to lazily +// map paged pool PDEs into external processes when they fault on a paged pool +// address. +// +PFN_NUMBER MmSystemPageDirectory; +PMMPTE MmSystemPagePtes; + +// +// The system cache starts right after hyperspace. The first few pages are for +// keeping track of the system working set list. +// +// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000 +// +PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START; + +// +// Windows NT seems to choose between 7000, 11000 and 50000 +// On systems with more than 32MB, this number is then doubled, and further +// aligned up to a PDE boundary (4MB). +// +ULONG MmNumberOfSystemPtes; + +// +// This is how many pages the PFN database will take up +// In Windows, this includes the Quark Color Table, but not in ARM³ +// +ULONG MxPfnAllocation; + +// +// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track +// of pages that are not actually valid physical memory, such as ACPI reserved +// regions, BIOS address ranges, or holes in physical memory address space which +// could indicate device-mapped I/O memory. +// +// In fact, the lack of a PFN entry for a page usually indicates that this is +// I/O space instead. +// +// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning +// a bit to each. If the bit is set, then the page is valid physical RAM. +// +RTL_BITMAP MiPfnBitMap; + +// +// This structure describes the different pieces of RAM-backed address space +// +PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; + +// +// This is where we keep track of the most basic physical layout markers +// +ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1; + +// +// The total number of pages mapped by the boot loader, which include the kernel +// HAL, boot drivers, registry, NLS files and other loader data structures is +// kept track of here. This depends on "LoaderPagesSpanned" being correct when +// coming from the loader. +// +// This number is later aligned up to a PDE boundary. +// +ULONG MmBootImageSize; + +// +// These three variables keep track of the core separation of address space that +// exists between kernel mode and user mode. +// +ULONG MmUserProbeAddress; +PVOID MmHighestUserAddress; +PVOID MmSystemRangeStart; + +PVOID MmSystemCacheStart; +PVOID MmSystemCacheEnd; +MMSUPPORT MmSystemCacheWs; + +// +// This is where hyperspace ends (followed by the system cache working set) +// +PVOID MmHyperSpaceEnd; + +// +// Page coloring algorithm data +// +ULONG MmSecondaryColors; +ULONG MmSecondaryColorMask; + +// +// Actual (registry-configurable) size of a GUI thread's stack +// +ULONG MmLargeStackSize; + +/* PRIVATE FUNCTIONS **********************************************************/ + +// +// In Bavaria, this is probably a hate crime +// +VOID +FASTCALL +MiSyncARM3WithROS(IN PVOID AddressStart, + IN PVOID AddressEnd) +{ + // + // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder + // + ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); + while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) + { + // + // This both odious and heinous + // + extern ULONG MmGlobalKernelPageDirectory[1024]; + MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde]; + Pde++; + } +} + +PFN_NUMBER +NTAPI +MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType) +{ + PLIST_ENTRY NextEntry; + PFN_NUMBER PageCount = 0; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + // + // Now loop through the descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // Grab each one, and check if it's one we should include + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType < LoaderMaximum) && + (IncludeType[MdBlock->MemoryType])) + { + // + // Add this to our running total + // + PageCount += MdBlock->PageCount; + } + + // + // Try the next descriptor + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // Return the total + // + return PageCount; +} + +PPHYSICAL_MEMORY_DESCRIPTOR +NTAPI +MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType) +{ + PLIST_ENTRY NextEntry; + ULONG Run = 0, InitialRuns = 0; + PFN_NUMBER NextPage = -1, PageCount = 0; + PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + // + // Scan the memory descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // For each one, increase the memory allocation estimate + // + InitialRuns++; + NextEntry = NextEntry->Flink; + } + + // + // Allocate the maximum we'll ever need + // + Buffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (InitialRuns - 1), + 'lMmM'); + if (!Buffer) return NULL; + + // + // For now that's how many runs we have + // + Buffer->NumberOfRuns = InitialRuns; + + // + // Now loop through the descriptors again + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // Grab each one, and check if it's one we should include + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType < LoaderMaximum) && + (IncludeType[MdBlock->MemoryType])) + { + // + // Add this to our running total + // + PageCount += MdBlock->PageCount; + + // + // Check if the next page is described by the next descriptor + // + if (MdBlock->BasePage == NextPage) + { + // + // Combine it into the same physical run + // + ASSERT(MdBlock->PageCount != 0); + Buffer->Run[Run - 1].PageCount += MdBlock->PageCount; + NextPage += MdBlock->PageCount; + } + else + { + // + // Otherwise just duplicate the descriptor's contents + // + Buffer->Run[Run].BasePage = MdBlock->BasePage; + Buffer->Run[Run].PageCount = MdBlock->PageCount; + NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount; + + // + // And in this case, increase the number of runs + // + Run++; + } + } + + // + // Try the next descriptor + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // We should not have been able to go past our initial estimate + // + ASSERT(Run <= Buffer->NumberOfRuns); + + // + // Our guess was probably exaggerated... + // + if (InitialRuns > Run) + { + // + // Allocate a more accurately sized buffer + // + NewBuffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (Run - 1), + 'lMmM'); + if (NewBuffer) + { + // + // Copy the old buffer into the new, then free it + // + RtlCopyMemory(NewBuffer->Run, + Buffer->Run, + sizeof(PHYSICAL_MEMORY_RUN) * Run); + ExFreePool(Buffer); + + // + // Now use the new buffer + // + Buffer = NewBuffer; + } + } + + // + // Write the final numbers, and return it + // + Buffer->NumberOfRuns = Run; + Buffer->NumberOfPages = PageCount; + return Buffer; +} + +VOID +NTAPI +MiBuildPagedPool(VOID) +{ + PMMPTE PointerPte, PointerPde; + MMPTE TempPte = HyperTemplatePte; + PFN_NUMBER PageFrameIndex; + KIRQL OldIrql; + ULONG Size, BitMapSize; + + // + // Get the page frame number for the system page directory + // + PointerPte = MiAddressToPte(PDE_BASE); + MmSystemPageDirectory = PFN_FROM_PTE(PointerPte); + + // + // Allocate a system PTE which will hold a copy of the page directory + // + PointerPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(PointerPte); + MmSystemPagePtes = MiPteToAddress(PointerPte); + + // + // Make this system PTE point to the system page directory. + // It is now essentially double-mapped. This will be used later for lazy + // evaluation of PDEs accross process switches, similarly to how the Global + // page directory array in the old ReactOS Mm is used (but in a less hacky + // way). + // + TempPte = HyperTemplatePte; + TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + // + // Let's get back to paged pool work: size it up. + // By default, it should be twice as big as nonpaged pool. + // + MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes; + if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart - + (ULONG_PTR)MmPagedPoolStart)) + { + // + // On the other hand, we have limited VA space, so make sure that the VA + // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set + // whatever maximum is possible. + // + MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart - + (ULONG_PTR)MmPagedPoolStart; + } + + // + // Get the size in pages and make sure paged pool is at least 32MB. + // + Size = MmSizeOfPagedPoolInBytes; + if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE; + Size = BYTES_TO_PAGES(Size); + + // + // Now check how many PTEs will be required for these many pages. + // + Size = (Size + (1024 - 1)) / 1024; + + // + // Recompute the page-aligned size of the paged pool, in bytes and pages. + // + MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024; + MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT; + + // + // Let's be really sure this doesn't overflow into nonpaged system VA + // + ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <= + (ULONG_PTR)MmNonPagedSystemStart); + + // + // This is where paged pool ends + // + MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart + + MmSizeOfPagedPoolInBytes) - 1); + + // + // So now get the PDE for paged pool and zero it out + // + PointerPde = MiAddressToPde(MmPagedPoolStart); + RtlZeroMemory(PointerPde, + (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE)); + + // + // Next, get the first and last PTE + // + PointerPte = MiAddressToPte(MmPagedPoolStart); + MmPagedPoolInfo.FirstPteForPagedPool = PointerPte; + MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd); + + // + // Lock the PFN database + // + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + // + // Allocate a page and map the first paged pool PDE + // + PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + ASSERT(PointerPde->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPde = TempPte; + + // + // Release the PFN database lock + // + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + // + // We only have one PDE mapped for now... at fault time, additional PDEs + // will be allocated to handle paged pool growth. This is where they'll have + // to start. + // + MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1; + + // + // We keep track of each page via a bit, so check how big the bitmap will + // have to be (make sure to align our page count such that it fits nicely + // into a 4-byte aligned bitmap. + // + // We'll also allocate the bitmap header itself part of the same buffer. + // + Size = Size * 1024; + ASSERT(Size == MmSizeOfPagedPoolInPages); + BitMapSize = Size; + Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG)); + + // + // Allocate the allocation bitmap, which tells us which regions have not yet + // been mapped into memory + // + MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool, + Size, + ' mM'); + ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap); + + // + // Initialize it such that at first, only the first page's worth of PTEs is + // marked as allocated (incidentially, the first PDE we allocated earlier). + // + RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap, + (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1), + BitMapSize); + RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap); + RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024); + + // + // We have a second bitmap, which keeps track of where allocations end. + // Given the allocation bitmap and a base address, we can therefore figure + // out which page is the last page of that allocation, and thus how big the + // entire allocation is. + // + MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool, + Size, + ' mM'); + ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap); + RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap, + (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1), + BitMapSize); + + // + // Since no allocations have been made yet, there are no bits set as the end + // + RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap); + + // + // Initialize paged pool. + // + InitializePool(PagedPool, 0); + + // + // Initialize the paged pool mutex + // + KeInitializeGuardedMutex(&MmPagedPoolMutex); +} + +NTSTATUS +NTAPI +MmArmInitSystem(IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG i; + BOOLEAN IncludeType[LoaderMaximum]; + PVOID Bitmap; + PPHYSICAL_MEMORY_RUN Run; + PFN_NUMBER PageCount; + + // + // Instantiate memory that we don't consider RAM/usable + // We use the same exclusions that Windows does, in order to try to be + // compatible with WinLDR-style booting + // + for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE; + IncludeType[LoaderBad] = FALSE; + IncludeType[LoaderFirmwarePermanent] = FALSE; + IncludeType[LoaderSpecialMemory] = FALSE; + IncludeType[LoaderBBTMemory] = FALSE; + if (Phase == 0) + { + // + // Define the basic user vs. kernel address space separation + // + MmSystemRangeStart = (PVOID)KSEG0_BASE; + MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000; + MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1); + + // + // Get the size of the boot loader's image allocations and then round + // that region up to a PDE size, so that any PDEs we might create for + // whatever follows are separate from the PDEs that boot loader might've + // already created (and later, we can blow all that away if we want to). + // + MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned; + MmBootImageSize *= PAGE_SIZE; + MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1); + ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0); + + // + // Set the size of session view, pool, and image + // + MmSessionSize = MI_SESSION_SIZE; + MmSessionViewSize = MI_SESSION_VIEW_SIZE; + MmSessionPoolSize = MI_SESSION_POOL_SIZE; + MmSessionImageSize = MI_SESSION_IMAGE_SIZE; + + // + // Set the size of system view + // + MmSystemViewSize = MI_SYSTEM_VIEW_SIZE; + + // + // This is where it all ends + // + MiSessionImageEnd = (PVOID)PTE_BASE; + + // + // This is where we will load Win32k.sys and the video driver + // + MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - + MmSessionImageSize); + + // + // So the view starts right below the session working set (itself below + // the image area) + // + MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - + MmSessionImageSize - + MI_SESSION_WORKING_SET_SIZE - + MmSessionViewSize); + + // + // Session pool follows + // + MiSessionPoolEnd = MiSessionViewStart; + MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd - + MmSessionPoolSize); + + // + // And it all begins here + // + MmSessionBase = MiSessionPoolStart; + + // + // Sanity check that our math is correct + // + ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE); + + // + // Session space ends wherever image session space ends + // + MiSessionSpaceEnd = MiSessionImageEnd; + + // + // System view space ends at session space, so now that we know where + // this is, we can compute the base address of system view space itself. + // + MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase - + MmSystemViewSize); + + // + // Count physical pages on the system + // + PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType); + + // + // Check if this is a machine with less than 19MB of RAM + // + if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING) + { + // + // Use the very minimum of system PTEs + // + MmNumberOfSystemPtes = 7000; + } + else + { + // + // Use the default, but check if we have more than 32MB of RAM + // + MmNumberOfSystemPtes = 11000; + if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST) + { + // + // Double the amount of system PTEs + // + MmNumberOfSystemPtes <<= 1; + } + } + + DPRINT("System PTE count has been tuned to %d (%d bytes)\n", + MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + + /* Initialize the platform-specific parts */ + MiInitMachineDependent(LoaderBlock); + + // + // Sync us up with ReactOS Mm + // + MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); + MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); + MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); + + // + // Build the physical memory block + // + MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock, + IncludeType); + + // + // Allocate enough buffer for the PFN bitmap + // Align it up to a 32-bit boundary + // + Bitmap = ExAllocatePoolWithTag(NonPagedPool, + (((MmHighestPhysicalPage + 1) + 31) / 32) * 4, + ' mM'); + if (!Bitmap) + { + // + // This is critical + // + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MmLowestPhysicalPage, + MmHighestPhysicalPage, + 0x101); + } + + // + // Initialize it and clear all the bits to begin with + // + RtlInitializeBitMap(&MiPfnBitMap, + Bitmap, + MmHighestPhysicalPage + 1); + RtlClearAllBits(&MiPfnBitMap); + + // + // Loop physical memory runs + // + for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) + { + // + // Get the run + // + Run = &MmPhysicalMemoryBlock->Run[i]; + DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n", + Run->BasePage << PAGE_SHIFT, + (Run->BasePage + Run->PageCount) << PAGE_SHIFT); + + // + // Make sure it has pages inside it + // + if (Run->PageCount) + { + // + // Set the bits in the PFN bitmap + // + RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount); + } + } + + // + // Size up paged pool and build the shadow system page directory + // + MiBuildPagedPool(); + } + + // + // Always return success for now + // + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index f8c8574af9f..5e21ad6f2d0 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -373,14 +373,6 @@ MmInitSystem(IN ULONG Phase, // Initialize ARM³ in phase 0 // MmArmInitSystem(0, KeLoaderBlock); - - /* Initialize the page list */ - MmInitializePageList(); - - // - // Initialize ARM³ in phase 1 - // - MmArmInitSystem(1, KeLoaderBlock); #if defined(_WINKD_) // diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 0de8a3faaa4..7a438c13e9b 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -390,6 +390,7 @@ hypermap.c iosup.c mdlsup.c + mminit.c mmsup.c ncache.c pagfault.c From 9f67c346522f7bddb7b3949001c80b324dfd0d5e Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Feb 2010 03:59:17 +0000 Subject: [PATCH 63/97] [NTOS]: Allow registry configuration of large kernel stack size, with proper checks. svn path=/trunk/; revision=45548 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 22 ++++++++++++++++++++++ reactos/ntoskrnl/mm/ARM3/mminit.c | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 7c9ca592cf1..41b15734fb2 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -74,7 +74,29 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PVOID NonPagedPoolExpansionVa; ULONG OldCount, L2Associativity; PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; + + /* Check for kernel stack size that's too big */ + if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / 1024)) + { + /* Sanitize to default value */ + MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; + } + else + { + /* Take the registry setting, and convert it into bytes */ + MmLargeStackSize *= 1024; + /* Now align it to a page boundary */ + MmLargeStackSize = PAGE_ROUND_UP(MmLargeStackSize); + + /* Sanity checks */ + ASSERT(MmLargeStackSize <= KERNEL_LARGE_STACK_SIZE); + ASSERT((MmLargeStackSize & (PAGE_SIZE - 1)) == 0); + + /* Make sure it's not too low */ + if (MmLargeStackSize < KERNEL_STACK_SIZE) MmLargeStackSize = KERNEL_STACK_SIZE; + } + // // The large kernel stack is cutomizable, but use default value for now // diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 9829bb23218..21f666c81c3 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -232,7 +232,7 @@ ULONG MmSecondaryColorMask; // // Actual (registry-configurable) size of a GUI thread's stack // -ULONG MmLargeStackSize; +ULONG MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; /* PRIVATE FUNCTIONS **********************************************************/ From 8e0c1b2fb43983c2d0f0733582da06b9cfc68178 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Feb 2010 04:12:23 +0000 Subject: [PATCH 64/97] [NTOS]: Actually use calculated kernel stack size value. [NTOS]: Define the template PTE/PDE statically, instead of doing it in code. It's faster, and saves us the trouble of not being able to use the template from point 0. Move the template setup into ARM3 instead of page.c. svn path=/trunk/; revision=45549 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 22 ++++++++++++++++------ reactos/ntoskrnl/mm/i386/page.c | 6 ------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 41b15734fb2..47321eaab6e 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -29,6 +29,9 @@ PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; +MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; +MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; + /* PRIVATE FUNCTIONS **********************************************************/ PFN_NUMBER @@ -70,7 +73,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) ULONG FreePages = 0; PFN_NUMBER PageFrameIndex, PoolPages; PMMPTE StartPde, EndPde, PointerPte, LastPte; - MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte; + MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; ULONG OldCount, L2Associativity; PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; @@ -97,11 +100,18 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (MmLargeStackSize < KERNEL_STACK_SIZE) MmLargeStackSize = KERNEL_STACK_SIZE; } - // - // The large kernel stack is cutomizable, but use default value for now - // - MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; - + /* Check for global bit */ + if (KeFeatureBits & KF_GLOBAL_PAGE) + { + /* Set it on the template PTE and PDE */ + ValidKernelPte.u.Hard.Global = TRUE; + ValidKernelPde.u.Hard.Global = TRUE; + } + + /* Now templates are ready */ + TempPte = ValidKernelPte; + TempPde = ValidKernelPde; + // // Set CR3 for the system process // diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 5d5966f0c1f..cb075b0f2fc 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -1012,12 +1012,6 @@ MmInitGlobalKernelPageDirectory(VOID) DPRINT("MmInitGlobalKernelPageDirectory()\n"); - // - // Setup template - // - HyperTemplatePte.u.Long = (PA_PRESENT | PA_READWRITE | PA_DIRTY | PA_ACCESSED); - if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Long |= PA_GLOBAL; - for (i = ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i < 1024; i++) { if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && From 9709c3dfb9cbe7a30c1b177caf5dfd47ff43e0ec Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Wed, 10 Feb 2010 08:24:34 +0000 Subject: [PATCH 65/97] Found a leak fix patch from years ago svn path=/trunk/; revision=45550 --- .../applications/network/ipconfig/ipconfig.c | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/reactos/base/applications/network/ipconfig/ipconfig.c b/reactos/base/applications/network/ipconfig/ipconfig.c index 8f6ca9a9e6b..5bb2d95fc25 100644 --- a/reactos/base/applications/network/ipconfig/ipconfig.c +++ b/reactos/base/applications/network/ipconfig/ipconfig.c @@ -183,17 +183,21 @@ LPTSTR GetConnectionType(LPTSTR lpClass) ConType = (LPTSTR)HeapAlloc(ProcessHeap, 0, dwDataSize); - if (ConType == NULL) - return NULL; - - if(RegQueryValueEx(hKey, - _T("Name"), - NULL, - &dwType, - (PBYTE)ConType, - &dwDataSize) != ERROR_SUCCESS) + if (ConType) { - ConType = NULL; + if(RegQueryValueEx(hKey, + _T("Name"), + NULL, + &dwType, + (PBYTE)ConType, + &dwDataSize) != ERROR_SUCCESS) + { + HeapFree(ProcessHeap, + 0, + ConType); + + ConType = NULL; + } } } } @@ -456,7 +460,9 @@ VOID ShowInfo(BOOL bAll) if (bAll) { - _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), GetConnectionDescription(pAdapter->AdapterName)); + LPTSTR lpDesc = GetConnectionDescription(pAdapter->AdapterName); + _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), lpDesc); + HeapFree(ProcessHeap, 0, lpDesc); _tprintf(_T("\tPhysical Address. . . . . . . . . : %s\n"), PrintMacAddr(pAdapter->Address)); if (pAdapter->DhcpEnabled) _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : Yes\n")); From 909e0c1b43277d8f95cea74867850d86a48ca706 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 10 Feb 2010 12:10:23 +0000 Subject: [PATCH 66/97] Update log2lines to ver. 2.1. Jan Roeloffzen, bug #4342. svn path=/trunk/; revision=45551 --- reactos/tools/log2lines/cache.c | 17 +- reactos/tools/log2lines/cache.h | 2 + reactos/tools/log2lines/cmd.c | 291 ++++++++++++++++++++++++++ reactos/tools/log2lines/cmd.h | 26 +++ reactos/tools/log2lines/compat.h | 2 + reactos/tools/log2lines/config.h | 3 +- reactos/tools/log2lines/help.c | 60 +++++- reactos/tools/log2lines/help.h | 2 + reactos/tools/log2lines/image.c | 1 + reactos/tools/log2lines/image.h | 2 + reactos/tools/log2lines/list.c | 13 ++ reactos/tools/log2lines/list.h | 4 +- reactos/tools/log2lines/log2lines.c | 94 +++++---- reactos/tools/log2lines/log2lines.mak | 5 + reactos/tools/log2lines/options.c | 52 +++-- reactos/tools/log2lines/options.h | 4 + reactos/tools/log2lines/revision.c | 11 +- reactos/tools/log2lines/revision.h | 2 + reactos/tools/log2lines/stat.c | 34 +-- reactos/tools/log2lines/stat.h | 2 + reactos/tools/log2lines/util.c | 33 +++ reactos/tools/log2lines/util.h | 19 ++ reactos/tools/log2lines/version.h | 4 +- 23 files changed, 591 insertions(+), 92 deletions(-) create mode 100644 reactos/tools/log2lines/cmd.c create mode 100644 reactos/tools/log2lines/cmd.h diff --git a/reactos/tools/log2lines/cache.c b/reactos/tools/log2lines/cache.c index 0d79ea29f62..fd5bcc2c303 100644 --- a/reactos/tools/log2lines/cache.c +++ b/reactos/tools/log2lines/cache.c @@ -11,12 +11,10 @@ #include "util.h" #include "version.h" #include "compat.h" -#include "config.h" -#include "list.h" #include "options.h" #include "help.h" #include "image.h" -#include "revision.h" + #include "log2lines.h" static char *cache_name; @@ -77,11 +75,6 @@ check_directory(int force) char *check_iso; char *check_dir; - if (opt_Revision) - { - revinfo.rev = getRevision(NULL, 1); - revinfo.range = DEF_RANGE; - } check_iso = strrchr(opt_dir, '.'); l2l_dbg(1, "Checking directory: %s\n", opt_dir); if (check_iso && PATHCMP(check_iso, ".7z") == 0) @@ -139,11 +132,6 @@ check_directory(int force) return 1; } } - if (opt_Revision) - { - revinfo.buildrev = getTBRevision(opt_dir); - l2l_dbg(1, "Trunk build revision: %d\n", revinfo.buildrev); - } cache_name = malloc(MAX_PATH); tmp_name = malloc(MAX_PATH); strcpy(cache_name, opt_dir); @@ -238,10 +226,11 @@ create_cache(int force, int skipImageBase) l2l_dbg(0, "Scanning %s ...\n", opt_dir); snprintf(Line, LINESIZE, DIR_FMT, opt_dir, tmp_name); l2l_dbg(1, "Executing: %s\n", Line); - if (system(Line) < 0) + if (system(Line) != 0) { l2l_dbg(0, "Cannot list directory %s\n", opt_dir); l2l_dbg(1, "Failed to execute: '%s'\n", Line); + remove(tmp_name); return 2; } l2l_dbg(0, "Creating cache ..."); diff --git a/reactos/tools/log2lines/cache.h b/reactos/tools/log2lines/cache.h index 5a2f7485d3e..b33e5f9b4b5 100644 --- a/reactos/tools/log2lines/cache.h +++ b/reactos/tools/log2lines/cache.h @@ -13,3 +13,5 @@ int read_cache(void); int create_cache(int force, int skipImageBase); #endif /* __L2L_CACHE_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/cmd.c b/reactos/tools/log2lines/cmd.c new file mode 100644 index 00000000000..72877dcb822 --- /dev/null +++ b/reactos/tools/log2lines/cmd.c @@ -0,0 +1,291 @@ +/* + * ReactOS log2lines + * Written by Jan Roeloffzen + * + * - Cli for escape commands + */ +#include +#include +#include + +#include "util.h" +#include "cmd.h" +#include "options.h" +#include "log2lines.h" +#include "help.h" + +/* When you edit the cmd line and/or use the history instead of just typing, + * a bunch of editing BS and space characters + * is inserted, so the string looks right on the console but still + * starts with the original string: + */ +static char +*backSpaceEdit(char *s) +{ + char c; + char *edit = s; + char *text = s; + + while (( c = *edit++ )) + { + switch (c) + { + case KDBG_BS_CHAR: + if (text > s) + text --; + break; + default: + *text++ = c; + } + } + *text = '\0'; + + return s; +} + +static int +handle_switch(FILE *outFile, int *sw, char *arg, char *desc) +{ + int changed =0; + int x = 0; + + if (arg && (strcmp(arg,"") != 0)) + { + x = atoi(arg); + if (x != *sw) + { + *sw = x; + changed = 1; + } + } + if (desc) + { + esclog(outFile, "%s is %d (%s)\n", desc, *sw, changed ? "changed":"unchanged"); + if (!arg) + esclog(outFile, "(readonly)\n"); + } + + return changed; +} + +static int +handle_switch_str(FILE *outFile, char *sw, char *arg, char *desc) +{ + int changed =0; + + if (arg) + { + if (strcmp(arg,"") != 0) + { + if (strcmp(arg,KDBG_ESC_OFF) == 0) + { + if (*sw) + changed = 1; + *sw = '\0'; + } + else if (strcmp(arg, sw) != 0) + { + strcpy(sw, arg); + changed = 1; + } + } + } + if (desc) + { + esclog(outFile, "%s is \"%s\" (%s)\n", desc, sw, changed ? "changed":"unchanged"); + if (!arg) + esclog(outFile, "(readonly)\n"); + } + + return changed; +} + +static int +handle_switch_pstr(FILE *outFile, char **psw, char *arg, char *desc) +{ + int changed =0; + + if (arg) + { + if (strcmp(arg,"") != 0) + { + if (strcmp(arg,KDBG_ESC_OFF) == 0) + { + if (*psw) + changed = 1; + free(*psw); + *psw = NULL; + } + else + { + if (!*psw) + { + *psw = malloc(LINESIZE); + **psw = '\0'; + } + + if (strcmp(arg, *psw) != 0) + { + strcpy(*psw, arg); + changed = 1; + } + } + } + } + if (desc) + { + esclog(outFile, "%s is \"%s\" (%s)\n", desc, *psw, changed ? "changed":"unchanged"); + if (!arg) + esclog(outFile, "(readonly)\n"); + } + + return changed; +} + +char +handle_escape_cmd(FILE *outFile, char *Line, char *path, char *LineOut) +{ + char cmd; + char sep = '\n'; + char *arg; + char *l = Line; + int res = 1; + int cnt = 0; + int changed = 0; + + l = backSpaceEdit(l); + if (l[1] != KDBG_ESC_CHAR) + return l[1]; //for reprocessing as not escaped + + log(outFile, "\n"); + + l += 2; //skip space+escape character + if ( (cnt=sscanf(l,"%c%c",&cmd,&sep)) < 1) + { + esclog(outFile, "Command expected\n"); + res = 0; + } + + if (res && cnt==2 && sep != ' ') + { + esclog(outFile, "' ' expected\n"); + res = 0; + } + l++; //skip cmd + while ( *l == ' ')l++; //skip more spaces + arg = l; + opt_cli = 1; + switch (cmd) + { + case 'h': + usage(1); + break; + case 'b': + if (handle_switch(outFile, &opt_buffered, arg, "-b Logfile buffering")) + set_LogFile(logFile); //re-open same logfile + break; + case 'c': + handle_switch(outFile, &opt_console, NULL, "-c Console option"); + break; + case 'd': + handle_switch_str(outFile, opt_dir, NULL, "-d Directory option"); + break; + case 'l': + if (handle_switch_str(outFile, opt_logFile, arg, "-l logfile")) + set_LogFile(logFile); //open new logfile + break; + case 'm': + handle_switch(outFile, &opt_Mark, arg, "-m mark (*)"); + break; + case 'M': + handle_switch(outFile, &opt_Mark, arg, "-M Mark (?)"); + break; + case 'P': + handle_switch_str(outFile, opt_Pipe, NULL, "-P Pipeline option"); + break; + case 'q': + opt_quit = 1; + esclog(outFile, "Bye!\n"); + break; + case 'r': + handle_switch(outFile, &opt_raw, arg, "-r Raw"); + break; + case 'R': + changed = handle_switch_pstr(outFile, &opt_Revision, arg, NULL); + if (opt_Revision) + { + if (strstr(opt_Revision, "check") == opt_Revision) + { + esclog(outFile, "-R is \"%s\" (%s)\n", opt_Revision, changed ? "changed":"unchanged"); + } + else if (strstr(opt_Revision, "regscan") == opt_Revision) + { + char *s = strchr(opt_Revision, ','); + + revinfo.range = DEF_RANGE; + if (s) + { + *s++ = '\0'; + revinfo.range = atoi(s); + } + regscan(outFile); + } + else if (strstr(opt_Revision, "regclear") == opt_Revision) + { + list_clear(&sources); + summ.regfound = 0; + esclog(outFile, "cleared regression scan results\n"); + } + } + break; + case 's': + if (strcmp(arg,"clear") == 0) + { + memset(&summ, 0, sizeof(SUMM)); + esclog(outFile, "Statistics cleared\n"); + } + else + stat_print(outFile, &summ); + break; + case 'S': + cnt = sscanf(arg, "%d+%d", &opt_Source, &opt_SrcPlus); + if (opt_Source) + { + handle_switch(outFile, &opt_undo, "1", "-u Undo"); + handle_switch(outFile, &opt_redo, "1", "-U Undo and reprocess"); + } + esclog(outFile, "-S Sources option is %d+%d,\"%s\"\n", opt_Source, opt_SrcPlus, opt_SourcesPath); + esclog(outFile, "(Setting source tree not implemented)\n"); + break; + case 't': + handle_switch(outFile, &opt_twice, arg, "-t Translate twice"); + break; + case 'T': + handle_switch(outFile, &opt_twice, arg, NULL); + handle_switch(outFile, &opt_Twice, arg, "-T Translate for (address-1)"); + break; + case 'u': + handle_switch(outFile, &opt_undo, arg, "-u undo"); + break; + case 'U': + handle_switch(outFile, &opt_undo, arg, NULL); + handle_switch(outFile, &opt_redo, arg, "-U Undo and reprocess"); + break; + case 'v': + handle_switch(outFile, &opt_verbose, arg, "-v Verbosity"); + break; + case 'z': + handle_switch_str(outFile, opt_7z, NULL, "-z 7z path"); + break; + default: + if (strchr(optchars, cmd)) + esclog(outFile, "Command not implemented in cli: %c %s\n",cmd, arg) + else + esclog(outFile, "Unknown command: %c %s\n",cmd, arg); + } + opt_cli = 0; + + memset(Line, '\0', LINESIZE); // flushed + + return KDBG_ESC_CHAR; //handled escaped command +} diff --git a/reactos/tools/log2lines/cmd.h b/reactos/tools/log2lines/cmd.h new file mode 100644 index 00000000000..c6b7d052043 --- /dev/null +++ b/reactos/tools/log2lines/cmd.h @@ -0,0 +1,26 @@ +/* + * ReactOS log2lines + * Written by Jan Roeloffzen + * + * - Cli for escape commands + */ + +#ifndef __L2L_CMD_H__ +#define __L2L_CMD_H__ + +#include + +#define KDBG_BS_CHAR 0x08 +#define KDBG_ESC_CHAR '`' +#define KDBG_ESC_STR "`" +#define KDBG_ESC_RESP "| L2L- " +#define KDBG_ESC_OFF "off" +#define KDBG_PROMPT "kdb:>" //Start interactive (-c) after this pattern +#define KDBG_CONT "---" //Also after this pattern (prompt with no line ending) +#define KDBG_DISCARD "Command '" KDBG_ESC_STR //Discard responses at l2l escape commands + +char handle_escape_cmd(FILE *outFile, char *Line, char *path, char *LineOut); + +#endif /* __L2L_CMD_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/compat.h b/reactos/tools/log2lines/compat.h index dfc1b4203ba..76d87681ce0 100644 --- a/reactos/tools/log2lines/compat.h +++ b/reactos/tools/log2lines/compat.h @@ -37,3 +37,5 @@ #endif /* __L2L_COMPAT_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/config.h b/reactos/tools/log2lines/config.h index a11ed1e2444..c1a29d22f9c 100644 --- a/reactos/tools/log2lines/config.h +++ b/reactos/tools/log2lines/config.h @@ -15,7 +15,6 @@ #define CACHEFILE "log2lines.cache" #define TRKBUILDPREFIX "bootcd-" #define SVN_PREFIX "/trunk/reactos/" -#define KDBG_PROMPT "kdbg>" #define PIPEREAD_CMD "piperead -c" @@ -32,3 +31,5 @@ PATH_STR "reactos" PATH_STR "reactos > " DEV_NULL #define NAMESIZE 80 #endif /* __L2L_CONFIG_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/help.c b/reactos/tools/log2lines/help.c index a0484a7512a..37e6bf400f8 100644 --- a/reactos/tools/log2lines/help.c +++ b/reactos/tools/log2lines/help.c @@ -10,6 +10,7 @@ #include "compat.h" #include "config.h" #include "options.h" +#include "cmd.h" #include "help.h" char *verboseUsage = @@ -76,7 +77,7 @@ char *verboseUsage = " - regscan[,]:\n" " Scan for regression candidates. Essentially it tries to find\n" " matches between the SVN log entries and the sources hit by\n" -" the backtrace.\n" +" a backtrace (bt) command.\n" " is the amount of revisions to look back from the build\n" " revision (default 500)\n" " The output of '-R regscan' is printed after EOF. The 'Changed path'\n" @@ -130,7 +131,25 @@ char *verboseUsage = " : Specify path to 7z. See also option -d.\n" " Default: '7z'\n" "\n" -"Examples:\n" +"CLI escape commands:\n" +" It is possible to change options and perform actions from the 'kdb:>' prompt\n" +" By prepending the `(backquote) character to the option.\n" +" Example: 'kdb:> `l new.log' changes the current logfile to 'new.log'.\n" +" Flag options like 'b' are given a numeric value of 0 (off) or 1 (on).\n" +" Options accepting a string as argument can be cleared by the value '" KDBG_ESC_OFF "'.\n" +" Some ClI commands are read only or not (entirely) implemented.\n" +" If no value is provided, the current one is printed.\n" +" There are only a few extra ClI commands or with different behaviour:\n" +" - `h : shows this helptext (without exiting)\n" +" - `q : quits log2lines\n" +" - `R regscan : the output is printed immediately (do a 'bt' first)\n" +" - `R regclear : clears previous regscan matches\n" +" - `s : the output is printed immediately\n" +" - `s clear : clears all statistics.\n" +" - `S : only and can be set.\n" +" - `v : sets the current debug loglevel\n" +"\n" +"Option Examples:\n" " Setup: A VMware machine with its serial port set to: '\\\\.\\pipe\\kdbg'.\n\n" " Just recreate cache after a svn update or a new module has been added:\n" " log2lines -F\n\n" @@ -179,7 +198,42 @@ char *verboseUsage = " \n" " | R--- Conflict : source(44191) > build(43850)\n" " | 2664 else\n" -" | 2665 rc = MSIREG_OpenUserDataKey(comp->ComponentId,\n" +" | 2665 rc = MSIREG_OpenUserDataKey(comp->ComponentId,\n\n" +"CLI Examples: (some are based on the option examples above)\n" +" Use '`R check' to show that action.c has been changed after the build:\n" +" kdb:> `R check\n" +" | L2L- -R is \"check\" (changed)\n" +" kdb:> bt\n" +" \n" +" | 0780 if (create)\n" +" | 0781 rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);\n" +" \n" +" | R--- Conflict : source(44191) > build(43850)\n" +" | 2664 else\n" +" | 2665 rc = MSIREG_OpenUserDataKey(comp->ComponentId,\n\n" +" kdb:>\n\n" +" Generate source lines. Show 2 lines of context plus 1 additional line.\n" +" The -Uu options are dependent on -S:\n" +" kdb:> `S 2+1\n" +" | L2L- -u Undo is 1 (changed)\n" +" | L2L- -U Undo and reprocess is 1 (changed)\n" +" | L2L- -S Sources option is 2+1,\"C:\\ROS\\reactos\\\" \n" +" | L2L- (Setting source tree not implemented)\n" +" kdb:> bt\n" +" \n" +" | 0188 {\n" +" | 0189 r = MSI_ViewFetch( view, &rec );\n" +" | ----\n" +" | 0190 if( r != ERROR_SUCCESS )\n" +" kdb:>\n\n" +" Change logfile:\n" +" kdb:> `l\n" +" | L2L- -l logfile is "" (unchanged)\n" +" kdb:> `l new.log\n" +" | L2L- -l logfile is \"new.log\" (changed)\n" +" kdb:> `l off\n" +" | L2L- -l logfile is "" (changed)\n" +" kdb:>\n" "\n"; void diff --git a/reactos/tools/log2lines/help.h b/reactos/tools/log2lines/help.h index 8116a7dcb22..5f2ab3893da 100644 --- a/reactos/tools/log2lines/help.h +++ b/reactos/tools/log2lines/help.h @@ -13,3 +13,5 @@ extern char *verboseUsage; void usage(int verbose); #endif /* __L2L_HELP_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/image.c b/reactos/tools/log2lines/image.c index 555196ec856..f94abcb59c8 100644 --- a/reactos/tools/log2lines/image.c +++ b/reactos/tools/log2lines/image.c @@ -4,6 +4,7 @@ * * - Image functions for symbol info */ +#include #include #include #include diff --git a/reactos/tools/log2lines/image.h b/reactos/tools/log2lines/image.h index 6c510a09748..acc6712e695 100644 --- a/reactos/tools/log2lines/image.h +++ b/reactos/tools/log2lines/image.h @@ -20,3 +20,5 @@ int get_ImageBase(char *fname, size_t *ImageBase); #endif /* __L2L_IMAGE_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/list.c b/reactos/tools/log2lines/list.c index 2fa306f4a14..4491d079252 100644 --- a/reactos/tools/log2lines/list.c +++ b/reactos/tools/log2lines/list.c @@ -66,6 +66,19 @@ entry_insert(PLIST list, PLIST_MEMBER pentry) return pentry; } +void list_clear(PLIST list) +{ + PLIST_MEMBER pentry = list->phead; + PLIST_MEMBER pnext; + while (pentry) + { + pnext = pentry->pnext; + entry_delete(pentry); + pentry = pnext; + } + list->phead = list->ptail = NULL; +} + #if 0 LIST_MEMBER * entry_remove(LIST *list, LIST_MEMBER *pentry) diff --git a/reactos/tools/log2lines/list.h b/reactos/tools/log2lines/list.h index ce0934f794e..e23fbc48cbe 100644 --- a/reactos/tools/log2lines/list.h +++ b/reactos/tools/log2lines/list.h @@ -12,7 +12,6 @@ typedef struct entry_struct typedef struct list_struct { - off_t st_size; PLIST_MEMBER phead; PLIST_MEMBER ptail; } LIST,*PLIST; @@ -22,5 +21,8 @@ PLIST_MEMBER entry_delete(PLIST_MEMBER pentry); PLIST_MEMBER entry_insert(PLIST list, PLIST_MEMBER pentry); PLIST_MEMBER cache_entry_create(char *Line); PLIST_MEMBER sources_entry_create(PLIST list, char *path, char *prefix); +void list_clear(PLIST list); #endif /* __L2L_LIST_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/log2lines.c b/reactos/tools/log2lines/log2lines.c index 03c49445785..1ad94f2fb0e 100644 --- a/reactos/tools/log2lines/log2lines.c +++ b/reactos/tools/log2lines/log2lines.c @@ -2,7 +2,7 @@ * ReactOS log2lines * Written by Jan Roeloffzen * - * - Initialization and main loop + * - Initialization, translation and main loop */ #include @@ -13,17 +13,18 @@ #include "util.h" #include "version.h" #include "compat.h" -#include "config.h" -#include "list.h" #include "options.h" #include "image.h" #include "cache.h" #include "log2lines.h" #include "help.h" +#include "cmd.h" static FILE *stdIn = NULL; static FILE *stdOut = NULL; +static const char *kdbg_prompt = KDBG_PROMPT; +static const char *kdbg_cont = KDBG_CONT; LIST sources; LINEINFO lastLine; @@ -65,6 +66,8 @@ log_file(FILE *outFile, char *fileName, int line) i++; } fclose(src); + if ( i < min ) + log(outFile, "| S--- source has only %d lines! (check source/revision)\n", i); } else l2l_dbg(1, "Can't open: %s (check " SOURCES_ENV ")\n", s); @@ -332,7 +335,7 @@ translate_line(FILE *outFile, char *Line, char *path, char *LineOut) /* Strip all lines added by this tool: */ char buf[NAMESIZE]; if (sscanf(s, "| %s", buf) == 1) - if (buf[0] == '0' || strcmp(buf, "----") == 0 || strcmp(buf, "R---") == 0 || atoi(buf)) + if (buf[0] == '0' || strcmp(buf, "----") == 0 || strcmp(buf, "L2L-") == 0 || strcmp(buf, "S---") == 0 || strcmp(buf, "R---") == 0 || atoi(buf)) res = 0; } @@ -410,6 +413,9 @@ translate_files(FILE *inFile, FILE *outFile) int c; unsigned char ch; int i = 0; + const char *pc = kdbg_cont; + const char *p = kdbg_prompt; + const char *p_eos = p + sizeof(KDBG_PROMPT) - 1; //end of string pos if (Line && path && LineOut) { @@ -418,23 +424,53 @@ translate_files(FILE *inFile, FILE *outFile) { while ((c = fgetc(inFile)) != EOF) { + if (opt_quit)break; + ch = (unsigned char)c; if (!opt_raw) { switch (ch) { case '\n': - translate_line(outFile, Line, path, LineOut); + if ( strncmp(Line, KDBG_DISCARD, sizeof(KDBG_DISCARD)-1) == 0 ) + { + memset(Line, '\0', LINESIZE); // flushed + } + else + { + Line[1] = handle_escape_cmd(outFile, Line, path, LineOut); + if (Line[1] != KDBG_ESC_CHAR) + { + if (p == p_eos) + { + //kdbg prompt, so already echoed char by char + memset(Line, '\0', LINESIZE); + translate_char(c, outFile); + } + else + { + translate_line(outFile, Line, path, LineOut); + translate_char(c, outFile); + report(outFile); + } + } + } i = 0; - translate_char(c, outFile); - report(outFile); + p = kdbg_prompt; + pc = kdbg_cont; break; case '<': i = 0; Line[i++] = ch; break; case '>': - if (i) + if (ch == *p) + { + p = p_eos; + translate_line(outFile, Line, path, LineOut); + } + + if (p != p_eos) { if (i < LINESIZE) { @@ -452,21 +488,27 @@ translate_files(FILE *inFile, FILE *outFile) i = 0; break; default: - if (i) + if (ch == *p)p++; + if (ch == *pc)pc++; + if (i < LINESIZE) { - if (i < LINESIZE) + Line[i++] = ch; + if (p == p_eos) { - Line[i++] = ch; + translate_char(c, outFile); } - else + else if (!*pc) { translate_line(outFile, Line, path, LineOut); - translate_char(c, outFile); i = 0; } } else + { + translate_line(outFile, Line, path, LineOut); translate_char(c, outFile); + i = 0; + } } } else @@ -477,6 +519,8 @@ translate_files(FILE *inFile, FILE *outFile) { // Line by line, slightly faster but less interactive while (fgets(Line, LINESIZE, inFile) != NULL) { + if (opt_quit)break; + if (!opt_raw) { translate_line(outFile, Line, path, LineOut); @@ -552,26 +596,8 @@ main(int argc, const char **argv) read_cache(); l2l_dbg(4, "Cache read complete\n"); - if (*opt_logFile) - { - logFile = fopen(opt_logFile, "a"); - if (logFile) - { - // disable buffering so fflush is not needed - if (!opt_buffered) - { - l2l_dbg(1, "Disabling log buffering on %s\n", opt_logFile); - setbuf(logFile, NULL); - } - else - l2l_dbg(1, "Enabling log buffering on %s\n", opt_logFile); - } - else - { - l2l_dbg(0, "Could not open logfile %s (%s)\n", opt_logFile, strerror(errno)); - return 2; - } - } + if (set_LogFile(logFile)) + return 2; l2l_dbg(4, "opt_logFile processed\n"); if (opt_Pipe) @@ -584,8 +610,6 @@ main(int argc, const char **argv) l2l_dbg(0, "Could not popen '%s' (%s)\n", opt_Pipe, strerror(errno)); free(opt_Pipe); opt_Pipe = NULL; } - - free(opt_Pipe); opt_Pipe = NULL; } l2l_dbg(4, "opt_Pipe processed\n"); diff --git a/reactos/tools/log2lines/log2lines.mak b/reactos/tools/log2lines/log2lines.mak index 5e4e14c31ae..358fd83d4e8 100644 --- a/reactos/tools/log2lines/log2lines.mak +++ b/reactos/tools/log2lines/log2lines.mak @@ -30,6 +30,7 @@ LOG2LINES_SOURCES = \ $(LOG2LINES_BASE_)image.c \ $(LOG2LINES_BASE_)stat.c \ $(LOG2LINES_BASE_)revision.c \ + $(LOG2LINES_BASE_)cmd.c \ $(LOG2LINES_BASE_)log2lines.c \ $(RSYM_BASE_)rsym_common.c @@ -83,6 +84,10 @@ $(LOG2LINES_INT_)revision.o: $(LOG2LINES_BASE_)revision.c | $(LOG2LINES_INT) $(ECHO_HOSTCC) ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@ +$(LOG2LINES_INT_)cmd.o: $(LOG2LINES_BASE_)cmd.c | $(LOG2LINES_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@ + .PHONY: log2lines_clean log2lines_clean: -@$(rm) $(LOG2LINES_TARGET) $(LOG2LINES_OBJECTS) 2>$(NUL) diff --git a/reactos/tools/log2lines/options.c b/reactos/tools/log2lines/options.c index 1ed55edea7f..88d7f4b9e37 100644 --- a/reactos/tools/log2lines/options.c +++ b/reactos/tools/log2lines/options.c @@ -13,6 +13,7 @@ #include "compat.h" #include "config.h" #include "help.h" +#include "log2lines.h" #include "options.h" char *optchars = "bcd:fFhl:mMP:rR:sS:tTuUvz:"; @@ -25,6 +26,8 @@ int opt_console = 0; // -c int opt_mark = 0; // -m int opt_Mark = 0; // -M char *opt_Pipe = NULL; // -P +int opt_quit = 0; // -q (cli only) +int opt_cli = 0; // (cli internal) int opt_raw = 0; // -r int opt_stats = 0; // -s int opt_Source = 0; // -S [+][,] @@ -46,29 +49,45 @@ int optionInit(int argc, const char **argv) char *s; strcpy(opt_dir, ""); + strcpy(opt_logFile, ""); + strcpy(opt_7z, CMD_7Z); strcpy(opt_SourcesPath, ""); if ((s = getenv(SOURCES_ENV))) strcpy(opt_SourcesPath, s); + revinfo.rev = getRevision(NULL, 1); + revinfo.range = DEF_RANGE; + revinfo.buildrev = getTBRevision(opt_dir); + l2l_dbg(1, "Trunk build revision: %d\n", revinfo.buildrev); strcpy(opt_scanned, ""); for (i = 1; i < argc; i++) { - if (strcmp(argv[i],"-P")==0) + if ((argv[i][0] == '-') && (i+1 < argc)) { - //Because its argument can contain spaces we cant use getopt(), a known bug: - if (i+1 < argc) + //Because these arguments can contain spaces we cant use getopt(), a known bug: + switch (argv[i][1]) { + case 'd': + strcpy(opt_dir, argv[i+1]); + break; + case 'l': + strcpy(opt_logFile, argv[i+1]); + break; + case 'P': free(opt_Pipe); opt_Pipe = malloc(LINESIZE); strcpy(opt_Pipe, argv[i+1]); + break; + case 'z': + strcpy(opt_7z, argv[i+1]); + break; } } strcat(opt_scanned, argv[i]); strcat(opt_scanned, " "); } + l2l_dbg(4,"opt_scanned=[%s]\n",opt_scanned); - strcpy(opt_logFile, ""); - strcpy(opt_7z, CMD_7Z); return 0; } @@ -91,7 +110,7 @@ int optionParse(int argc, const char **argv) break; case 'd': optCount++; - strcpy(opt_dir, optarg); + //just count, see optionInit() break; case 'f': opt_force++; @@ -107,7 +126,7 @@ int optionParse(int argc, const char **argv) break; case 'l': optCount++; - strcpy(opt_logFile, optarg); + //just count, see optionInit() break; case 'm': opt_mark++; @@ -120,7 +139,7 @@ int optionParse(int argc, const char **argv) break; case 'P': optCount++; - //just count, see above + //just count, see optionInit() break; case 'R': optCount++; @@ -137,6 +156,12 @@ int optionParse(int argc, const char **argv) if (i == 1) sscanf(optarg, "%*d,%s", opt_SourcesPath); l2l_dbg(3, "Sources option parse result: %d+%d,\"%s\"\n", opt_Source, opt_SrcPlus, opt_SourcesPath); + if (opt_Source) + { + /* need to retranslate for source info: */ + opt_undo++; + opt_redo++; + } break; case 't': opt_twice++; @@ -166,16 +191,15 @@ int optionParse(int argc, const char **argv) } optCount++; } + if(opt_console) + { + l2l_dbg(2, "Note: use 's' command in console mode. Statistics option disabled\n"); + opt_stats = 0; + } if (opt_SourcesPath[0]) { strcat(opt_SourcesPath, PATH_STR); } - if (opt_Source) - { - /* need to retranslate for source info: */ - opt_undo++; - opt_redo++; - } if (!opt_dir[0]) { strcpy(opt_dir, opt_SourcesPath); diff --git a/reactos/tools/log2lines/options.h b/reactos/tools/log2lines/options.h index 77ae8a55bfa..8051eaa9880 100644 --- a/reactos/tools/log2lines/options.h +++ b/reactos/tools/log2lines/options.h @@ -18,6 +18,8 @@ extern int opt_console; // -c extern int opt_mark; // -m extern int opt_Mark; // -M extern char *opt_Pipe; // -P +extern int opt_quit; // -q (cli only) +extern int opt_cli; // (cli internal) extern int opt_raw; // -r extern int opt_stats; // -s extern int opt_Source; // -S [+][,] @@ -38,3 +40,5 @@ int optionInit(int argc, const char **argv); int optionParse(int argc, const char **argv); #endif /* __L2L_OPTIONS_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/revision.c b/reactos/tools/log2lines/revision.c index 74a03528686..5a05bc66ef3 100644 --- a/reactos/tools/log2lines/revision.c +++ b/reactos/tools/log2lines/revision.c @@ -13,7 +13,6 @@ #include "compat.h" #include "util.h" #include "options.h" -#include "revision.h" #include "log2lines.h" static void @@ -195,7 +194,7 @@ regscan(FILE *outFile) char path[MAX_PATH]; char path2[MAX_PATH]; int wflag = 0; - log(outFile, "\nRegression candidates:\n"); + clilog(outFile, "Regression candidates:\n"); while (( pos = findRev(finx, &r) )) { if (r < (revinfo.buildrev - revinfo.range)) @@ -216,11 +215,11 @@ regscan(FILE *outFile) { if (wflag == 1) { - log(outFile, "%sChanged paths:\n", line); + clilog(outFile, "%sChanged paths:\n", line); summ.regfound++; wflag = 2; } - log(outFile, "%s", line2); + clilog(outFile, "%s", line2); } } else @@ -229,11 +228,11 @@ regscan(FILE *outFile) if (wflag == 2) { int i = 0; - log(outFile, "\n"); + clilog(outFile, "\n"); while (fgets(line2, LINESIZE, flog)) { i++; - log(outFile, "%s", line2); + clilog(outFile, "%s", line2); if (strncmp(LOGBOTTOM, line2, sizeof(LOGBOTTOM) - 1) == 0) break; } diff --git a/reactos/tools/log2lines/revision.h b/reactos/tools/log2lines/revision.h index 145052e0c53..7a43be9b77a 100644 --- a/reactos/tools/log2lines/revision.h +++ b/reactos/tools/log2lines/revision.h @@ -26,3 +26,5 @@ int regscan(FILE *outFile); int updateSvnlog(void); #endif /* __L2L_REVISION_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/stat.c b/reactos/tools/log2lines/stat.c index 79870857f74..6f8e5fe83c2 100644 --- a/reactos/tools/log2lines/stat.c +++ b/reactos/tools/log2lines/stat.c @@ -10,7 +10,7 @@ #include "version.h" #include "options.h" -#include "stat.h" +#include "util.h" #include "log2lines.h" void @@ -18,22 +18,22 @@ stat_print(FILE *outFile, PSUMM psumm) { if (outFile) { - fprintf(outFile, "\n*** LOG2LINES SUMMARY ***\n"); - fprintf(outFile, "Translated: %d\n", psumm->translated); - fprintf(outFile, "Reverted: %d\n", psumm->undo); - fprintf(outFile, "Retranslated: %d\n", psumm->redo); - fprintf(outFile, "Skipped: %d\n", psumm->skipped); - fprintf(outFile, "Differ: %d\n", psumm->diff); - fprintf(outFile, "Differ (function/source): %d\n", psumm->majordiff); - fprintf(outFile, "Revision conflicts: %d\n", psumm->revconflicts); - fprintf(outFile, "Regression candidates: %d\n", psumm->regfound); - fprintf(outFile, "Offset error: %d\n", psumm->offset_errors); - fprintf(outFile, "Total: %d\n", psumm->total); - fprintf(outFile, "-------------------------------\n"); - fprintf(outFile, "Log2lines version: " LOG2LINES_VERSION "\n"); - fprintf(outFile, "Directory: %s\n", opt_dir); - fprintf(outFile, "Passed options: %s\n", opt_scanned); - fprintf(outFile, "-------------------------------\n"); + clilog(outFile, "*** LOG2LINES SUMMARY ***\n"); + clilog(outFile, "Translated: %d\n", psumm->translated); + clilog(outFile, "Reverted: %d\n", psumm->undo); + clilog(outFile, "Retranslated: %d\n", psumm->redo); + clilog(outFile, "Skipped: %d\n", psumm->skipped); + clilog(outFile, "Differ: %d\n", psumm->diff); + clilog(outFile, "Differ (function/source): %d\n", psumm->majordiff); + clilog(outFile, "Revision conflicts: %d\n", psumm->revconflicts); + clilog(outFile, "Regression candidates: %d\n", psumm->regfound); + clilog(outFile, "Offset error: %d\n", psumm->offset_errors); + clilog(outFile, "Total: %d\n", psumm->total); + clilog(outFile, "-------------------------------\n"); + clilog(outFile, "Log2lines version: " LOG2LINES_VERSION "\n"); + clilog(outFile, "Directory: %s\n", opt_dir); + clilog(outFile, "Passed options: %s\n", opt_scanned); + clilog(outFile, "-------------------------------\n"); } } diff --git a/reactos/tools/log2lines/stat.h b/reactos/tools/log2lines/stat.h index df0990a872f..6aced4766cd 100644 --- a/reactos/tools/log2lines/stat.h +++ b/reactos/tools/log2lines/stat.h @@ -28,3 +28,5 @@ void stat_print(FILE *outFile, PSUMM psumm); void stat_clear(PSUMM psumm); #endif /* __L2L_STAT_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/util.c b/reactos/tools/log2lines/util.c index a60a7a74a80..50887e3c456 100644 --- a/reactos/tools/log2lines/util.c +++ b/reactos/tools/log2lines/util.c @@ -15,6 +15,39 @@ #include "util.h" #include "options.h" +int +set_LogFile(FILE *logFile) +{ + if (*opt_logFile) + { + if (logFile) + fclose(logFile); + logFile = NULL; + + if (strcmp(opt_logFile,"none") == 0) + return 0; //just close + + logFile = fopen(opt_logFile, "a"); + if (logFile) + { + // disable buffering so fflush is not needed + if (!opt_buffered) + { + l2l_dbg(1, "Disabling log buffering on %s\n", opt_logFile); + setbuf(logFile, NULL); + } + else + l2l_dbg(1, "Enabling log buffering on %s\n", opt_logFile); + } + else + { + l2l_dbg(0, "Could not open logfile %s (%s)\n", opt_logFile, strerror(errno)); + return 2; + } + } + return 0; +} + int file_exists(char *name) { diff --git a/reactos/tools/log2lines/util.h b/reactos/tools/log2lines/util.h index 2facfb5c3c9..b4736f598f0 100644 --- a/reactos/tools/log2lines/util.h +++ b/reactos/tools/log2lines/util.h @@ -8,6 +8,9 @@ #ifndef __L2L_UTIL_H__ #define __L2L_UTIL_H__ +#include + +#include "cmd.h" #define log(outFile, fmt, ...) \ { \ @@ -16,6 +19,19 @@ fprintf(logFile, fmt, ##__VA_ARGS__); \ } +#define esclog(outFile, fmt, ...) \ + { \ + log(outFile, KDBG_ESC_RESP fmt, ##__VA_ARGS__); \ + } + +#define clilog(outFile, fmt, ...) \ + { \ + if (opt_cli) \ + esclog(outFile, fmt, ##__VA_ARGS__) \ + else \ + log(outFile, fmt, ##__VA_ARGS__); \ + } + #define l2l_dbg(level, ...) \ { \ if (opt_verbose >= level) \ @@ -29,5 +45,8 @@ const char *getFmt(const char *a); long my_atoi(const char *a); int isOffset(const char *a); int copy_file(char *src, char *dst); +int set_LogFile(FILE *logFile); #endif /* __L2L_UTIL_H__ */ + +/* EOF */ diff --git a/reactos/tools/log2lines/version.h b/reactos/tools/log2lines/version.h index 6f257ce3639..9a42e4904a3 100644 --- a/reactos/tools/log2lines/version.h +++ b/reactos/tools/log2lines/version.h @@ -8,6 +8,8 @@ #ifndef __L2L_VERSION_H__ #define __L2L_VERSION_H__ -#define LOG2LINES_VERSION "1.12b" +#define LOG2LINES_VERSION "2.1" #endif /* __L2L_VERSION_H__ */ + +/* EOF */ From b028cb1e4e94aceeb35a96892984882c244f67a6 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 10 Feb 2010 12:21:23 +0000 Subject: [PATCH 67/97] [usb/usbehci] - Define Device and Configuration Descriptors for RootHub20. - Queue all USB_SUBMIT_URBs and create a separate thread to handle them. - For PNP START_DEVICE, Create the internal RootHub usb device and register usb hub device interface. - Fill in direct call interface for USB_BUS_INTERFACE_USBDI_V2 and USB_BUS_INTERFACE_HUB_V5. - Implement Direct Call Interface function GetExtendedHubInformation. - Remove duplicate structures that are already defined in USB Headers. Some reorganization. svn path=/trunk/; revision=45552 --- reactos/drivers/usb/usbehci/pdo.c | 389 ++++++++++++++------- reactos/drivers/usb/usbehci/usbehci.h | 70 ++-- reactos/drivers/usb/usbehci/usbehci.rbuild | 1 + reactos/drivers/usb/usbehci/usbiffn.c | 260 ++++++++++++++ reactos/drivers/usb/usbehci/usbiffn.h | 200 +++++++++++ 5 files changed, 757 insertions(+), 163 deletions(-) create mode 100644 reactos/drivers/usb/usbehci/usbiffn.c create mode 100644 reactos/drivers/usb/usbehci/usbiffn.h diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 8334a2d1977..fd176f7d65e 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -7,15 +7,108 @@ * Michael Martin */ -/* INCLUDES *******************************************************************/ #define INITGUID +#define NDEBUG + #include "usbehci.h" #include +#include "usbiffn.h" #include - -#define NDEBUG #include +/* Lifted from Linux with slight changes */ +const UCHAR ROOTHUB2_DEVICE_DESCRIPTOR [] = +{ + 0x12, /* bLength; */ + USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType; Device */ + 0x00, 0x20, /* bcdUSB; v1.1 */ + USB_DEVICE_CLASS_HUB, /* bDeviceClass; HUB_CLASSCODE */ + 0x01, /* bDeviceSubClass; */ + 0x00, /* bDeviceProtocol; [ low/full speeds only ] */ + 0x08, /* bMaxPacketSize0; 8 Bytes */ + /* Fill Vendor and Product in when init root hub */ + 0x00, 0x00, /* idVendor; */ + 0x00, 0x00, /* idProduct; */ + 0x00, 0x00, /* bcdDevice */ + 0x00, /* iManufacturer; */ + 0x00, /* iProduct; */ + 0x00, /* iSerialNumber; */ + 0x01 /* bNumConfigurations; */ + +}; + +const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = +{ + /* one configuration */ + 0x09, /* bLength; */ + 0x02, /* bDescriptorType; Configuration */ + 0x19, 0x00, /* wTotalLength; */ + 0x01, /* bNumInterfaces; (1) */ + 0x23, /* bConfigurationValue; */ + 0x00, /* iConfiguration; */ + 0x40, /* bmAttributes; + Bit 7: must be set, + 6: Self-powered, + 5: Remote wakeup, + 4..0: reserved */ + 0x00, /* MaxPower; */ + + /* one interface */ + 0x09, /* bLength: Interface; */ + 0x04, /* bDescriptorType; Interface */ + 0x00, /* bInterfaceNumber; */ + 0x00, /* bAlternateSetting; */ + 0x01, /* bNumEndpoints; */ + 0x09, /* bInterfaceClass; HUB_CLASSCODE */ + 0x01, /* bInterfaceSubClass; */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface; */ + + /* one endpoint (status change endpoint) */ + 0x07, /* bLength; */ + 0x05, /* bDescriptorType; Endpoint */ + 0x81, /* bEndpointAddress; IN Endpoint 1 */ + 0x03, /* bmAttributes; Interrupt */ + 0x08, 0x00, /* wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ + 0xFF /* bInterval; (255ms -- usb 2.0 spec) */ +}; + +/* FIXME: Do something better */ +VOID NTAPI +UrbWorkerThread(PVOID Context) +{ + PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Context; + + while (PdoDeviceExtension->HaltUrbHandling == FALSE) + { + CompletePendingURBRequest(PdoDeviceExtension); + } + DPRINT1("Thread terminated\n"); +} + +/* FIXME: Do something better */ +PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) +{ + PUSB_DEVICE UsbDevicePointer = NULL; + UsbDevicePointer = ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE)); + if (!UsbDevicePointer) + { + DPRINT1("Out of memory\n"); + return NULL; + } + + if ((Hub) && (!Parent)) + { + DPRINT1("This is the root hub\n"); + } + + UsbDevicePointer->Address = DeviceNumber; + UsbDevicePointer->Port = Port; + UsbDevicePointer->ParentDevice = Parent; + + return UsbDevicePointer; +} + NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -24,125 +117,94 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) PIO_STACK_LOCATION Stack = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; ULONG_PTR Information = 0; - DPRINT("PdoDispatchInternalDeviceControl\n"); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE); + Stack = IoGetCurrentIrpStackLocation(Irp); - DPRINT("IoControlCode %x\n", Stack->Parameters.DeviceIoControl.IoControlCode); + switch(Stack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_INTERNAL_USB_SUBMIT_URB: { URB *Urb; - DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB\n"); - DPRINT("Stack->Parameters.DeviceIoControl.InputBufferLength %d\n", - Stack->Parameters.DeviceIoControl.InputBufferLength); - DPRINT("Stack->Parameters.Others.Argument1 %x\n", Stack->Parameters.Others.Argument1); - Urb = (PURB) Stack->Parameters.Others.Argument1; - DPRINT("Header Size %d\n", Urb->UrbHeader.Length); - DPRINT("Header Type %d\n", Urb->UrbHeader.Function); - DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index); + DPRINT("Header Length %d\n", Urb->UrbHeader.Length); + DPRINT("Header Function %d\n", Urb->UrbHeader.Function); - /* Check the type */ - switch(Urb->UrbHeader.Function) - { - case URB_FUNCTION_SELECT_CONFIGURATION: - { - DPRINT1("URB_FUNCTION_SELECT_CONFIGURATION\n"); - break; - } - case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: - { - URB *Urb; - DPRINT1("URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n"); - Urb = (PURB) Stack->Parameters.Others.Argument1; - Urb->UrbHeader.Status = 0; - - DPRINT1("Irp->CancelRoutine %x\n",Irp->CancelRoutine); - QueueRequest(FdoDeviceExtension, Irp); - - Information = 0; - - IoMarkIrpPending(Irp); - Status = STATUS_PENDING; - - break; - } - /* FIXME: Handle all other Functions */ - default: - DPRINT1("Not handled yet!\n"); - } + /* Queue all request for now, kernel thread will complete them */ + QueueURBRequest(PdoDeviceExtension, Irp); + Information = 0; + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; break; } case IOCTL_INTERNAL_USB_CYCLE_PORT: { - DPRINT("IOCTL_INTERNAL_USB_CYCLE_PORT\n"); + DPRINT1("IOCTL_INTERNAL_USB_CYCLE_PORT\n"); break; } case IOCTL_INTERNAL_USB_ENABLE_PORT: { - DPRINT("IOCTL_INTERNAL_USB_ENABLE_PORT\n"); + DPRINT1("IOCTL_INTERNAL_USB_ENABLE_PORT\n"); break; } case IOCTL_INTERNAL_USB_GET_BUS_INFO: { - DPRINT("IOCTL_INTERNAL_USB_GET_BUS_INFO\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_BUS_INFO\n"); break; } case IOCTL_INTERNAL_USB_GET_BUSGUID_INFO: { - DPRINT("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n"); break; } case IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME: { - DPRINT("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n"); break; } case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE: { - DPRINT("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n"); break; } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { - DPRINT("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n"); break; } case IOCTL_INTERNAL_USB_GET_HUB_NAME: { - DPRINT("IOCTL_INTERNAL_USB_GET_HUB_NAME\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_NAME\n"); break; } case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO: { - DPRINT("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n"); break; } case IOCTL_INTERNAL_USB_GET_PORT_STATUS: { - DPRINT("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n"); break; } case IOCTL_INTERNAL_USB_RESET_PORT: { - DPRINT("IOCTL_INTERNAL_USB_RESET_PORT\n"); + DPRINT1("IOCTL_INTERNAL_USB_RESET_PORT\n"); break; } case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO: { - DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); - /* This is document as Argument1 = PDO and Argument2 = FDO. - Its actually reversed, the FDO goes in Argument1 and PDO goes in Argument2 */ + DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); + if (Stack->Parameters.Others.Argument1) - Stack->Parameters.Others.Argument1 = FdoDeviceExtension->DeviceObject; + *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; if (Stack->Parameters.Others.Argument2) - Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo; + *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDevice(FdoDeviceExtension->DeviceObject); Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_SUCCESS; @@ -151,7 +213,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: { - DPRINT("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); + DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); break; } default: @@ -162,6 +224,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } Irp->IoStatus.Information = Information; + if (Status != STATUS_PENDING) IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -171,8 +234,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) NTSTATUS PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) { - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PFDO_DEVICE_EXTENSION FdoDeviceExtension; WCHAR Buffer[256]; ULONG Index = 0; ULONG IdType; @@ -181,25 +242,18 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) NTSTATUS Status; IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; - - /* FIXME: Read values from registry */ switch (IdType) { case BusQueryDeviceID: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n"); RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB20"); break; } case BusQueryHardwareIDs: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n"); - Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1; - Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265") + 1; + Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1; Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1; Buffer[Index] = UNICODE_NULL; @@ -209,24 +263,12 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) } case BusQueryCompatibleIDs: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n"); - /* We have none */ + /* We have none */ return STATUS_SUCCESS; - break; } case BusQueryInstanceID: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n"); - - /* - Do we need to implement this? - At one point I hade DeviceCapabilities->UniqueID set to TRUE. - And caused usbhub to fail attaching - to the PDO. Setting UniqueID to FALSE, it works - */ - return STATUS_SUCCESS; - break; } default: { @@ -247,18 +289,15 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) NTSTATUS PdoQueryDeviceRelations(PDEVICE_OBJECT DeviceObject, PDEVICE_RELATIONS* pDeviceRelations) { - PFDO_DEVICE_EXTENSION DeviceExtension; PDEVICE_RELATIONS DeviceRelations; - DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); if (!DeviceRelations) return STATUS_INSUFFICIENT_RESOURCES; - ObReferenceObject(DeviceObject); DeviceRelations->Count = 1; DeviceRelations->Objects[0] = DeviceObject; + ObReferenceObject(DeviceObject); *pDeviceRelations = DeviceRelations; return STATUS_SUCCESS; @@ -271,8 +310,8 @@ PdoDispatchPnp( { ULONG MinorFunction; PIO_STACK_LOCATION Stack; - ULONG_PTR Information = 0; - NTSTATUS Status; + ULONG_PTR Information = Irp->IoStatus.Information; + NTSTATUS Status = Irp->IoStatus.Status; Stack = IoGetCurrentIrpStackLocation(Irp); MinorFunction = Stack->MinorFunction; @@ -284,17 +323,70 @@ PdoDispatchPnp( case IRP_MN_CANCEL_REMOVE_DEVICE: case IRP_MN_STOP_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: + case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_QUERY_DEVICE_TEXT: case IRP_MN_SURPRISE_REMOVAL: + case IRP_MN_QUERY_RESOURCES: + case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: { - Information = Irp->IoStatus.Information; Status = STATUS_SUCCESS; break; } case IRP_MN_START_DEVICE: { - DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n"); + PUSB_DEVICE RootHubDevice; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + UNICODE_STRING InterfaceSymLinkName; + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + + /* Create the root hub */ + RootHubDevice = InternalCreateUsbDevice(0, 0, NULL, TRUE); + + RootHubDevice->Address = 1; + RootHubDevice->Port = 0; + + RtlCopyMemory(&RootHubDevice->DeviceDescriptor, + ROOTHUB2_DEVICE_DESCRIPTOR, + sizeof(ROOTHUB2_DEVICE_DESCRIPTOR)); + + RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; + RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; + + RtlCopyMemory(&RootHubDevice->ConfigurationDescriptor, + ROOTHUB2_CONFIGURATION_DESCRIPTOR, + sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR)); + + PdoDeviceExtension->UsbDevices[0] = RootHubDevice; + + /* Create a thread to handle the URB's */ + Status = PsCreateSystemThread(&PdoDeviceExtension->ThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + NULL, + UrbWorkerThread, + (PVOID)PdoDeviceExtension); + + if (!NT_SUCCESS(Status)) + DPRINT1("Failed Thread Creation with Status: %x\n", Status); + + Status = IoRegisterDeviceInterface(DeviceObject, &GUID_DEVINTERFACE_USB_HUB, NULL, &InterfaceSymLinkName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to register interface\n"); + } + else + { + Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); + DPRINT1("Set interface state %x\n", Status); + } + + Status = STATUS_SUCCESS; break; } @@ -305,16 +397,17 @@ PdoDispatchPnp( case TargetDeviceRelation: { PDEVICE_RELATIONS DeviceRelations = NULL; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n"); Status = PdoQueryDeviceRelations(DeviceObject, &DeviceRelations); Information = (ULONG_PTR)DeviceRelations; break; } + case BusRelations: + case RemovalRelations: + case EjectionRelations: default: { DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unhandled type 0x%lx\n", Stack->Parameters.QueryDeviceRelations.Type); - //ASSERT(FALSE); Status = STATUS_NOT_SUPPORTED; break; } @@ -325,17 +418,20 @@ PdoDispatchPnp( { PDEVICE_CAPABILITIES DeviceCapabilities; ULONG i; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n"); + DeviceCapabilities = (PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities; - /* FIXME: capabilities can change with connected device */ + DeviceCapabilities->LockSupported = FALSE; DeviceCapabilities->EjectSupported = FALSE; DeviceCapabilities->Removable = FALSE; DeviceCapabilities->DockDevice = FALSE; - DeviceCapabilities->UniqueID = FALSE;//TRUE; + DeviceCapabilities->UniqueID = FALSE; DeviceCapabilities->SilentInstall = FALSE; - DeviceCapabilities->RawDeviceOK = TRUE; + DeviceCapabilities->RawDeviceOK = FALSE; DeviceCapabilities->SurpriseRemovalOK = FALSE; + DeviceCapabilities->Address = 0; + DeviceCapabilities->UINumber = 0; + DeviceCapabilities->DeviceD2 = 1; /* FIXME */ DeviceCapabilities->HardwareDisabled = FALSE; @@ -343,47 +439,101 @@ PdoDispatchPnp( DeviceCapabilities->DeviceState[0] = PowerDeviceD0; for (i = 0; i < PowerSystemMaximum; i++) DeviceCapabilities->DeviceState[i] = PowerDeviceD3; - //DeviceCapabilities->DeviceWake = PowerDeviceUndefined; + DeviceCapabilities->DeviceWake = 0; DeviceCapabilities->D1Latency = 0; DeviceCapabilities->D2Latency = 0; DeviceCapabilities->D3Latency = 0; + Information = 0; Status = STATUS_SUCCESS; break; } - case IRP_MN_QUERY_RESOURCES: - { - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; - break; - } - case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: - { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; - break; - } /*case IRP_MN_QUERY_DEVICE_TEXT: { Status = STATUS_NOT_SUPPORTED; break; }*/ - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - { - DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; - break; - } + case IRP_MN_QUERY_ID: { Status = PdoQueryId(DeviceObject, Irp, &Information); break; } + case IRP_MN_QUERY_INTERFACE: + { + UNICODE_STRING GuidString; + PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub; + PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + + Status = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create string from GUID!\n"); + } + DPRINT1("Interface GUID requested %wZ\n", &GuidString); + DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); + DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); + + Status = STATUS_SUCCESS; + Information = 0; + + /* FIXME: Check the actual Guid */ + if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_USBDI_V2) && (Stack->Parameters.QueryInterface.Version == 2)) + { + InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; + InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2); + InterfaceDI->Version = 2; + InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceDI->GetUSBDIVersion = GetUSBDIVersion; + InterfaceDI->QueryBusTime = QueryBusTime; + InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb; + InterfaceDI->QueryBusInformation = QueryBusInformation; + InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed; + InterfaceDI->EnumLogEntry = EnumLogEntry; + } + /* FIXME: Check the actual Guid */ + else if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_HUB_V5) && + (Stack->Parameters.QueryInterface.Version == 5)) + { + InterfaceHub = (PUSB_BUS_INTERFACE_HUB_V5)Stack->Parameters.QueryInterface.Interface; + InterfaceHub->Version = 5; + InterfaceHub->Size = sizeof(USB_BUS_INTERFACE_HUB_V5); + InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceHub->CreateUsbDevice = CreateUsbDevice; + InterfaceHub->InitializeUsbDevice = InitializeUsbDevice; + InterfaceHub->GetUsbDescriptors = GetUsbDescriptors; + InterfaceHub->RemoveUsbDevice = RemoveUsbDevice; + InterfaceHub->RestoreUsbDevice = RestoreUsbDevice; + InterfaceHub->GetPortHackFlags = GetPortHackFlags; + InterfaceHub->QueryDeviceInformation = QueryDeviceInformation; + InterfaceHub->GetControllerInformation = GetControllerInformation; + InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend; + InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation; + InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName; + InterfaceHub->GetDeviceBusContext = GetDeviceBusContext; + InterfaceHub->Initialize20Hub = Initialize20Hub; + InterfaceHub->RootHubInitNotification = RootHubInitNotification; + InterfaceHub->FlushTransfers = FlushTransfers; + InterfaceHub->SetDeviceHandleData = SetDeviceHandleData; + } + else + { + DPRINT1("Not Supported\n"); + Status = STATUS_NOT_SUPPORTED; + } + break; + } case IRP_MN_QUERY_BUS_INFORMATION: { PPNP_BUS_INFORMATION BusInfo; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n"); BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION)); if (!BusInfo) @@ -407,9 +557,6 @@ PdoDispatchPnp( { /* We are the PDO. So ignore */ DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction); - - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; break; } } diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index ca3765b5f95..0ab5c20c3bc 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -176,24 +176,6 @@ typedef struct _EHCI_SETUP_FORMAT USHORT wLength; } EHCI_SETUP_FORMAT, *PEHCI_SETUP_FORMAT; -typedef struct _STANDARD_DEVICE_DESC -{ - UCHAR bLength; - UCHAR bDescriptorType; - USHORT bcdUSB; - UCHAR bDeviceClass; - UCHAR bDeviceSubClass; - UCHAR bDeviceProtocal; - UCHAR bMaxPacketSize; - USHORT idVendor; - USHORT idProduct; - USHORT bcdDevice; - UCHAR iManufacturer; - UCHAR iProduct; - UCHAR iSerialNumber; - UCHAR bNumConfigurations; -} STANDARD_DEVICE_DESC, *PSTANDARD_DEVICE_DESC; - typedef struct _STRING_DESCRIPTOR { UCHAR bLength; /* Size of this descriptor in bytes */ @@ -201,6 +183,17 @@ typedef struct _STRING_DESCRIPTOR UCHAR bString[0]; /* UNICODE encoded string */ } STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR; +typedef struct _USB_DEVICE +{ + UCHAR Address; + ULONG Port; + PVOID ParentDevice; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + USB_ENDPOINT_DESCRIPTOR EndPointDescriptor; +} USB_DEVICE, *PUSB_DEVICE; + /* USBCMD register 32 bits */ typedef struct _EHCI_USBCMD_CONTENT { @@ -292,7 +285,6 @@ typedef struct _EHCI_CAPS { UCHAR PortRoute [8]; } EHCI_CAPS, *PEHCI_CAPS; - typedef struct _COMMON_DEVICE_EXTENSION { BOOLEAN IsFdo; @@ -309,9 +301,7 @@ typedef struct _FDO_DEVICE_EXTENSION PDEVICE_OBJECT Pdo; ULONG DeviceState; - /* USB Specs says a max of 127 devices */ - ULONG ChildDeviceCount; - + PVOID RootHubDeviceHandle; PDMA_ADAPTER pDmaAdapter; ULONG Vector; @@ -323,10 +313,6 @@ typedef struct _FDO_DEVICE_EXTENSION KDPC DpcObject; KAFFINITY Affinity; - LIST_ENTRY IrpQueue; - KSPIN_LOCK IrpQueueLock; - PIRP CurrentIrp; - ULONG MapRegisters; ULONG BusNumber; @@ -354,7 +340,6 @@ typedef struct _FDO_DEVICE_EXTENSION PULONG ResourceBase; ULONG Size; - } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; typedef struct _PDO_DEVICE_EXTENSION @@ -362,16 +347,26 @@ typedef struct _PDO_DEVICE_EXTENSION COMMON_DEVICE_EXTENSION Common; PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT ControllerFdo; - + PUSB_DEVICE UsbDevices[127]; + LIST_ENTRY IrpQueue; + KSPIN_LOCK IrpQueueLock; + PIRP CurrentIrp; + HANDLE ThreadHandle; + ULONG ChildDeviceCount; + BOOLEAN HaltUrbHandling; } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; - typedef struct _WORKITEM_DATA { PIO_WORKITEM IoWorkItem; PFDO_DEVICE_EXTENSION FdoDeviceExtension; + PDEVICE_OBJECT PortDeviceObject; } WORKITEM_DATA, *PWORKITEM_DATA; + +VOID NTAPI +UrbWorkerThread(PVOID Context); + NTSTATUS NTAPI GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface); @@ -406,27 +401,18 @@ NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); BOOLEAN -GetDeviceDescriptor (PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index); +GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub); BOOLEAN GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index); VOID -CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension); +QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); VOID -QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); +CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension); VOID -QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); - -VOID -CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension); - -VOID -DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context); - -VOID -RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp); +URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp); #endif diff --git a/reactos/drivers/usb/usbehci/usbehci.rbuild b/reactos/drivers/usb/usbehci/usbehci.rbuild index c49c039e15a..85d1f1cb3b4 100644 --- a/reactos/drivers/usb/usbehci/usbehci.rbuild +++ b/reactos/drivers/usb/usbehci/usbehci.rbuild @@ -9,5 +9,6 @@ common.c misc.c irp.c + usbiffn.c urbreq.c diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c new file mode 100644 index 00000000000..bff3172634c --- /dev/null +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -0,0 +1,260 @@ +/* + * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/usb/usbehci/usbiffn.c + * PURPOSE: Direct Call Interface Functions. + * PROGRAMMERS: + * Michael Martin + */ + +/* usbbusif.h and hubbusif.h need to be imported */ +#include "usbehci.h" +#include "usbiffn.h" +#define NDEBUG +#include + +VOID +USB_BUSIFFN +InterfaceReference(PVOID BusContext) +{ + DPRINT1("InterfaceReference called\n"); +} + +VOID +USB_BUSIFFN +InterfaceDereference(PVOID BusContext) +{ + DPRINT1("InterfaceDereference called\n"); +} + +/* Bus Interface Hub V5 Functions */ + +NTSTATUS +USB_BUSIFFN +CreateUsbDevice(PVOID BusContext, + PUSB_DEVICE_HANDLE *NewDevice, + PUSB_DEVICE_HANDLE HubDeviceHandle, + USHORT PortStatus, USHORT PortNumber) +{ + DPRINT1("CreateUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) +{ + DPRINT1("InitializeUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetUsbDescriptors(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PUCHAR DeviceDescriptorBuffer, + PULONG DeviceDescriptorBufferLength, + PUCHAR ConfigurationBuffer, + PULONG ConfigDescriptorBufferLength) +{ + DPRINT1("GetUsbDescriptor called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) +{ + DPRINT1("RemoveUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) +{ + DPRINT1("RestoreUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetPortHackFlags(PVOID BusContext, PULONG Flags) +{ + DPRINT1("GetPortHackFlags called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +QueryDeviceInformation(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PVOID DeviceInformationBuffer, + ULONG DeviceInformationBufferLength, + PULONG LengthReturned) +{ + DPRINT1("QueryDeviceInformation called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetControllerInformation(PVOID BusContext, + PVOID ControllerInformationBuffer, + ULONG ControllerInformationBufferLength, + PULONG LengthReturned) +{ + DPRINT1("GetControllerInformation called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable) +{ + DPRINT1("ControllerSelectiveSuspend called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetExtendedHubInformation(PVOID BusContext, + PDEVICE_OBJECT HubPhysicalDeviceObject, + PVOID HubInformationBuffer, + ULONG HubInformationBufferLength, + PULONG LengthReturned) +{ + + PUSB_EXTHUB_INFORMATION_0 UsbExtHubInfo = HubInformationBuffer; + PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + LONG i; + + /* Set the default return value */ + *LengthReturned = 0; + /* Caller must have set InformationLevel to 0 */ + if (UsbExtHubInfo->InformationLevel != 0) + { + return STATUS_NOT_SUPPORTED; + } + + UsbExtHubInfo->NumberOfPorts = 8; + + for (i=0; i < UsbExtHubInfo->NumberOfPorts; i++) + { + UsbExtHubInfo->Port[i].PhysicalPortNumber = i + 1; + UsbExtHubInfo->Port[i].PortLabelNumber = FdoDeviceExntension->ECHICaps.HCSParams.PortCount; + UsbExtHubInfo->Port[i].VidOverride = 0; + UsbExtHubInfo->Port[i].PidOverride = 0; + UsbExtHubInfo->Port[i].PortAttributes = USB_PORTATTR_SHARED_USB2; + } + + *LengthReturned = FIELD_OFFSET(USB_EXTHUB_INFORMATION_0, Port[8]); + + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetRootHubSymbolicName(PVOID BusContext, + PVOID HubSymNameBuffer, + ULONG HubSymNameBufferLength, + PULONG HubSymNameActualLength) +{ + DPRINT1("GetRootHubSymbolicName called\n"); + return STATUS_SUCCESS; +} + +PVOID +USB_BUSIFFN +GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle) +{ + DPRINT1("GetDeviceBusContext called\n"); + return NULL; +} + +NTSTATUS +USB_BUSIFFN +Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount) +{ + DPRINT1("Initialize20Hub called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine) +{ + DPRINT1("RootHubInitNotification\n"); + return STATUS_SUCCESS; +} + +VOID +USB_BUSIFFN +FlushTransfers(PVOID BusContext, PVOID DeviceHandle) +{ + DPRINT1("FlushTransfers\n"); +} + +VOID +USB_BUSIFFN +SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo) +{ + DPRINT1("SetDeviceHandleData called\n"); +} + + +/* USB_BUS_INTERFACE_USBDI_V2 Functions */ + +NTSTATUS +USB_BUSIFFN +GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites) +{ + DPRINT1("GetUSBDIVersion called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +QueryBusTime(PVOID BusContext, PULONG CurrentFrame) +{ + DPRINT1("QueryBusTime called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +SubmitIsoOutUrb(PVOID BusContext, PURB Urb) +{ + DPRINT1("SubmitIsoOutUrb called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +QueryBusInformation(PVOID BusContext, + ULONG Level, + PVOID BusInformationBuffer, + PULONG BusInformationBufferLength, + PULONG BusInformationActualLength) +{ + DPRINT1("QueryBusInformation called\n"); + return STATUS_SUCCESS; +} + +BOOLEAN +USB_BUSIFFN +IsDeviceHighSpeed(PVOID BusCOntext) +{ + DPRINT1("IsDeviceHighSpeed called\n"); + return TRUE; +} + +NTSTATUS +USB_BUSIFFN +EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) +{ + DPRINT1("EnumLogEntry called\n"); + return STATUS_SUCCESS; +} + diff --git a/reactos/drivers/usb/usbehci/usbiffn.h b/reactos/drivers/usb/usbehci/usbiffn.h new file mode 100644 index 00000000000..988d2345b62 --- /dev/null +++ b/reactos/drivers/usb/usbehci/usbiffn.h @@ -0,0 +1,200 @@ +#ifndef __USBIFFN_H__ +#define __USBIFFN_H__ + +#define USB_BUSIFFN __stdcall +#include +#include +#include + +/* usbbusif.h and hubbusif.h need to be imported */ +typedef PVOID PUSB_DEVICE_HANDLE; + +typedef +VOID +USB_BUSIFFN +RH_INIT_CALLBACK (PVOID CallBackContext); + +typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK; + +typedef struct _USB_EXTPORT_INFORMATION_0 +{ + ULONG PhysicalPortNumber; + ULONG PortLabelNumber; + USHORT VidOverride; + USHORT PidOverride; + ULONG PortAttributes; +} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION; + +typedef struct _USB_EXTHUB_INFORMATION_0 +{ + ULONG InformationLevel; + ULONG NumberOfPorts; + USB_EXTPORT_INFORMATION_0 Port[255]; +} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0; + +typedef struct _USB_BUS_INTERFACE_USBDI_V2 +{ + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + + PVOID GetUSBDIVersion; + PVOID QueryBusTime; + PVOID SubmitIsoOutUrb; + PVOID QueryBusInformation; + PVOID IsDeviceHighSpeed; + PVOID EnumLogEntry; +} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2; + +typedef struct _USB_BUS_INTERFACE_HUB_V5 +{ + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + + PVOID CreateUsbDevice; + PVOID InitializeUsbDevice; + PVOID GetUsbDescriptors; + PVOID RemoveUsbDevice; + PVOID RestoreUsbDevice; + PVOID GetPortHackFlags; + PVOID QueryDeviceInformation; + PVOID GetControllerInformation; + PVOID ControllerSelectiveSuspend; + PVOID GetExtendedHubInformation; + PVOID GetRootHubSymbolicName; + PVOID GetDeviceBusContext; + PVOID Initialize20Hub; + PVOID RootHubInitNotification; + PVOID FlushTransfers; + PVOID SetDeviceHandleData; +} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5; + +VOID +USB_BUSIFFN +InterfaceReference(PVOID BusContext); + +VOID +USB_BUSIFFN +InterfaceDereference(PVOID BusContext); + +NTSTATUS +USB_BUSIFFN +CreateUsbDevice(PVOID BusContext, + PUSB_DEVICE_HANDLE *NewDevice, + PUSB_DEVICE_HANDLE HubDeviceHandle, + USHORT PortStatus, USHORT PortNumber); + +NTSTATUS +USB_BUSIFFN +InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle); + +NTSTATUS +USB_BUSIFFN +GetUsbDescriptors(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PUCHAR DeviceDescriptorBuffer, + PULONG DeviceDescriptorBufferLength, + PUCHAR ConfigurationBuffer, + PULONG ConfigDescriptorBufferLength); + +NTSTATUS +USB_BUSIFFN +RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags); + +NTSTATUS +USB_BUSIFFN +RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle); + +NTSTATUS +USB_BUSIFFN +GetPortHackFlags(PVOID BusContext, PULONG Flags); + +NTSTATUS +USB_BUSIFFN +QueryDeviceInformation(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PVOID DeviceInformationBuffer, + ULONG DeviceInformationBufferLength, + PULONG LengthReturned); + +NTSTATUS +USB_BUSIFFN +GetControllerInformation(PVOID BusContext, + PVOID ControllerInformationBuffer, + ULONG ControllerInformationBufferLength, + PULONG LengthReturned); + +NTSTATUS +USB_BUSIFFN +ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable); + +NTSTATUS +USB_BUSIFFN +GetExtendedHubInformation(PVOID BusContext, + PDEVICE_OBJECT HubPhysicalDeviceObject, + PVOID HubInformationBuffer, + ULONG HubInformationBufferLength, + PULONG LengthReturned); + +NTSTATUS +USB_BUSIFFN +GetRootHubSymbolicName(PVOID BusContext, + PVOID HubSymNameBuffer, + ULONG HubSymNameBufferLength, + PULONG HubSymNameActualLength); + +PVOID +USB_BUSIFFN +GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle); + +NTSTATUS +USB_BUSIFFN +Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount); + +NTSTATUS +USB_BUSIFFN +RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine); + +VOID +USB_BUSIFFN +FlushTransfers(PVOID BusContext, PVOID DeviceHandle); + +VOID +USB_BUSIFFN +SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo); + +NTSTATUS +USB_BUSIFFN +GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites); + +NTSTATUS +USB_BUSIFFN +QueryBusTime(PVOID BusContext, PULONG CurrentFrame); + +NTSTATUS +USB_BUSIFFN +SubmitIsoOutUrb(PVOID BusContext, PURB Urb); + +NTSTATUS +USB_BUSIFFN +QueryBusInformation(PVOID BusContext, + ULONG Level, + PVOID BusInformationBuffer, + PULONG BusInformationBufferLength, + PULONG BusInformationActualLength); + +BOOLEAN +USB_BUSIFFN +IsDeviceHighSpeed(PVOID BusCOntext); + +NTSTATUS +USB_BUSIFFN +EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2); + +#endif + From a884062bc9bf6dea4b86dd1580732225b0768200 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Wed, 10 Feb 2010 12:25:35 +0000 Subject: [PATCH 68/97] [usb/usbehci] fix typo svn path=/trunk/; revision=45553 --- reactos/drivers/usb/usbehci/usbiffn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index bff3172634c..165f5daaa13 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -244,7 +244,7 @@ QueryBusInformation(PVOID BusContext, BOOLEAN USB_BUSIFFN -IsDeviceHighSpeed(PVOID BusCOntext) +IsDeviceHighSpeed(PVOID BusContext) { DPRINT1("IsDeviceHighSpeed called\n"); return TRUE; From 3c1ec16123f9635c689d92b1294d198b0fa61f7b Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 10 Feb 2010 12:38:18 +0000 Subject: [PATCH 69/97] [usb/usbehci] - Remove WorkItem code as its not needed. UsbHub driver polls the hubs for device connects. - Register USB Host Controller Device Interface during AddDevice.- Implement more URB's USB_DEVICE_DESCRIPTOR_TYPE, USB_CONFIGURATION_DESCRIPTOR_TYPE, URB_FUNCTION_SELECT_CONFIGURATION, URB_FUNCTION_CLASS_DEVICE/USB_DEVICE_CLASS_HUB. - Implement returning generic UsbdDeviceHandle in URB struct. svn path=/trunk/; revision=45554 --- reactos/drivers/usb/usbehci/fdo.c | 118 ++++----- reactos/drivers/usb/usbehci/irp.c | 351 +++++++++++++++++++++------ reactos/drivers/usb/usbehci/urbreq.c | 48 +++- 3 files changed, 360 insertions(+), 157 deletions(-) diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index 5435f7260c7..433aa2a9648 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -10,15 +10,18 @@ /* INCLUDES *******************************************************************/ #include "usbehci.h" #include + //#include "ntstrsafe.h" VOID NTAPI EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) { PFDO_DEVICE_EXTENSION FdoDeviceExtension; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; ULONG CStatus; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension; CStatus = (ULONG) SystemArgument2; @@ -39,8 +42,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO /* Check for port change on this port */ if (tmp & 0x02) { - PWORKITEM_DATA WorkItemData = NULL; - /* Connect or Disconnect? */ if (tmp & 0x01) { @@ -81,31 +82,9 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i))); DPRINT("port tmp %x\n", tmp); - GetDeviceDescriptor(FdoDeviceExtension, 0); - FdoDeviceExtension->ChildDeviceCount++; - CompletePendingRequest(FdoDeviceExtension); - - WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA)); - if (!WorkItemData) - { - DPRINT1("No memory\n"); - break; - } - - WorkItemData->IoWorkItem = IoAllocateWorkItem(FdoDeviceExtension->Pdo); - if (!WorkItemData->IoWorkItem) - { - DPRINT1("WorkItem allocation failed!\n"); - break; - } - - - WorkItemData->FdoDeviceExtension = FdoDeviceExtension; - - IoQueueWorkItem(WorkItemData->IoWorkItem, - (PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem, - DelayedWorkQueue, - WorkItemData); + GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE); + PdoDeviceExtension->ChildDeviceCount++; + //CompletePendingURBRequest(PdoDeviceExtension); } else { @@ -116,7 +95,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp |= 0x02; WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp); } - } } } @@ -180,7 +158,6 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext) BOOLEAN ResetPort(PDEVICE_OBJECT DeviceObject) { - /*FIXME: Implement me */ return TRUE; @@ -310,8 +287,6 @@ StartEhci(PDEVICE_OBJECT DeviceObject) EHCI_USBINTR_INTE | EHCI_USBINTR_ERR | EHCI_USBINTR_ASYNC | EHCI_USBINTR_HSERR | EHCI_USBINTR_FLROVR | EHCI_USBINTR_PC); - //UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; - UsbCmd->Run = 1; WRITE_REGISTER_ULONG((PULONG)(base + EHCI_USBCMD), tmp); @@ -351,14 +326,12 @@ GetCapabilities(PFDO_DEVICE_EXTENSION DeviceExtension, ULONG Base) PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(Base + 4)); PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(Base + 8)); - DPRINT("Length %d\n", PCap->Length); DPRINT("Reserved %d\n", PCap->Reserved); DPRINT("HCIVersion %x\n", PCap->HCIVersion); DPRINT("HCSParams %x\n", PCap->HCSParamsLong); DPRINT("HCCParams %x\n", PCap->HCCParams); - if (PCap->HCCParams & 0x02) DPRINT1("Frame list size is configurable\n"); @@ -412,8 +385,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER; FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice, - &DeviceDescription, - &FdoDeviceExtension->MapRegisters); + &DeviceDescription, + &FdoDeviceExtension->MapRegisters); if (FdoDeviceExtension->pDmaAdapter == NULL) { @@ -561,14 +534,16 @@ FdoQueryBusRelations( NTSTATUS Status; ULONG UsbDeviceNumber = 0; WCHAR CharDeviceName[64]; + UNICODE_STRING DeviceName; DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - /* Create the PDO */ + + /* Create the PDO with the next available number */ while (TRUE) { - /* FIXME: Use safe string sprintf*/ - /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */ + /* FIXME: Use safe string */ + /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBPDO-%d", UsbDeviceNumber); */ swprintf(CharDeviceName, L"\\Device\\USBPDO-%d", UsbDeviceNumber); RtlInitUnicodeString(&DeviceName, CharDeviceName); DPRINT("DeviceName %wZ\n", &DeviceName); @@ -604,20 +579,17 @@ FdoQueryBusRelations( PdoDeviceExtension->Common.IsFdo = FALSE; PdoDeviceExtension->ControllerFdo = DeviceObject; + PdoDeviceExtension->DeviceObject = Pdo; + + InitializeListHead(&PdoDeviceExtension->IrpQueue); + KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock); Pdo->Flags &= ~DO_DEVICE_INITIALIZING; + DeviceExtension->Pdo = Pdo; - /*swprintf(CharSymLinkName, L"\\Device\\HCD%d", UsbDeviceNumber); - RtlInitUnicodeString(&SymLinkName, CharSymLinkName); - Status = IoCreateSymbolicLink(&SymLinkName, &DeviceName); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n"); - }*/ - DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); + if (!DeviceRelations) { return STATUS_INSUFFICIENT_RESOURCES; @@ -646,7 +618,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { case IRP_MN_START_DEVICE: { - DPRINT("START_DEVICE\n"); + DPRINT1("START_DEVICE\n"); Irp->IoStatus.Status = STATUS_SUCCESS; Status = ForwardAndWait(DeviceObject, Irp); @@ -657,7 +629,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) } case IRP_MN_QUERY_DEVICE_RELATIONS: { - DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n"); switch(Stack->Parameters.QueryDeviceRelations.Type) { case BusRelations: @@ -687,6 +659,14 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); } + case IRP_MN_QUERY_INTERFACE: + { + Status = STATUS_SUCCESS; + Information = 0; + Status = ForwardIrpAndForget(DeviceObject, Irp); + return Status; + break; + } default: { DPRINT1("IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction); @@ -710,21 +690,22 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) WCHAR CharSymLinkName[64]; UNICODE_STRING DeviceName; UNICODE_STRING SymLinkName; + UNICODE_STRING InterfaceSymLinkName; ULONG BytesRead; PCI_COMMON_CONFIG PciConfig; PFDO_DEVICE_EXTENSION FdoDeviceExtension; - DPRINT1("Ehci AddDevice\n"); + DPRINT("Ehci AddDevice\n"); - /* Create the FDO */ + /* Create the FDO with next available number */ while (TRUE) { /* FIXME: Use safe string sprintf*/ /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */ swprintf(CharDeviceName, L"\\Device\\USBFDO-%d", UsbDeviceNumber); RtlInitUnicodeString(&DeviceName, CharDeviceName); - DPRINT1("DeviceName %wZ\n", &DeviceName); + DPRINT("DeviceName %wZ\n", &DeviceName); Status = IoCreateDevice(DriverObject, sizeof(FDO_DEVICE_EXTENSION), @@ -734,8 +715,8 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) FALSE, &Fdo); - if (NT_SUCCESS(Status)) - break; + if (NT_SUCCESS(Status)) + break; if ((Status == STATUS_OBJECT_NAME_EXISTS) || (Status == STATUS_OBJECT_NAME_COLLISION)) { @@ -758,21 +739,17 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) if (!NT_SUCCESS(Status)) { - DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n"); + DPRINT1("Warning: Unable to create symbolic link for ehci host controller!\n"); } - DPRINT("Attaching created device %x to %x\n", Fdo, Pdo); - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) Fdo->DeviceExtension; RtlZeroMemory(FdoDeviceExtension, sizeof(PFDO_DEVICE_EXTENSION)); - InitializeListHead(&FdoDeviceExtension->IrpQueue); - KeInitializeSpinLock(&FdoDeviceExtension->IrpQueueLock); - FdoDeviceExtension->Common.IsFdo = TRUE; FdoDeviceExtension->DeviceObject = Fdo; FdoDeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo); + if (FdoDeviceExtension->LowerDevice == NULL) { DPRINT1("UsbEhci: Failed to attach to device stack!\n"); @@ -782,10 +759,10 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) return STATUS_NO_SUCH_DEVICE; } - Fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; + Fdo->Flags |= DO_BUFFERED_IO;// | DO_POWER_PAGABLE; - DPRINT("Attached %x!\n", FdoDeviceExtension->LowerDevice); ASSERT(FdoDeviceExtension->LowerDevice == Pdo); + Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface); if (!NT_SUCCESS(Status)) @@ -797,8 +774,6 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) return Status; } - DPRINT("Context %x\n", FdoDeviceExtension->BusInterface.Context); - BytesRead = (*FdoDeviceExtension->BusInterface.GetBusData)( FdoDeviceExtension->BusInterface.Context, PCI_WHICHSPACE_CONFIG, @@ -827,15 +802,24 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) DPRINT("PCI_ENABLE_BUS_MASTER\n"); DPRINT("BaseAddress[0] %x\n", PciConfig.u.type0.BaseAddresses[0]); - DPRINT("Vendor %x\n", PciConfig.VendorID); - DPRINT("Device %x\n", PciConfig.DeviceID); + DPRINT1("Vendor %x\n", PciConfig.VendorID); + DPRINT1("Device %x\n", PciConfig.DeviceID); FdoDeviceExtension->VendorId = PciConfig.VendorID; FdoDeviceExtension->DeviceId = PciConfig.DeviceID; - DPRINT("FdoDeviceExtension->NextLowerDevice %x\n", FdoDeviceExtension->LowerDevice); FdoDeviceExtension->DeviceState = DEVICEINTIALIZED; + Status = IoRegisterDeviceInterface(Pdo, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, &InterfaceSymLinkName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Unable to register device interface!\n"); + } + else + { + Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); + DPRINT1("SetInterfaceState %x\n", Status); + } Fdo->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index 9be9e8b0f30..e4bb8d988a7 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -10,28 +10,26 @@ #include "usbehci.h" VOID -RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp) +RequestURBCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp) { PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PFDO_DEVICE_EXTENSION FdoDeviceExtension; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; KIRQL OldIrql = Irp->CancelIrql; IoReleaseCancelSpinLock(DISPATCH_LEVEL); - KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->IrpQueueLock); + KeAcquireSpinLockAtDpcLevel(&PdoDeviceExtension->IrpQueueLock); RemoveEntryList(&Irp->Tail.Overlay.ListEntry); - KeReleaseSpinLock(&FdoDeviceExtension->IrpQueueLock, OldIrql); + KeReleaseSpinLock(&PdoDeviceExtension->IrpQueueLock, OldIrql); - Irp->IoStatus.Status = STATUS_CANCELLED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + Irp->IoStatus.Status = STATUS_CANCELLED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); } VOID -QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) +QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) { KIRQL OldIrql; @@ -51,10 +49,13 @@ QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) } VOID -CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension) +CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { PLIST_ENTRY NextIrp = NULL; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + ULONG_PTR Information = 0; PIO_STACK_LOCATION Stack; + PUSB_DEVICE UsbDevice = NULL; KIRQL oldIrql; PIRP Irp = NULL; URB *Urb; @@ -75,83 +76,275 @@ CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension) Urb = (PURB) Stack->Parameters.Others.Argument1; ASSERT(Urb); - /* FIXME: Fill in information for Argument1/URB */ + Information = 0; + Status = STATUS_SUCCESS; - DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); - DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index); - DPRINT("DescriptorType %x\n", Urb->UrbControlDescriptorRequest.DescriptorType); - DPRINT("LanguageId %x\n", Urb->UrbControlDescriptorRequest.LanguageId); + DPRINT1("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); + DPRINT1("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; + UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; + /* UsbdDeviceHandle of 0 is root hub */ + if (UsbDevice == NULL) + UsbDevice = DeviceExtension->UsbDevices[0]; + + switch (Urb->UrbHeader.Function) + { + case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: + { + /* We should not get here yet! */ + ASSERT(FALSE); + } + case URB_FUNCTION_GET_STATUS_FROM_DEVICE: + { + DPRINT1("Get Status from Device\n"); + } + case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: + { + Urb->UrbHeader.Function = 0x08; + Urb->UrbHeader.UsbdFlags = 0; + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + + switch(Urb->UrbControlDescriptorRequest.DescriptorType) + { + case USB_DEVICE_DESCRIPTOR_TYPE: + { + DPRINT1("USB DEVICE DESC\n"); + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR)) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); + } + + RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, + &UsbDevice->DeviceDescriptor, + Urb->UrbControlDescriptorRequest.TransferBufferLength); + + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + + break; + } + case USB_CONFIGURATION_DESCRIPTOR_TYPE: + { + DPRINT1("USB CONFIG DESC\n"); + ULONG FullDescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR) + + sizeof(USB_INTERFACE_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR); + + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= FullDescriptorLength) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = FullDescriptorLength; + } + + RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, + &UsbDevice->ConfigurationDescriptor, + Urb->UrbControlDescriptorRequest.TransferBufferLength); + + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + + break; + } + case USB_STRING_DESCRIPTOR_TYPE: + { + DPRINT1("Usb String Descriptor not implemented\n"); + } + default: + { + DPRINT1("Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType); + } + } + } + case URB_FUNCTION_SELECT_CONFIGURATION: + { + PUSBD_INTERFACE_INFORMATION InterfaceInfo; + LONG iCount, pCount; + + DPRINT("Selecting Configuration\n"); + DPRINT("Length %x\n", Urb->UrbHeader.Length); + DPRINT("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); + + if (Urb->UrbSelectConfiguration.ConfigurationDescriptor) + { + DPRINT("ConfigurationDescriptor = %p\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor); + DPRINT(" bLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bLength); + DPRINT(" bDescriptorType = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bDescriptorType); + DPRINT(" wTotalLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->wTotalLength); + DPRINT(" bNumInterfaces = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces); + DPRINT(" bConfigurationValue = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue); + DPRINT(" iConfiguration = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->iConfiguration); + DPRINT(" bmAttributes = %04x\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bmAttributes); + DPRINT(" MaxPower = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->MaxPower); + + + Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ConfigurationDescriptor; + DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); + InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; + + for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++) + { + DPRINT("InterfaceInformation[%d]\n", iCount); + DPRINT(" Length = %d\n", InterfaceInfo->Length); + DPRINT(" InterfaceNumber = %d\n", InterfaceInfo->InterfaceNumber); + DPRINT(" AlternateSetting = %d\n", InterfaceInfo->AlternateSetting); + DPRINT(" Class = %02x\n", (ULONG)InterfaceInfo->Class); + DPRINT(" SubClass = %02x\n", (ULONG)InterfaceInfo->SubClass); + DPRINT(" Protocol = %02x\n", (ULONG)InterfaceInfo->Protocol); + DPRINT(" Reserved = %02x\n", (ULONG)InterfaceInfo->Reserved); + DPRINT(" InterfaceHandle = %p\n", InterfaceInfo->InterfaceHandle); + DPRINT(" NumberOfPipes = %d\n", InterfaceInfo->NumberOfPipes); + InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->InterfaceDescriptor; + InterfaceInfo->Class = UsbDevice->InterfaceDescriptor.bInterfaceClass; + InterfaceInfo->SubClass = UsbDevice->InterfaceDescriptor.bInterfaceSubClass; + InterfaceInfo->Protocol = UsbDevice->InterfaceDescriptor.bInterfaceProtocol; + InterfaceInfo->Reserved = 0; + + for (pCount = 0; pCount < InterfaceInfo->NumberOfPipes; pCount++) + { + DPRINT("Pipe[%d]\n", pCount); + DPRINT(" MaximumPacketSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumPacketSize); + DPRINT(" EndpointAddress = %d\n", InterfaceInfo->Pipes[pCount].EndpointAddress); + DPRINT(" Interval = %d\n", InterfaceInfo->Pipes[pCount].Interval); + DPRINT(" PipeType = %d\n", InterfaceInfo->Pipes[pCount].PipeType); + DPRINT(" PipeHandle = %x\n", InterfaceInfo->Pipes[pCount].PipeHandle); + DPRINT(" MaximumTransferSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumTransferSize); + DPRINT(" PipeFlags = %08x\n", InterfaceInfo->Pipes[pCount].PipeFlags); + InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->EndPointDescriptor.wMaxPacketSize; + InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->EndPointDescriptor.bEndpointAddress; + InterfaceInfo->Pipes[pCount].Interval = UsbDevice->EndPointDescriptor.bInterval; + InterfaceInfo->Pipes[pCount].PipeType = UsbdPipeTypeInterrupt; + InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->EndPointDescriptor; + if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0) + InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096; + /* InterfaceInfo->Pipes[j].PipeFlags = 0; */ + } + InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length); + } + + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + Urb->UrbHeader.UsbdFlags = 0; + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + } + else + { + /* FIXME: Set device to unconfigured state */ + } + break; + } + case URB_FUNCTION_CLASS_DEVICE: + { + switch (Urb->UrbControlVendorClassRequest.Request) + { + case USB_REQUEST_GET_DESCRIPTOR: + { + DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); + DPRINT1("Urb->UrbControlVendorClassRequest.Value %x\n", Urb->UrbControlVendorClassRequest.Value); + + + switch (Urb->UrbControlVendorClassRequest.Value >> 8) + { + case USB_DEVICE_CLASS_AUDIO: + { + DPRINT1("USB_DEVICE_CLASS_AUDIO\n"); + break; + } + case USB_DEVICE_CLASS_COMMUNICATIONS: + { + DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS\n"); + break; + } + case USB_DEVICE_CLASS_HUMAN_INTERFACE: + { + DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE\n"); + break; + } + case USB_DEVICE_CLASS_MONITOR: + { + DPRINT1("USB_DEVICE_CLASS_MONITOR\n"); + break; + } + case USB_DEVICE_CLASS_PHYSICAL_INTERFACE: + { + DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE\n"); + break; + } + case USB_DEVICE_CLASS_POWER: + { + DPRINT1("USB_DEVICE_CLASS_POWER\n"); + break; + } + case USB_DEVICE_CLASS_PRINTER: + { + DPRINT1("USB_DEVICE_CLASS_PRINTER\n"); + break; + } + case USB_DEVICE_CLASS_STORAGE: + { + DPRINT1("USB_DEVICE_CLASS_STORAGE\n"); + break; + } + case USB_DEVICE_CLASS_RESERVED: + case USB_DEVICE_CLASS_HUB: + { + PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; + /* FIXME: Handle more than root hub? */ + if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR)) + { + Urb->UrbControlVendorClassRequest.TransferBufferLength = sizeof(USB_HUB_DESCRIPTOR); + } + else + { + /* FIXME: Handle this correctly */ + UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); + UsbHubDescr->bDescriptorType = 0x29; + return; + } + DPRINT1("USB_DEVICE_CLASS_HUB request\n"); + UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); + UsbHubDescr->bDescriptorType = 0x29; + UsbHubDescr->bNumberOfPorts = 0x08; + UsbHubDescr->wHubCharacteristics = 0x0012; + UsbHubDescr->bPowerOnToPowerGood = 0x01; + UsbHubDescr->bHubControlCurrent = 0x00; + UsbHubDescr->bRemoveAndPowerMask[0] = 0x00; + UsbHubDescr->bRemoveAndPowerMask[1] = 0x00; + UsbHubDescr->bRemoveAndPowerMask[2] = 0xff; + break; + } + default: + { + DPRINT1("Unknown UrbControlVendorClassRequest Value\n"); + } + } + Urb->UrbHeader.Function = 0x08; + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + Urb->UrbHeader.UsbdFlags = 0; + /* Stop handling the URBs now as its not coded yet */ + DeviceExtension->HaltUrbHandling = TRUE; + break; + } + default: + { + DPRINT1("Unhandled URB request for class device\n"); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + } + } + break; + } + default: + { + DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + } + + } KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = Information; + IoCompleteRequest(Irp, IO_NO_INCREMENT); KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); } KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); } - -NTSTATUS -NTAPI -ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PContext) -{ - PDEVICE_OBJECT PortDeviceObject = (PDEVICE_OBJECT) PContext; - IoFreeIrp(Irp); - ObDereferenceObject(PortDeviceObject); - return STATUS_MORE_PROCESSING_REQUIRED; -} - -VOID -DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context) -{ - PWORKITEM_DATA WorkItemData; - PIO_STACK_LOCATION IrpStack = NULL; - PDEVICE_OBJECT PortDeviceObject = NULL; - PIRP Irp = NULL; - - WorkItemData = (PWORKITEM_DATA)Context; - - PortDeviceObject = IoGetAttachedDeviceReference(WorkItemData->FdoDeviceExtension->Pdo); - - if (!PortDeviceObject) - { - DPRINT1("Unable to notify Pdos parent of device arrival.\n"); - goto Cleanup; - } - - if (PortDeviceObject == DeviceObject) - { - /* Piontless to send query relations to ourself */ - ObDereferenceObject(PortDeviceObject); - goto Cleanup; - } - - Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE); - - if (!Irp) - { - DPRINT1("Unable to allocate IRP\n"); - } - - IoSetCompletionRoutine(Irp, - (PIO_COMPLETION_ROUTINE)ArrivalNotificationCompletion, - (PVOID) PortDeviceObject, - TRUE, - TRUE, - TRUE); - - IrpStack = IoGetNextIrpStackLocation(Irp); - IrpStack->Parameters.QueryDeviceRelations.Type = TargetDeviceRelation; - IrpStack->MajorFunction = IRP_MJ_PNP; - IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS; - - IoCallDriver(PortDeviceObject, Irp); - -Cleanup: - IoFreeWorkItem(WorkItemData->IoWorkItem); - ExFreePool(WorkItemData); -} - diff --git a/reactos/drivers/usb/usbehci/urbreq.c b/reactos/drivers/usb/usbehci/urbreq.c index 8ff24016c0e..d9a85ba1338 100644 --- a/reactos/drivers/usb/usbehci/urbreq.c +++ b/reactos/drivers/usb/usbehci/urbreq.c @@ -68,7 +68,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, /* Must be Page aligned */ *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF); - *CtrlData = (PSTANDARD_DEVICE_DESC) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF); + *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF); (*CtrlTD1)->NextPointer = TERMINATE_POINTER; (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER; @@ -105,10 +105,10 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, } BOOLEAN -GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) +GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub) { PEHCI_SETUP_FORMAT CtrlSetup = NULL; - PSTANDARD_DEVICE_DESC CtrlData = NULL; + PUSB_DEVICE_DESCRIPTOR CtrlData = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL; @@ -129,14 +129,22 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) &CtrlTD3, &CtrlSetup, (PVOID)&CtrlData, - sizeof(STANDARD_DEVICE_DESC)); + sizeof(USB_DEVICE_DESCRIPTOR)); /* FIXME: Use defines and handle other than Device Desciptors */ - CtrlSetup->bmRequestType = 0x80; + if (Hub) + { + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->wValue = 0x0600; + } + else + { + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->wValue = 0x0100; + } CtrlSetup->bRequest = 0x06; - CtrlSetup->wValue = 0x0100; CtrlSetup->wIndex = 0; - CtrlSetup->wLength = sizeof(STANDARD_DEVICE_DESC); + CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR); tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; @@ -182,13 +190,31 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) break; } + if (OutBuffer != NULL) + { + OutBuffer->bLength = CtrlData->bLength; + OutBuffer->bDescriptorType = CtrlData->bDescriptorType; + OutBuffer->bcdUSB = CtrlData->bcdUSB; + OutBuffer->bDeviceClass = CtrlData->bDeviceClass; + OutBuffer->bDeviceSubClass = CtrlData->bDeviceSubClass; + OutBuffer->bDeviceProtocol = CtrlData->bDeviceProtocol; + OutBuffer->bMaxPacketSize0 = CtrlData->bMaxPacketSize0; + OutBuffer->idVendor = CtrlData->idVendor; + OutBuffer->idProduct = CtrlData->idProduct; + OutBuffer->bcdDevice = CtrlData->bcdDevice; + OutBuffer->iManufacturer = CtrlData->iManufacturer; + OutBuffer->iProduct = CtrlData->iProduct; + OutBuffer->iSerialNumber = CtrlData->iSerialNumber; + OutBuffer->bNumConfigurations = CtrlData->bNumConfigurations; + } + DPRINT1("bLength %d\n", CtrlData->bLength); DPRINT1("bDescriptorType %x\n", CtrlData->bDescriptorType); DPRINT1("bcdUSB %x\n", CtrlData->bcdUSB); DPRINT1("CtrlData->bDeviceClass %x\n", CtrlData->bDeviceClass); DPRINT1("CtrlData->bDeviceSubClass %x\n", CtrlData->bDeviceSubClass); - DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocal); - DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize); + DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocol); + DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize0); DPRINT1("CtrlData->idVendor %x\n", CtrlData->idVendor); DPRINT1("CtrlData->idProduct %x\n", CtrlData->idProduct); DPRINT1("CtrlData->bcdDevice %x\n", CtrlData->bcdDevice); @@ -202,7 +228,7 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) { /* We got valid data, try for strings */ UCHAR Manufacturer = CtrlData->iManufacturer; - UCHAR Product = CtrlData->iManufacturer; + UCHAR Product = CtrlData->iProduct; UCHAR SerialNumber = CtrlData->iSerialNumber; GetDeviceStringDescriptor(DeviceExtension, Manufacturer); @@ -228,7 +254,7 @@ GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) LONG tmp; Base = (ULONG) DeviceExtension->ResourceMemory; -DPRINT1("Index: %d\n", Index); + /* Set up the QUEUE HEAD in memory */ QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr); From b7b948cff5b04effd966a3a4e7304294cf43b030 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 10 Feb 2010 13:56:54 +0000 Subject: [PATCH 70/97] Do not crash, use valid kernel PTE. svn path=/trunk/; revision=45555 --- reactos/ntoskrnl/mm/ARM3/hypermap.c | 4 ++-- reactos/ntoskrnl/mm/ARM3/iosup.c | 2 +- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 2 +- reactos/ntoskrnl/mm/ARM3/miarm.h | 2 ++ reactos/ntoskrnl/mm/ARM3/mminit.c | 4 ++-- reactos/ntoskrnl/mm/ARM3/ncache.c | 2 +- reactos/ntoskrnl/mm/ARM3/pagfault.c | 2 +- reactos/ntoskrnl/mm/ARM3/pool.c | 4 ++-- reactos/ntoskrnl/mm/ARM3/procsup.c | 4 ++-- reactos/ntoskrnl/mm/i386/page.c | 2 -- reactos/ntoskrnl/mm/mmdbg.c | 3 ++- reactos/ntoskrnl/mm/mminit.c | 4 ++-- 12 files changed, 18 insertions(+), 17 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c index 29d44893e5d..80f371620a0 100644 --- a/reactos/ntoskrnl/mm/ARM3/hypermap.c +++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c @@ -45,7 +45,7 @@ MiMapPageInHyperSpace(IN PEPROCESS Process, // // Build the PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; TempPte.u.Hard.PageFrameNumber = Page; MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local! @@ -157,7 +157,7 @@ MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, // Write the current PTE // PointerPte += (Offset + 1); - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local! do { diff --git a/reactos/ntoskrnl/mm/ARM3/iosup.c b/reactos/ntoskrnl/mm/ARM3/iosup.c index 7ea829711c3..1a174509382 100644 --- a/reactos/ntoskrnl/mm/ARM3/iosup.c +++ b/reactos/ntoskrnl/mm/ARM3/iosup.c @@ -122,7 +122,7 @@ MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, // // Get the template and configure caching // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; switch (CacheAttribute) { case MiNonCached: diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index f1953bafffe..a757d9eac95 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -372,7 +372,7 @@ MmMapLockedPagesSpecifyCache(IN PMDL Mdl, // // Get the template // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; switch (CacheAttribute) { case MiNonCached: diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index a0d7befcedd..77e7847a204 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -127,6 +127,8 @@ typedef struct _PHYSICAL_MEMORY_DESCRIPTOR } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR; extern MMPTE HyperTemplatePte; +extern MMPTE ValidKernelPde; +extern MMPTE ValidKernelPte; extern ULONG MmSizeOfNonPagedPoolInBytes; extern ULONG MmMaximumNonPagedPoolInBytes; diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 21f666c81c3..ea1a60fd040 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -442,7 +442,7 @@ NTAPI MiBuildPagedPool(VOID) { PMMPTE PointerPte, PointerPde; - MMPTE TempPte = HyperTemplatePte; + MMPTE TempPte = ValidKernelPte; PFN_NUMBER PageFrameIndex; KIRQL OldIrql; ULONG Size, BitMapSize; @@ -467,7 +467,7 @@ MiBuildPagedPool(VOID) // page directory array in the old ReactOS Mm is used (but in a less hacky // way). // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory; ASSERT(PointerPte->u.Hard.Valid == 0); ASSERT(TempPte.u.Hard.Valid == 1); diff --git a/reactos/ntoskrnl/mm/ARM3/ncache.c b/reactos/ntoskrnl/mm/ARM3/ncache.c index 7979d391847..659811dc57b 100644 --- a/reactos/ntoskrnl/mm/ARM3/ncache.c +++ b/reactos/ntoskrnl/mm/ARM3/ncache.c @@ -108,7 +108,7 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes) // // Setup the template PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; // // Now check what kind of caching we should use diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index f4d9cd7ed92..f1422f88079 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -113,7 +113,7 @@ MiResolveDemandZeroFault(IN PVOID Address, // // Build the PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; TempPte.u.Hard.PageFrameNumber = PageFrameNumber; *PointerPte = TempPte; ASSERT(PointerPte->u.Hard.Valid == 1); diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index bfb75dfe3e7..0d341a8a58f 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -213,7 +213,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Get the template PTE we'll use to expand // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; // // Get the first PTE in expansion space @@ -493,7 +493,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Loop the pages // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; do { // diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 1d575460d87..a2f215a2065 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -134,7 +134,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, // // Setup the template stack PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); MI_MAKE_DIRTY_PAGE(&TempPte); TempPte.u.Hard.PageFrameNumber = 0; @@ -234,7 +234,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer, // // Setup the template stack PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); MI_MAKE_DIRTY_PAGE(&TempPte); TempPte.u.Hard.PageFrameNumber = 0; diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index cb075b0f2fc..c9cdf64412e 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -1000,8 +1000,6 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) } } -extern MMPTE HyperTemplatePte; - VOID INIT_FUNCTION NTAPI diff --git a/reactos/ntoskrnl/mm/mmdbg.c b/reactos/ntoskrnl/mm/mmdbg.c index 65f9ebc7f47..fd11099e1fd 100644 --- a/reactos/ntoskrnl/mm/mmdbg.c +++ b/reactos/ntoskrnl/mm/mmdbg.c @@ -35,6 +35,7 @@ NTAPI MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress, IN ULONG Flags) { + extern MMPTE ValidKernelPte; PFN_NUMBER Pfn; MMPTE TempPte; PVOID MappingBaseAddress; @@ -77,7 +78,7 @@ MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress, // // // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; // // Convert physical address to PFN diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 5e21ad6f2d0..7ac2247df65 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -354,9 +354,9 @@ NTAPI MmInitSystem(IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - extern MMPTE HyperTemplatePte; + extern MMPTE ValidKernelPte; PMMPTE PointerPte; - MMPTE TempPte = HyperTemplatePte; + MMPTE TempPte = ValidKernelPte; PFN_NUMBER PageFrameNumber; if (Phase == 0) From 4e061e178b07a8da4a220a43d80f047448652535 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Feb 2010 17:42:07 +0000 Subject: [PATCH 71/97] [NTOS]: MxGetNextPage is not platform-specific, so share it. [NTOS]: Factor out computations of NP sizes and limits into MiComputeNonPagedPoolVa. [NTOS]: Fix NP size/limit calculations to use the amount of FREE RAM, not the amount of INSTALLED RAM. [NTOS]: Use Windows 2003's algorithm for NP size on machines with more than 512MB of FREE RAM. [NTOS]: Partly handle the case of machines with NP over 128MB. svn path=/trunk/; revision=45556 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 280 ++++++++++++--------------- reactos/ntoskrnl/mm/ARM3/miarm.h | 6 + reactos/ntoskrnl/mm/ARM3/mminit.c | 24 +++ 3 files changed, 152 insertions(+), 158 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 47321eaab6e..3fcb081e20f 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -29,39 +29,133 @@ PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; +/* Template PTE and PDE for a kernel page */ MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; +/* Make the code cleaner with some definitions for size multiples */ +#define _1KB (1024) +#define _1MB (1000 * _1KB) + +/* Architecture specific size of a PDE directory, and size of a page table */ +#define PDE_SIZE (4096 * sizeof(MMPDE)) +#define PT_SIZE (1024 * sizeof(MMPTE)) + /* PRIVATE FUNCTIONS **********************************************************/ -PFN_NUMBER +VOID NTAPI -MxGetNextPage(IN PFN_NUMBER PageCount) +MiComputeNonPagedPoolVa(IN ULONG FreePages) { - PFN_NUMBER Pfn; - - // - // Make sure we have enough pages - // - if (PageCount > MxFreeDescriptor->PageCount) + IN PFN_NUMBER PoolPages; + + /* Check if this is a machine with less than 256MB of RAM, and no overide */ + if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && + !(MmSizeOfNonPagedPoolInBytes)) { - // - // Crash the system - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - MxFreeDescriptor->PageCount, - MxOldFreeDescriptor.PageCount, - PageCount); + /* Force the non paged pool to be 2MB so we can reduce RAM usage */ + MmSizeOfNonPagedPoolInBytes = 2 * _1MB; } - // - // Use our lowest usable free pages - // - Pfn = MxFreeDescriptor->BasePage; - MxFreeDescriptor->BasePage += PageCount; - MxFreeDescriptor->PageCount -= PageCount; - return Pfn; + /* Hyperspace ends here */ + MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1); + + /* Check if the user gave a ridicuously large nonpaged pool RAM size */ + if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > (FreePages * 7 / 8)) + { + /* More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! */ + MmSizeOfNonPagedPoolInBytes = 0; + } + + /* Check if no registry setting was set, or if the setting was too low */ + if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) + { + /* Start with the minimum (256 KB) and add 32 KB for each MB above 4 */ + MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; + MmSizeOfNonPagedPoolInBytes += (FreePages - 1024) / 256 * MmMinAdditionNonPagedPoolPerMb; + } + + /* Check if the registy setting or our dynamic calculation was too high */ + if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) + { + /* Set it to the maximum */ + MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; + } + + /* Check if a percentage cap was set through the registry */ + if (MmMaximumNonPagedPoolPercent) UNIMPLEMENTED; + + /* Page-align the nonpaged pool size */ + MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); + + /* Now, check if there was a registry size for the maximum size */ + if (!MmMaximumNonPagedPoolInBytes) + { + /* Start with the default (1MB) */ + MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; + + /* Add space for PFN database */ + MmMaximumNonPagedPoolInBytes += (ULONG) + PAGE_ALIGN((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); + + /* Check if the machine has more than 512MB of free RAM */ + if (FreePages >= 0x1F000) + { + /* Add 200KB for each MB above 4 */ + MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * + (MmMaxAdditionNonPagedPoolPerMb / 2); + if (MmMaximumNonPagedPoolInBytes < MI_MAX_NONPAGED_POOL_SIZE) + { + /* Make it at least 128MB since this machine has a lot of RAM */ + MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE; + } + } + else + { + /* Add 400KB for each MB above 4 */ + MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * + MmMaxAdditionNonPagedPoolPerMb; + } + } + + /* Make sure there's at least 16 pages + the PFN available for expansion */ + PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) + + ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * sizeof(MMPFN)); + if (MmMaximumNonPagedPoolInBytes < PoolPages) + { + /* The maximum should be at least high enough to cover all the above */ + MmMaximumNonPagedPoolInBytes = PoolPages; + } + + /* Systems with 2GB of kernel address space get double the size */ + PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2; + + /* On the other hand, make sure that PFN + nonpaged pool doesn't get too big */ + if (MmMaximumNonPagedPoolInBytes > PoolPages) + { + /* Trim it down to the maximum architectural limit (256MB) */ + MmMaximumNonPagedPoolInBytes = PoolPages; + } + + /* Check if this is a system with > 128MB of non paged pool */ + if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) + { + /* Check if the initial size is less than the extra 128MB boost */ + if (MmSizeOfNonPagedPoolInBytes < (MmMaximumNonPagedPoolInBytes - + MI_MAX_NONPAGED_POOL_SIZE)) + { + /* FIXME: Should check if the initial pool can be expanded */ + + /* Assume no expansion possible, check ift he maximum is too large */ + if (MmMaximumNonPagedPoolInBytes > (MmSizeOfNonPagedPoolInBytes + + MI_MAX_NONPAGED_POOL_SIZE)) + { + /* Set it to the initial value plus the boost */ + MmMaximumNonPagedPoolInBytes = MmSizeOfNonPagedPoolInBytes + + MI_MAX_NONPAGED_POOL_SIZE; + } + } + } } NTSTATUS @@ -71,7 +165,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PLIST_ENTRY NextEntry; PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; ULONG FreePages = 0; - PFN_NUMBER PageFrameIndex, PoolPages; + PFN_NUMBER PageFrameIndex; PMMPTE StartPde, EndPde, PointerPte, LastPte; MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; @@ -79,7 +173,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; /* Check for kernel stack size that's too big */ - if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / 1024)) + if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB)) { /* Sanitize to default value */ MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; @@ -87,7 +181,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) else { /* Take the registry setting, and convert it into bytes */ - MmLargeStackSize *= 1024; + MmLargeStackSize *= _1KB; /* Now align it to a page boundary */ MmLargeStackSize = PAGE_ROUND_UP(MmLargeStackSize); @@ -219,138 +313,8 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // MxOldFreeDescriptor = *MxFreeDescriptor; - // - // Check if this is a machine with less than 256MB of RAM, and no overide - // - if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && - !(MmSizeOfNonPagedPoolInBytes)) - { - // - // Force the non paged pool to be 2MB so we can reduce RAM usage - // - MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024; - } - - // - // Hyperspace ends here - // - MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1); - - // - // Check if the user gave a ridicuously large nonpaged pool RAM size - // - if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > - (MmNumberOfPhysicalPages * 7 / 8)) - { - // - // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! - // - MmSizeOfNonPagedPoolInBytes = 0; - } - - // - // Check if no registry setting was set, or if the setting was too low - // - if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) - { - // - // Start with the minimum (256 KB) and add 32 KB for each MB above 4 - // - MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; - MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / - 256 * MmMinAdditionNonPagedPoolPerMb; - } - - // - // Check if the registy setting or our dynamic calculation was too high - // - if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) - { - // - // Set it to the maximum - // - MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; - } - - // - // Check if a percentage cap was set through the registry - // - if (MmMaximumNonPagedPoolPercent) - { - // - // Don't feel like supporting this right now - // - UNIMPLEMENTED; - } - - // - // Page-align the nonpaged pool size - // - MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); - - // - // Now, check if there was a registry size for the maximum size - // - if (!MmMaximumNonPagedPoolInBytes) - { - // - // Start with the default (1MB) - // - MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; - - // - // Add space for PFN database - // - MmMaximumNonPagedPoolInBytes += (ULONG) - PAGE_ALIGN((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); - - // - // Add 400KB for each MB above 4 - // - MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * - MmMaxAdditionNonPagedPoolPerMb; - } - - // - // Make sure there's at least 16 pages + the PFN available for expansion - // - PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) + - ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * - sizeof(MMPFN)); - if (MmMaximumNonPagedPoolInBytes < PoolPages) - { - // - // Set it to the minimum value for the maximum (yuck!) - // - MmMaximumNonPagedPoolInBytes = PoolPages; - } - - // - // Systems with 2GB of kernel address space get double the size - // - PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2; - - // - // Don't let the maximum go too high - // - if (MmMaximumNonPagedPoolInBytes > PoolPages) - { - // - // Set it to the upper limit - // - MmMaximumNonPagedPoolInBytes = PoolPages; - } - - // - // Check if this is a system with > 128MB of non paged pool - // - if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) - { - // - // FIXME: Unsure about additional checks needed - // - DPRINT1("Untested path\n"); - } + /* Compute non paged pool limits and size */ + MiComputeNonPagedPoolVa(FreePages); // // Get L2 cache information diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 77e7847a204..05fab8bc2c3 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -198,6 +198,12 @@ MiInitMachineDependent( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +PFN_NUMBER +NTAPI +MxGetNextPage( + IN PFN_NUMBER PageCount +); + PPHYSICAL_MEMORY_DESCRIPTOR NTAPI MmInitializeMemoryLimits( diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index ea1a60fd040..1d024d3f660 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -259,6 +259,30 @@ MiSyncARM3WithROS(IN PVOID AddressStart, } } +PFN_NUMBER +NTAPI +MxGetNextPage(IN PFN_NUMBER PageCount) +{ + PFN_NUMBER Pfn; + + /* Make sure we have enough pages */ + if (PageCount > MxFreeDescriptor->PageCount) + { + /* Crash the system */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MxFreeDescriptor->PageCount, + MxOldFreeDescriptor.PageCount, + PageCount); + } + + /* Use our lowest usable free pages */ + Pfn = MxFreeDescriptor->BasePage; + MxFreeDescriptor->BasePage += PageCount; + MxFreeDescriptor->PageCount -= PageCount; + return Pfn; +} + PFN_NUMBER NTAPI MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, From 1711020a43253b9f394f9eaf7935a6fa7e25393e Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Feb 2010 18:10:04 +0000 Subject: [PATCH 72/97] [NTOS]: Factor out SecondaryColor computations into MiComputeColorInformation. [NTOS]: Fix SecondaryColor computations. If the KPCR has no deta, use the default colors of 8, not just 1. Also handle cases where there is more L2 cache than we'd like -- set the secondary colors to a maximum of 1024 in that case. Finally, if the colors are not a power of two, or there are not enough (due to a registry setting), use the default of 8. svn path=/trunk/; revision=45557 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 75 +++++++++++++++++++++------- reactos/ntoskrnl/mm/ARM3/miarm.h | 4 ++ 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 3fcb081e20f..91104cc0545 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -158,6 +158,59 @@ MiComputeNonPagedPoolVa(IN ULONG FreePages) } } +VOID +NTAPI +MiComputeColorInformation(VOID) +{ + ULONG L2Associativity; + + /* Check if no setting was provided already */ + if (!MmSecondaryColors) + { + /* Get L2 cache information */ + L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; + + /* The number of colors is the number of cache bytes by set/way */ + MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; + if (L2Associativity) MmSecondaryColors /= L2Associativity; + } + + /* Now convert cache bytes into pages */ + MmSecondaryColors >>= PAGE_SHIFT; + if (!MmSecondaryColors) + { + /* If there was no cache data from the KPCR, use the default colors */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + else + { + /* Otherwise, make sure there aren't too many colors */ + if (MmSecondaryColors > MI_MAX_SECONDARY_COLORS) + { + /* Set the maximum */ + MmSecondaryColors = MI_MAX_SECONDARY_COLORS; + } + + /* Make sure there aren't too little colors */ + if (MmSecondaryColors < MI_MIN_SECONDARY_COLORS) + { + /* Set the default */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + + /* Finally make sure the colors are a power of two */ + if (MmSecondaryColors & (MmSecondaryColors - 1)) + { + /* Set the default */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + } + + /* Compute the mask and store it */ + MmSecondaryColorMask = MmSecondaryColors - 1; + KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; +} + NTSTATUS NTAPI MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -169,7 +222,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PMMPTE StartPde, EndPde, PointerPte, LastPte; MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; - ULONG OldCount, L2Associativity; + ULONG OldCount; PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; /* Check for kernel stack size that's too big */ @@ -316,24 +369,8 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Compute non paged pool limits and size */ MiComputeNonPagedPoolVa(FreePages); - // - // Get L2 cache information - // - L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; - MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; - if (L2Associativity) MmSecondaryColors /= L2Associativity; - - // - // Compute final color mask and count - // - MmSecondaryColors >>= PAGE_SHIFT; - if (!MmSecondaryColors) MmSecondaryColors = 1; - MmSecondaryColorMask = MmSecondaryColors - 1; - - // - // Store it - // - KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; + /* Compute color information (L2 cache-separated paging lists) */ + MiComputeColorInformation(); // // Calculate the number of bytes for the PFN database diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 05fab8bc2c3..188b024e2cc 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -31,6 +31,10 @@ #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000 +#define MI_MIN_SECONDARY_COLORS 8 +#define MI_SECONDARY_COLORS 64 +#define MI_MAX_SECONDARY_COLORS 1024 + #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) From 88d67c0d344dbc93c437cf1ac3a892cb2e5227c4 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 10 Feb 2010 18:44:30 +0000 Subject: [PATCH 73/97] [NTOS]: Allocate and initialize color tables based on MmSecondaryColors (MiInitializeColorTables). [NTOS]: These come after the PFN database, so modify the MmPfnAllocation to account for them. svn path=/trunk/; revision=45558 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 69 +++++++++++++++++++++++++++- reactos/ntoskrnl/mm/ARM3/miarm.h | 7 +++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 91104cc0545..21919c11bd4 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -33,6 +33,19 @@ MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; +/* + * For each page's worth bytes of L2 cache in a given set/way line, the zero and + * free lists are organized in what is called a "color". + * + * This array points to the two lists, so it can be thought of as a multi-dimensional + * array of MmFreePagesByColor[2][MmSecondaryColors]. Since the number is dynamic, + * we describe the array in pointer form instead. + * + * On a final note, the color tables themselves are right after the PFN database. + */ +C_ASSERT(FreePageList == 1); +PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1]; + /* Make the code cleaner with some definitions for size multiples */ #define _1KB (1024) #define _1MB (1000 * _1KB) @@ -211,6 +224,56 @@ MiComputeColorInformation(VOID) KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; } +VOID +NTAPI +MiInitializeColorTables(VOID) +{ + ULONG i; + PMMPTE PointerPte, LastPte; + MMPTE TempPte = ValidKernelPte; + + /* The color table starts after the PFN database */ + MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[MmHighestPhysicalPage + 1]; + + /* Loop the PTEs. We have two color tables for each secondary color */ + PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]); + LastPte = MiAddressToPte((ULONG_PTR)MmFreePagesByColor[0] + + (2 * MmSecondaryColors * sizeof(MMCOLOR_TABLES)) + - 1); + while (PointerPte <= LastPte) + { + /* Check for valid PTE */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Get a page and map it */ + TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero out the page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next */ + PointerPte++; + } + + /* Now set the address of the next list, right after this one */ + MmFreePagesByColor[1] = &MmFreePagesByColor[0][MmSecondaryColors]; + + /* Now loop the lists to set them up */ + for (i = 0; i < MmSecondaryColors; i++) + { + /* Set both free and zero lists for each color */ + MmFreePagesByColor[ZeroedPageList][i].Flink = 0xFFFFFFFF; + MmFreePagesByColor[ZeroedPageList][i].Blink = (PVOID)0xFFFFFFFF; + MmFreePagesByColor[ZeroedPageList][i].Count = 0; + MmFreePagesByColor[FreePageList][i].Flink = 0xFFFFFFFF; + MmFreePagesByColor[FreePageList][i].Blink = (PVOID)0xFFFFFFFF; + MmFreePagesByColor[FreePageList][i].Count = 0; + } +} + NTSTATUS NTAPI MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -373,10 +436,11 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MiComputeColorInformation(); // - // Calculate the number of bytes for the PFN database + // Calculate the number of bytes for the PFN database, and the color tables, // and then convert to pages // MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); + MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2); MxPfnAllocation >>= PAGE_SHIFT; // @@ -688,6 +752,9 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // MxFreeDescriptor->BasePage = FreePage; MxFreeDescriptor->PageCount = FreePageCount; + + /* Initialize the color tables */ + MiInitializeColorTables(); /* Call back into shitMM to setup the PFN database */ MmInitializePageList(); diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 188b024e2cc..a308d831a99 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -130,6 +130,13 @@ typedef struct _PHYSICAL_MEMORY_DESCRIPTOR PHYSICAL_MEMORY_RUN Run[1]; } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR; +typedef struct _MMCOLOR_TABLES +{ + PFN_NUMBER Flink; + PVOID Blink; + PFN_NUMBER Count; +} MMCOLOR_TABLES, *PMMCOLOR_TABLES; + extern MMPTE HyperTemplatePte; extern MMPTE ValidKernelPde; extern MMPTE ValidKernelPte; From 35ebed76707b16f2413ee1f2adf2404b974f93da Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Wed, 10 Feb 2010 19:33:10 +0000 Subject: [PATCH 74/97] Update Rapps Links and add the two RosBE Addons. svn path=/trunk/; revision=45559 --- .../applications/rapps/rapps/mirandaim.txt | 4 ++-- .../base/applications/rapps/rapps/rosbe.txt | 8 +++---- .../applications/rapps/rapps/rosbeamd64.txt | 21 +++++++++++++++++++ .../applications/rapps/rapps/rosbearm.txt | 21 +++++++++++++++++++ .../base/applications/rapps/rapps/scite.txt | 4 ++-- .../applications/rapps/rapps/thunderbird.txt | 12 +++++------ .../applications/rapps/rapps/utorrent.txt | 6 +++--- reactos/base/applications/rapps/rapps/vlc.txt | 4 ++-- 8 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 reactos/base/applications/rapps/rapps/rosbeamd64.txt create mode 100644 reactos/base/applications/rapps/rapps/rosbearm.txt diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index a447fcecab9..5b817e16f37 100644 --- a/reactos/base/applications/rapps/rapps/mirandaim.txt +++ b/reactos/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.12 +Version = 0.8.13 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.6MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.12-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.13-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/rosbe.txt b/reactos/base/applications/rapps/rapps/rosbe.txt index 843f75df7e6..7d7918b5c78 100644 --- a/reactos/base/applications/rapps/rapps/rosbe.txt +++ b/reactos/base/applications/rapps/rapps/rosbe.txt @@ -2,17 +2,17 @@ [Section] Name = ReactOS Build Environment -Version = 1.4.5 +Version = 1.5 Licence = GPL Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki. -Size = 14.9MB +Size = 13.5MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.4.5.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.exe CDPath = none [Section.0407] -Description = Erlaubt es Ihnen ReactOS aus den Quellen zu bauen. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. +Description = Erlaubt es Ihnen den ReactOS Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. [Section.040a] Description = Te permite compilar el código de ReactOS. Para más instrucciones consulta la wiki de ReactOS. diff --git a/reactos/base/applications/rapps/rapps/rosbeamd64.txt b/reactos/base/applications/rapps/rapps/rosbeamd64.txt new file mode 100644 index 00000000000..c68b47af04f --- /dev/null +++ b/reactos/base/applications/rapps/rapps/rosbeamd64.txt @@ -0,0 +1,21 @@ +; UTF-8 + +[Section] +Name = ReactOS Build Environment AMD64 Addon +Version = 1.3 +Licence = GPL +Description = Allows you to build the ReactOS AMD64 Source. For more instructions see ReactOS wiki. +Size = 15.8MB +Category = 7 +URLSite = http://reactos.org/wiki/Build_Environment/ +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE64-1.3.exe +CDPath = none + +[Section.0407] +Description = Erlaubt es Ihnen den ReactOS AMD64 Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. + +[Section.040a] +Description = Te permite compilar el código de ReactOS AMD64. Para más instrucciones consulta la wiki de ReactOS. + +[Section.0415] +Description = Pozwala zbudować obraz pÅ‚yty ReactOS AMD64 ze źródeÅ‚. WiÄ™cej informacji na Wiki ReactOS. diff --git a/reactos/base/applications/rapps/rapps/rosbearm.txt b/reactos/base/applications/rapps/rapps/rosbearm.txt new file mode 100644 index 00000000000..61596d78dee --- /dev/null +++ b/reactos/base/applications/rapps/rapps/rosbearm.txt @@ -0,0 +1,21 @@ +; UTF-8 + +[Section] +Name = ReactOS Build Environment ARM Addon +Version = 1.0 +Licence = GPL +Description = Allows you to build the ReactOS ARM Source. For more instructions see ReactOS wiki. +Size = 11.1MB +Category = 7 +URLSite = http://reactos.org/wiki/Build_Environment/ +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-ARM-1.0.exe +CDPath = none + +[Section.0407] +Description = Erlaubt es Ihnen den ReactOS ARM Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. + +[Section.040a] +Description = Te permite compilar el código de ReactOS ARM. Para más instrucciones consulta la wiki de ReactOS. + +[Section.0415] +Description = Pozwala zbudować obraz pÅ‚yty ReactOS ARM ze źródeÅ‚. WiÄ™cej informacji na Wiki ReactOS. diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index 0ec430fe396..5e2562dacbe 100644 --- a/reactos/base/applications/rapps/rapps/scite.txt +++ b/reactos/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.01 +Version = 2.02 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://fastbull.dl.sourceforge.net/sourceforge/scintilla/Sc201.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc202.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/thunderbird.txt b/reactos/base/applications/rapps/rapps/thunderbird.txt index fa47d4bc1bc..ca8fd86bdf9 100644 --- a/reactos/base/applications/rapps/rapps/thunderbird.txt +++ b/reactos/base/applications/rapps/rapps/thunderbird.txt @@ -2,35 +2,35 @@ [Section] Name = Mozilla Thunderbird -Version = 3.0 +Version = 3.0.1 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 8.6M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/en-US/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/en-US/Thunderbird%20Setup%203.0.1.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. Size = 8.4M URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/de/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/de/Thunderbird%20Setup%203.0.1.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. Size = 8.4M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/es-ES/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/es-ES/Thunderbird%20Setup%203.0.1.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. Size = 9.2M URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/pl/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/pl/Thunderbird%20Setup%203.0.1.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных почтовых клиентов. Size = 8.8M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/ru/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.1/win32/ru/Thunderbird%20Setup%203.0.1.exe diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt index 41a5f004f68..988263777c5 100644 --- a/reactos/base/applications/rapps/rapps/utorrent.txt +++ b/reactos/base/applications/rapps/rapps/utorrent.txt @@ -2,13 +2,13 @@ [Section] Name = µTorrent -Version = 1.8.5 +Version = 2.0 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 282K +Size = 312K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/1.8.5/utorrent.exe +URLDownload = http://download.utorrent.com/2.0/utorrent.exe CDPath = none diff --git a/reactos/base/applications/rapps/rapps/vlc.txt b/reactos/base/applications/rapps/rapps/vlc.txt index 3a0d4e69777..d3d11d2fb76 100644 --- a/reactos/base/applications/rapps/rapps/vlc.txt +++ b/reactos/base/applications/rapps/rapps/vlc.txt @@ -2,13 +2,13 @@ [Section] Name = VLC media player -Version = 1.0.3 +Version = 1.0.5 Licence = GPL Description = A media player. Size = 17.2MB Category = 1 URLSite = http://www.videolan.org/vlc/ -URLDownload = http://mirror.services.wisc.edu/mirrors/videolan/vlc/1.0.3/win32/vlc-1.0.3-win32.exe +URLDownload = http://mirror.services.wisc.edu/mirrors/videolan/vlc/1.0.5/win32/vlc-1.0.5-win32.exe CDPath = none [Section.0407] From 350a658937d111491ff45e99ef331e3754616609 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 10 Feb 2010 19:35:13 +0000 Subject: [PATCH 75/97] Add device location information override PS/2 keyboards. Please translate the location override string. svn path=/trunk/; revision=45560 --- reactos/media/inf/keyboard.inf | Bin 5972 -> 6374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/keyboard.inf b/reactos/media/inf/keyboard.inf index de09d2bb4e62f3da60a4b557ce3567a5b8f4ed12..fd4c24e82c924ca28179f1c2308e9c7ac54ff69b 100644 GIT binary patch delta 694 zcma))&q@MO6vmHA!i1B`s6z{3#!!PInh4w!BCaf>98USCS@-Y^c|60yf#OsPTThrIyKSB`FWX*wC+q3n_`hFQcd=S+j^OfQp4=m>H+hes$Yu||bBvR_B%CH66G)L*z`UDz zJM%8)Bg_Yx_XF8ym^U-;WZuX;`2e4c<^rJL8KBfr<^w<>1%?AS6l+fY&+93HU3Ne7 z Date: Wed, 10 Feb 2010 19:50:30 +0000 Subject: [PATCH 76/97] Experimental try to get Itunes Setup start. By Samuel Serapion svn path=/trunk/; revision=45561 --- reactos/dll/win32/cfgmgr32/cfgmgr32.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/dll/win32/cfgmgr32/cfgmgr32.spec b/reactos/dll/win32/cfgmgr32/cfgmgr32.spec index d8ebbe78e47..f1c54cb363a 100644 --- a/reactos/dll/win32/cfgmgr32/cfgmgr32.spec +++ b/reactos/dll/win32/cfgmgr32/cfgmgr32.spec @@ -140,6 +140,8 @@ @ stdcall CM_Open_Class_Key_ExW(ptr wstr long long ptr long long) setupapi.CM_Open_Class_Key_ExW @ stdcall CM_Open_DevNode_Key(ptr long long long ptr long) setupapi.CM_Open_DevNode_Key @ stdcall CM_Open_DevNode_Key_Ex(ptr long long long ptr long long) setupapi.CM_Open_DevNode_Key_Ex +@ stub CM_Query_And_Remove_SubTreeA +@ stub CM_Query_And_Remove_SubTreeW @ stub CM_Query_Arbitrator_Free_Data # setupapi.CM_Query_Arbitrator_Free_Data @ stub CM_Query_Arbitrator_Free_Data_Ex # setupapi.CM_Query_Arbitrator_Free_Data_Ex @ stub CM_Query_Arbitrator_Free_Size # setupapi.CM_Query_Arbitrator_Free_Size From 1d7c77f2a779b4329f5b754018b4920877c97621 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Wed, 10 Feb 2010 19:56:27 +0000 Subject: [PATCH 77/97] partially revert changes from 45560 svn path=/trunk/; revision=45562 --- reactos/media/inf/keyboard.inf | Bin 6374 -> 6374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/keyboard.inf b/reactos/media/inf/keyboard.inf index fd4c24e82c924ca28179f1c2308e9c7ac54ff69b..a3cb6e6fa8b867234ebc59b93078e6addbec4282 100644 GIT binary patch delta 338 zcmaE6_{?yFmY~D}=H1NOnRhWCVLr&bAILt#yqS3?^G4>$2l!+(7XSs%0HuyH9{>s| zFdV?4Sab4!UQY?^viq4QKM+#d%q678#I@GokHH-vK4}0lUUH|weuK{j2fzXf3@J zFj!&H05aYbi%|wFn>UCxF*0W}7EM+ZRh)c>k58(EA(J7GL7Y*6A)6tGA(5dB$WLS_ XVaR5jTqhC315^s+Dlzafa4`S?UP@uf delta 328 zcmaE6_{?yFmY}#j0|b^pX$UWI@_s&9RfJ3dLn4C$Ljg9mlj|jX#j(mT*iXJMq`a9+ zNR5dTW{o|_V7R3qQ3Zs>lN%+xkyPFnQr!GVM1xTnt{F)w&=_qj;;059sV@{a$7;?( zQS;5u#C#Z;OBsqLD~c*kzQe~SRl< Date: Wed, 10 Feb 2010 20:11:13 +0000 Subject: [PATCH 78/97] Add french translations for location overrides. svn path=/trunk/; revision=45563 --- reactos/media/inf/keyboard.inf | Bin 6374 -> 6474 bytes reactos/media/inf/msmouse.inf | Bin 19248 -> 19342 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/keyboard.inf b/reactos/media/inf/keyboard.inf index a3cb6e6fa8b867234ebc59b93078e6addbec4282..de7023a77ddbc1de1b4f81c8832eb7bcbac4e498 100644 GIT binary patch delta 81 zcmaE6c*7+x|cFcdSC0!0)Uau`y9WC24y gkXHg^1uz6N=rb5GC{5ldEx) Date: Wed, 10 Feb 2010 21:55:51 +0000 Subject: [PATCH 79/97] [rbuild] - Major improvements in the msvc backend - Create a .vsprops file for every configuration in the root folder. This lets us make vcproj files a lot smaller - When building with our headers actually use all of our headers and not a mix of our sdks and the headers of the crt that comes with msvc - Add a rule to build .s files based on the idea by jcatena - Add a rule for .spec and .pspec files. pspec doesn't work well yet - Various fixes - Please note the the above are aplied only to the vcproj files and not to the vcxrpoj files The above let us compile large parts of trunk with the generated visual studio projects svn path=/trunk/; revision=45564 --- .../rbuild/backend/mingw/modulehandler.cpp | 23 +- .../rbuild/backend/mingw/modulehandler.h | 7 - reactos/tools/rbuild/backend/msvc/msvc.cpp | 23 +- reactos/tools/rbuild/backend/msvc/msvc.h | 31 ++ .../rbuild/backend/msvc/s_as_mscpp.rules | 44 ++ reactos/tools/rbuild/backend/msvc/spec.rules | 57 +++ .../tools/rbuild/backend/msvc/vcprojmaker.cpp | 433 ++++++------------ .../rbuild/backend/msvc/vspropsmaker.cpp | 274 +++++++++++ reactos/tools/rbuild/module.cpp | 18 + reactos/tools/rbuild/project.cpp | 8 + reactos/tools/rbuild/rbuild.cpp | 5 + reactos/tools/rbuild/rbuild.h | 9 + reactos/tools/rbuild/rbuild.mak | 7 +- reactos/tools/rbuild/rbuild.vcproj | 6 +- 14 files changed, 624 insertions(+), 321 deletions(-) create mode 100644 reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules create mode 100644 reactos/tools/rbuild/backend/msvc/spec.rules create mode 100644 reactos/tools/rbuild/backend/msvc/vspropsmaker.cpp diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp index a372a71b24e..8bff6ea0b16 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp @@ -1021,7 +1021,7 @@ MingwModuleHandler::GenerateObjectMacros ( } CleanupCompilationUnitVector ( sourceCompilationUnits ); - if ( IsSpecDefinitionFile() ) + if ( module.IsSpecDefinitionFile() ) { const FileLocation *stubs_file = new FileLocation( IntermediateDirectory, @@ -1820,7 +1820,7 @@ MingwModuleHandler::GenerateRules () } - spec = IsSpecDefinitionFile(); + spec = module.IsSpecDefinitionFile(); if(spec) { @@ -1979,23 +1979,6 @@ MingwModuleHandler::GeneratePreconditionDependencies () fprintf ( fMakefile, "\n" ); } -SpecFileType -MingwModuleHandler::IsSpecDefinitionFile () const -{ - if(!module.importLibrary) - return None; - - std::string ext = GetExtension ( *module.importLibrary->source ); - - if ( ext == ".spec" ) - return Spec; - - if ( ext == ".pspec" ) - return PSpec; - - return None; -} - /* caller needs to delete the returned object */ const FileLocation* MingwModuleHandler::GetDefinitionFilename () const @@ -2003,7 +1986,7 @@ MingwModuleHandler::GetDefinitionFilename () const if ( module.importLibrary == NULL ) return NULL; - if ( IsSpecDefinitionFile () ) + if ( module.IsSpecDefinitionFile () ) { return new FileLocation ( IntermediateDirectory, module.importLibrary->source->relative_path, diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.h b/reactos/tools/rbuild/backend/mingw/modulehandler.h index b0687177d9a..797f075812a 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.h +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.h @@ -32,13 +32,6 @@ PrefixFilename ( const std::string& filename, const std::string& prefix ); -enum SpecFileType -{ - None, - Spec = 1, - PSpec = 2 -}; - class MingwModuleHandler { public: diff --git a/reactos/tools/rbuild/backend/msvc/msvc.cpp b/reactos/tools/rbuild/backend/msvc/msvc.cpp index 90aa37c0ddc..8991147a61a 100644 --- a/reactos/tools/rbuild/backend/msvc/msvc.cpp +++ b/reactos/tools/rbuild/backend/msvc/msvc.cpp @@ -83,7 +83,6 @@ MSVCBackend::MSVCBackend(Project &project, void MSVCBackend::Process() { - // TODO FIXME wine hack? bool only_msvc_headers = false; while ( m_configurations.size () > 0 ) @@ -95,14 +94,14 @@ void MSVCBackend::Process() m_configurations.push_back ( new MSVCConfiguration( Debug )); m_configurations.push_back ( new MSVCConfiguration( Release )); - m_configurations.push_back ( new MSVCConfiguration( Speed )); +// m_configurations.push_back ( new MSVCConfiguration( Speed )); m_configurations.push_back ( new MSVCConfiguration( RosBuild )); if (!only_msvc_headers) { m_configurations.push_back ( new MSVCConfiguration( Debug, ReactOSHeaders )); m_configurations.push_back ( new MSVCConfiguration( Release, ReactOSHeaders )); - m_configurations.push_back ( new MSVCConfiguration( Speed, ReactOSHeaders )); +// m_configurations.push_back ( new MSVCConfiguration( Speed, ReactOSHeaders )); } if ( configuration.CleanAsYouGo ) { @@ -118,6 +117,22 @@ void MSVCBackend::Process() filename_sln += "_auto.sln"; printf ( "Creating MSVC workspace: %s\n", filename_sln.c_str() ); + //Write a property page for each configuration + for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ ) + { + MSVCConfiguration* cfg = m_configurations[icfg]; + + //RosBuild doesn't need a property page + if(cfg->optimization == RosBuild) + continue; + + string filename_props( cfg->name ); + filename_props += ".vsprops"; + //Write the propery pages files + PropsMaker propsMaker( configuration, &ProjectNode, filename_props, cfg ); + propsMaker._generate_props( _get_solution_version(), _get_studio_version() ); + } + // Write out the project files ProcessModules(); @@ -376,7 +391,7 @@ MSVCBackend::_get_object_files ( const Module& module, vector& out) cons void MSVCBackend::_get_def_files ( const Module& module, vector& out) const { - if (module.HasImportLibrary ()) + if (module.HasImportLibrary()) { #if 0 string modulename = module.GetBasePath (); diff --git a/reactos/tools/rbuild/backend/msvc/msvc.h b/reactos/tools/rbuild/backend/msvc/msvc.h index fde4b81657e..4be80c64c99 100644 --- a/reactos/tools/rbuild/backend/msvc/msvc.h +++ b/reactos/tools/rbuild/backend/msvc/msvc.h @@ -179,6 +179,7 @@ class VCProjMaker : public ProjMaker private: void _generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ); void _generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ); + std::string _get_file_path( FileLocation* file, std::string relative_path); }; class VCXProjMaker : public ProjMaker @@ -222,4 +223,34 @@ class SlnMaker void _generate_sln_configurations ( std::string vcproj_guid ); }; +class PropsMaker +{ + public: + PropsMaker ( Configuration& buildConfig, + Project* ProjectNode, + std::string filename_props, + MSVCConfiguration* msvc_configs); + + ~PropsMaker (); + + void _generate_props ( std::string solution_version, std::string studio_version ); + + private: + Configuration m_configuration; + Project* m_ProjectNode; + FILE* OUT; + MSVCConfiguration* m_msvc_config; + bool debug; + bool release; + bool speed; + bool use_ros_headers; + + void _generate_header(); + void _generate_tools_defaults(); + void _generate_macro(std::string Name, std::string Value, bool EvairomentVariable); + void _generate_global_includes(); + void _generate_global_definitions(); + void _generate_footer(); + +}; #endif // __MSVC_H__ diff --git a/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules b/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules new file mode 100644 index 00000000000..d61a5247496 --- /dev/null +++ b/reactos/tools/rbuild/backend/msvc/s_as_mscpp.rules @@ -0,0 +1,44 @@ + + + + + + + + + + + + + diff --git a/reactos/tools/rbuild/backend/msvc/spec.rules b/reactos/tools/rbuild/backend/msvc/spec.rules new file mode 100644 index 00000000000..7aa12cb2598 --- /dev/null +++ b/reactos/tools/rbuild/backend/msvc/spec.rules @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + diff --git a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp index 36a37380265..582601b3a77 100644 --- a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp +++ b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp @@ -80,6 +80,28 @@ VCProjMaker::~VCProjMaker() fclose ( OUT ); } +std::string +VCProjMaker::_get_file_path( FileLocation* file, std::string relative_path) +{ + if (file->directory == SourceDirectory) + { + // We want the full path here for directory support later on + return Path::RelativeFromDirectory (file->relative_path, relative_path ); + } + else if(file->directory == IntermediateDirectory) + { + return std::string("$(obj)\\") + file->relative_path; + } + else if(file->directory == OutputDirectory) + { + return std::string("$(out)\\") + file->relative_path; + } + + return std::string(""); +} + + + void VCProjMaker::_generate_proj_file ( const Module& module ) { @@ -91,7 +113,6 @@ VCProjMaker::_generate_proj_file ( const Module& module ) // make sure the containers are empty header_files.clear(); includes.clear(); - includes_ros.clear(); libraries.clear(); common_defines.clear(); @@ -110,21 +131,8 @@ VCProjMaker::_generate_proj_file ( const Module& module ) printf ( "Creating MSVC project: '%s'\n", vcproj_file.c_str() ); string path_basedir = module.GetPathToBaseDir (); - string intenv = Environment::GetIntermediatePath (); - string outenv = Environment::GetOutputPath (); - string outdir; - string intdir; string vcdir; - if ( intenv == "obj-i386" ) - intdir = path_basedir + "obj-i386"; /* append relative dir from project dir */ - else - intdir = intenv; - - if ( outenv == "output-i386" ) - outdir = path_basedir + "output-i386"; - else - outdir = outenv; if ( configuration.UseVSVersionInPath ) { @@ -135,93 +143,65 @@ VCProjMaker::_generate_proj_file ( const Module& module ) vector source_files, resource_files; vector ifs_list; - ifs_list.push_back ( &module.project.non_if_data ); - ifs_list.push_back ( &module.non_if_data ); - while ( ifs_list.size() ) + const IfableData& data = module.non_if_data/**ifs_list.back()*/; + const vector& files = data.files; + for ( i = 0; i < files.size(); i++ ) { - const IfableData& data = *ifs_list.back(); - ifs_list.pop_back(); - const vector& files = data.files; - for ( i = 0; i < files.size(); i++ ) - { - if (files[i]->file.directory != SourceDirectory) - continue; + string path = _get_file_path(&files[i]->file, module.output->relative_path); + string file = path + std::string("\\") + files[i]->file.name; - // We want the full path here for directory support later on - string path = Path::RelativeFromDirectory ( - files[i]->file.relative_path, - module.output->relative_path ); - string file = path + std::string("\\") + files[i]->file.name; - - if ( !stricmp ( Right(file,3).c_str(), ".rc" ) ) - resource_files.push_back ( file ); - else if ( !stricmp ( Right(file,2).c_str(), ".h" ) ) - header_files.push_back ( file ); - else - source_files.push_back ( file ); - } - const vector& incs = data.includes; - for ( i = 0; i < incs.size(); i++ ) - { - string path = Path::RelativeFromDirectory ( - incs[i]->directory->relative_path, - module.output->relative_path ); - if ( module.type != RpcServer && module.type != RpcClient ) - { - if ( path.find ("/include/reactos/idl") != string::npos) - { - include_idl = true; - continue; - } - } - // switch between general headers and ros headers - if ( !strncmp(incs[i]->directory->relative_path.c_str(), "include\\crt", 11 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\ddk", 11 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\GL", 10 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\psdk", 12 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\reactos\\wine", 20 ) ) - { - if (strncmp(incs[i]->directory->relative_path.c_str(), "include\\crt", 11 )) - // not crt include - includes_ros.push_back ( path ); - } - else - { - includes.push_back ( path ); - } - } - const vector& libs = data.libraries; - for ( i = 0; i < libs.size(); i++ ) - { - string libpath = outdir + "\\" + libs[i]->importedModule->output->relative_path + "\\" + _get_vc_dir() + "\\---\\" + libs[i]->name + ".lib"; - libraries.push_back ( libpath ); - } - const vector& defs = data.defines; - for ( i = 0; i < defs.size(); i++ ) - { - if ( defs[i]->backend != "" && defs[i]->backend != "msvc" ) - continue; - - if ( defs[i]->value[0] ) - common_defines.insert( defs[i]->name + "=" + defs[i]->value ); - else - common_defines.insert( defs[i]->name ); - } - for ( std::map::const_iterator p = data.properties.begin(); p != data.properties.end(); ++ p ) - { - Property& prop = *p->second; - if ( strstr ( module.baseaddress.c_str(), prop.name.c_str() ) ) - baseaddr = prop.value; - } + if ( !stricmp ( Right(file,3).c_str(), ".rc" ) ) + resource_files.push_back ( file ); + else if ( !stricmp ( Right(file,2).c_str(), ".h" ) ) + header_files.push_back ( file ); + else + source_files.push_back ( file ); } - /* include intermediate path for reactos.rc */ - string version = intdir + "\\include"; - includes.push_back (version); - version += "\\reactos"; - includes.push_back (version); + const vector& incs = data.includes; + for ( i = 0; i < incs.size(); i++ ) + { + string path = _get_file_path(incs[i]->directory, module.output->relative_path); - string include_string; + if ( module.type != RpcServer && module.type != RpcClient ) + { + if ( path.find ("/include/reactos/idl") != string::npos) + { + include_idl = true; + continue; + } + } + includes.push_back ( path ); + } + const vector& libs = data.libraries; + for ( i = 0; i < libs.size(); i++ ) + { + string libpath = "$(out)\\" + libs[i]->importedModule->output->relative_path + "\\" + _get_vc_dir() + "\\$(ConfigurationName)\\" + libs[i]->name + ".lib"; + libraries.push_back ( libpath ); + } + const vector& defs = data.defines; + for ( i = 0; i < defs.size(); i++ ) + { + if ( defs[i]->backend != "" && defs[i]->backend != "msvc" ) + continue; + + if ( defs[i]->value[0] ) + common_defines.insert( defs[i]->name + "=" + defs[i]->value ); + else + common_defines.insert( defs[i]->name ); + } + for ( std::map::const_iterator p = data.properties.begin(); p != data.properties.end(); ++ p ) + { + Property& prop = *p->second; + if ( strstr ( module.baseaddress.c_str(), prop.name.c_str() ) ) + baseaddr = prop.value; + } + + if(module.IsSpecDefinitionFile()) + { + std::string path = _get_file_path(module.importLibrary->source, module.output->relative_path); + source_files.push_back ( path + std::string("\\") + module.importLibrary->source->name ); + } fprintf ( OUT, "\r\n" ); fprintf ( OUT, "\r\n" ); fprintf ( OUT, "\t\r\n" ); + fprintf ( OUT, "\t\r\n" ); + fprintf ( OUT, "\t\t\r\n" ); + fprintf ( OUT, "\t\t\r\n" ); + fprintf ( OUT, "\t\r\n" ); + // Set the binary type string module_type = GetExtension(*module.output); BinaryType binaryType; @@ -335,21 +324,8 @@ VCProjMaker::_generate_proj_file ( const Module& module ) { const MSVCConfiguration& config = *m_configurations[iconfig]; - if (( isrcfile == 0 ) && ( module.pch != NULL )) - { - /* little hack to speed up PCH */ - fprintf ( OUT, "%s\t\r\n" ); - fprintf ( OUT, "%s\t\t\r\n", indent_tab.c_str() ); - fprintf ( OUT, "%s\t\r\n", indent_tab.c_str() ); - } - //if (configuration.VSProjectVersion < "8.00") { - if ((source_file.find(".idl") != string::npos) || ((source_file.find(".asm") != string::npos || tolower(source_file.at(source_file.size() - 1)) == 's'))) + if ((source_file.find(".idl") != string::npos) || ((source_file.find(".asm") != string::npos))) { fprintf ( OUT, "%s\t\r\n", indent_tab.c_str() ); } - else if ((tolower(source_file.at(source_file.size() - 1)) == 's')) - { - fprintf ( OUT, "%s\t\t\tName=\"VCCustomBuildTool\"\r\n", indent_tab.c_str() ); - fprintf ( OUT, "%s\t\t\tCommandLine=\"cl /E "$(InputPath)" %s /D__ASM__ | as -o "$(OutDir)\\$(InputName).obj"\"\r\n", indent_tab.c_str(), include_string.c_str() ); - fprintf ( OUT, "%s\t\t\tOutputs=\"$(OutDir)\\$(InputName).obj\"/>\r\n", indent_tab.c_str() ); - } fprintf ( OUT, "%s\t\r\n", indent_tab.c_str() ); } //} @@ -452,24 +422,19 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, BinaryType binaryType ) { string path_basedir = module.GetPathToBaseDir (); - string intenv = Environment::GetIntermediatePath (); - string outenv = Environment::GetOutputPath (); - string outdir; - string intdir; string vcdir; - bool debug = ( cfg.optimization == Debug ); - bool release = ( cfg.optimization == Release ); - bool speed = ( cfg.optimization == Speed ); - bool include_idl = false; - string include_string; size_t i; string intermediatedir = ""; string importLib; - // don't do the work m_configurations.size() times - if (module.importLibrary != NULL) + + if(module.IsSpecDefinitionFile()) + { + importLib = "$(IntDir)\\$(ProjectName).def"; + } + else if (module.importLibrary != NULL) { intermediatedir = module.output->relative_path + vcdir; importLib = _strip_gcc_deffile(module.importLibrary->source->name, module.importLibrary->source->relative_path, intermediatedir); @@ -491,17 +456,6 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, else CfgType = ConfigUnknown; - - if ( intenv == "obj-i386" ) - intdir = path_basedir + "obj-i386"; /* append relative dir from project dir */ - else - intdir = intenv; - - if ( outenv == "output-i386" ) - outdir = path_basedir + "output-i386"; - else - outdir = outenv; - if ( configuration.UseVSVersionInPath ) { vcdir = DEF_SSEP + _get_vc_dir(); @@ -512,23 +466,58 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, if ( configuration.UseConfigurationInPath ) { - fprintf ( OUT, "\t\t\tOutputDirectory=\"%s\\%s%s\\%s\"\r\n", outdir.c_str (), module.output->relative_path.c_str (), vcdir.c_str (), cfg.name.c_str() ); - fprintf ( OUT, "\t\t\tIntermediateDirectory=\"%s\\%s%s\\%s\"\r\n", intdir.c_str (), module.output->relative_path.c_str (), vcdir.c_str (), cfg.name.c_str() ); + fprintf ( OUT, "\t\t\tOutputDirectory=\"$(out)\\%s%s\\$(ConfigurationName)\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tIntermediateDirectory=\"$(obj)\\%s%s\\$(ConfigurationName)\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); } else { - fprintf ( OUT, "\t\t\tOutputDirectory=\"%s\\%s%s\"\r\n", outdir.c_str (), module.output->relative_path.c_str (), vcdir.c_str () ); - fprintf ( OUT, "\t\t\tIntermediateDirectory=\"%s\\%s%s\"\r\n", intdir.c_str (), module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tOutputDirectory=\"$(out)\\%s%s\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); + fprintf ( OUT, "\t\t\tIntermediateDirectory=\"$(obj)\\%s%s\"\r\n", module.output->relative_path.c_str (), vcdir.c_str () ); } fprintf ( OUT, "\t\t\tConfigurationType=\"%d\"\r\n", CfgType ); + + fprintf ( OUT, "\t\t\tInheritedPropertySheets=\"%s%s.vsprops\"\r\n", path_basedir.c_str (), cfg.name.c_str ()); fprintf ( OUT, "\t\t\tCharacterSet=\"2\"\r\n" ); fprintf ( OUT, "\t\t\t>\r\n" ); fprintf ( OUT, "\t\t\t\r\n" ); - fprintf ( OUT, "\t\t\t\tOptimization=\"%d\"\r\n", release ? 2 : 0 ); + fprintf ( OUT, "\t\t\t\r\n" ); + + + fprintf ( OUT, "\t\t\t 0 ) - fprintf ( OUT, ";" ); - string unescaped = *it1; - fprintf ( OUT, "%s", _replace_str(unescaped, "\"","").c_str() ); + fprintf ( OUT, "%s ; ", _replace_str(unescaped, "\"","").c_str() ); } fprintf ( OUT, "\"\r\n" ); - fprintf ( OUT, "\t\t\t\tForcedIncludeFiles=\"%s\"\r\n", "warning.h"); - fprintf ( OUT, "\t\t\t\tMinimalRebuild=\"%s\"\r\n", speed ? "TRUE" : "FALSE" ); - fprintf ( OUT, "\t\t\t\tBasicRuntimeChecks=\"0\"\r\n" ); - fprintf ( OUT, "\t\t\t\tRuntimeLibrary=\"%d\"\r\n", debug ? 3 : 2 ); // 3=/MDd 2=/MD - fprintf ( OUT, "\t\t\t\tBufferSecurityCheck=\"FALSE\"\r\n" ); - fprintf ( OUT, "\t\t\t\tEnableFunctionLevelLinking=\"FALSE\"\r\n" ); + //disable precompiled headers for now +#if 0 if ( module.pch != NULL ) { fprintf ( OUT, "\t\t\t\tUsePrecompiledHeader=\"2\"\r\n" ); @@ -657,44 +588,17 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, if (pos == string::npos && std::find(header_files.begin(), header_files.end(), pch_path) == header_files.end()) header_files.push_back(pch_path); } - else - { - fprintf ( OUT, "\t\t\t\tUsePrecompiledHeader=\"0\"\r\n" ); - } +#endif - fprintf ( OUT, "\t\t\t\tWholeProgramOptimization=\"%s\"\r\n", release ? "FALSE" : "FALSE"); - if ( release ) - { - fprintf ( OUT, "\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n" ); - fprintf ( OUT, "\t\t\t\tStringPooling=\"true\"\r\n" ); - } + if ( module.cplusplus ) + fprintf ( OUT, "\t\t\t\tCompileAs=\"2\"\r\n" ); - fprintf ( OUT, "\t\t\t\tWarningLevel=\"%s\"\r\n", speed ? "0" : "3" ); - fprintf ( OUT, "\t\t\t\tDetect64BitPortabilityProblems=\"%s\"\r\n", "FALSE"); - if ( !module.cplusplus ) - fprintf ( OUT, "\t\t\t\tCompileAs=\"1\"\r\n" ); - - if ( module.type == Win32CUI || module.type == Win32GUI ) - { - fprintf ( OUT, "\t\t\t\tCallingConvention=\"%d\"\r\n", 0 ); // 0=__cdecl - } - else - { - fprintf ( OUT, "\t\t\t\tCallingConvention=\"%d\"\r\n", 2 ); // 2=__stdcall - } - - fprintf ( OUT, "\t\t\t\tDebugInformationFormat=\"%s\"/>\r\n", speed ? "0" : release ? "3": "4"); // 3=/Zi 4=ZI + fprintf ( OUT, "\t\t\t/>\r\n"); fprintf ( OUT, "\t\t\t\r\n" ); - if ( binaryType == Lib ) - { - fprintf ( OUT, "\t\t\t\r\n", module.name.c_str() ); - } - else + if ( binaryType != Lib ) { fprintf ( OUT, "\t\t\t 0) - fprintf ( OUT, ";" ); - } - // Add conventional libraries dirs for (i = 0; i < libraries.size (); i++) { @@ -754,7 +639,6 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, fprintf ( OUT, ";" ); string libpath = libraries[i].c_str(); - libpath.replace (libpath.find("---"), 3, cfg.name); libpath = libpath.substr (0, libpath.find_last_of ("\\") ); fprintf ( OUT, "%s", libpath.c_str() ); } @@ -762,13 +646,6 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, fprintf ( OUT, "\"\r\n" ); fprintf ( OUT, "\t\t\t\tOutputFile=\"$(OutDir)/%s%s\"\r\n", module.name.c_str(), module_type.c_str() ); - fprintf ( OUT, "\t\t\t\tLinkIncremental=\"%d\"\r\n", debug ? 2 : 1 ); - fprintf ( OUT, "\t\t\t\tGenerateDebugInformation=\"%s\"\r\n", speed ? "FALSE" : "TRUE" ); - fprintf ( OUT, "\t\t\t\tLinkTimeCodeGeneration=\"%d\"\r\n", release? 0 : 0); // whole program optimization - - if ( debug ) - fprintf ( OUT, "\t\t\t\tProgramDatabaseFile=\"$(OutDir)/%s.pdb\"\r\n", module.name.c_str() ); - if ( binaryType == Sys ) { if (module.GetEntryPoint() == "0") @@ -831,7 +708,7 @@ void VCProjMaker::_generate_standard_configuration( const Module& module, fprintf ( OUT, "\t\t\t\tIgnoreAllDefaultLibraries=\"TRUE\"\r\n" ); } } - fprintf ( OUT, "\t\t\t\tTargetMachine=\"%d\"/>\r\n", 1 ); + fprintf ( OUT, "\t\t\t/>\r\n" ); } fprintf ( OUT, "\t\t\t\r\n " ); fprintf ( OUT, "\t\t\t\r\n" ); } - fprintf ( OUT, "\t\t\t\r\n" ); - fprintf ( OUT, "\t\t\t\r\n" ); - fprintf ( OUT, "\t\t\t\r\n" ); - fprintf ( OUT, "\t\t\t\r\n" ); - fprintf ( OUT, "\t\t\t\r\n" ); fprintf ( OUT, "\t\t\r\n" ); } diff --git a/reactos/tools/rbuild/backend/msvc/vspropsmaker.cpp b/reactos/tools/rbuild/backend/msvc/vspropsmaker.cpp new file mode 100644 index 00000000000..bd0733919df --- /dev/null +++ b/reactos/tools/rbuild/backend/msvc/vspropsmaker.cpp @@ -0,0 +1,274 @@ +#ifdef _MSC_VER +#pragma warning ( disable : 4786 ) +#endif//_MSC_VER + +#include +#include +#include +#include +#include +#include + +#include + +#include "msvc.h" + +using std::string; +using std::vector; +using std::set; + +typedef set StringSet; + +#ifdef OUT +#undef OUT +#endif//OUT + +PropsMaker::PropsMaker ( Configuration& buildConfig, + Project* ProjectNode, + std::string filename_props, + MSVCConfiguration* msvc_configs) +{ + m_configuration = buildConfig; + m_ProjectNode = ProjectNode; + + m_msvc_config = msvc_configs; + + debug = ( m_msvc_config->optimization == Debug ); + release = ( m_msvc_config->optimization == Release ); + speed = ( m_msvc_config->optimization == Speed ); + use_ros_headers = (m_msvc_config->headers == ReactOSHeaders); + + OUT = fopen ( filename_props.c_str(), "wb" ); + + if ( !OUT ) + { + printf ( "Could not create file '%s'.\n", filename_props.c_str() ); + } +} + +PropsMaker::~PropsMaker ( ) +{ + fclose ( OUT ); +} + +void +PropsMaker::_generate_header() +{ + fprintf ( OUT, "\r\n" ); + fprintf ( OUT, "\r\n", m_msvc_config->name.c_str() ); +} + +void +PropsMaker::_generate_tools_defaults() +{ + fprintf ( OUT, "\t\r\n"); + + //Linker + fprintf ( OUT, "\t\r\n"); + + //Librarian + fprintf ( OUT, "\t\r\n"); + + //Resource compiler + fprintf ( OUT, "\t\t\t\r\n"); +} + +void +PropsMaker::_generate_macro(std::string Name, + std::string Value, + bool EvairomentVariable) +{ + fprintf ( OUT, "\t\r\n"); +} + +void +PropsMaker::_generate_global_includes() +{ + //Generate global includes + //they will be used by the c compiler, the resource compiler + //and the preprocessor for .s and .pspec files + + fprintf ( OUT, "\tnon_if_data; + //const vector& files = data.files; + size_t i; + const vector& incs = data.includes; + for ( i = 0; i < incs.size(); i++ ) + { + if ((strncmp(incs[i]->directory->relative_path.c_str(), "include\\crt", 11 ) || + strncmp(incs[i]->directory->relative_path.c_str(), "include\\ddk", 11 ) || + strncmp(incs[i]->directory->relative_path.c_str(), "include\\GL", 10 ) || + strncmp(incs[i]->directory->relative_path.c_str(), "include\\psdk", 12 ) || + strncmp(incs[i]->directory->relative_path.c_str(), "include\\reactos\\wine", 20 )) && + ! use_ros_headers) + { + continue; + } + + if(incs[i]->directory->directory == SourceDirectory) + fprintf ( OUT, ""$(src)\\"); + else if (incs[i]->directory->directory == IntermediateDirectory) + fprintf ( OUT, ""$(obj)\\"); + else if (incs[i]->directory->directory == OutputDirectory) + fprintf ( OUT, ""$(out)\\"); + else + continue; + + fprintf ( OUT, incs[i]->directory->relative_path.c_str()); + fprintf ( OUT, "" ; "); + } + + fprintf ( OUT, ""$(obj)\\include" ; "); + fprintf ( OUT, ""$(obj)\\include\\reactos" ; "); + + if ( !use_ros_headers ) + { + // Add WDK or PSDK paths, if user provides them + if (getenv ( "BASEDIR" ) != NULL) + { + string WdkBase = getenv ( "BASEDIR" ); + fprintf ( OUT, ""%s\\inc\\api" ; ", WdkBase.c_str()); + fprintf ( OUT, ""%s\\inc\\crt" ; ", WdkBase.c_str()); + fprintf ( OUT, ""%s\\inc\\ddk" ; ", WdkBase.c_str()); + } + } + fprintf ( OUT, "\"\r\n"); + fprintf ( OUT, "\t\tPerformEnvironmentSet=\"true\"\r\n"); + fprintf( OUT, "\t/>\r\n"); +} + +void +PropsMaker::_generate_global_definitions() +{ + + string global_defines = ""; + + fprintf ( OUT, "\tnon_if_data; + const vector& defs = data.defines; + size_t i; + + for ( i = 0; i < defs.size(); i++ ) + { + if ( defs[i]->backend != "" && defs[i]->backend != "msvc" ) + continue; + + if ( defs[i]->value[0] ) + fprintf ( OUT, "%s=%s",defs[i]->name.c_str(), defs[i]->value.c_str()); + else + fprintf ( OUT, defs[i]->name.c_str()); + fprintf ( OUT, " ; "); + } + + fprintf ( OUT, "\"\r\n"); + fprintf ( OUT, "\t\tPerformEnvironmentSet=\"true\"\r\n"); + fprintf( OUT, "\t/>\r\n"); +} + +void +PropsMaker::_generate_footer() +{ + fprintf ( OUT, "\r\n"); +} + + +void +PropsMaker::_generate_props ( std::string solution_version, + std::string studio_version ) +{ + _generate_header(); + _generate_tools_defaults(); + + string srcdir = Environment::GetSourcePath(); + string intdir = Environment::GetIntermediatePath (); + string outdir = Environment::GetOutputPath (); + string rosbedir = Environment::GetVariable("_ROSBE_BASEDIR"); + + if ( intdir == "obj-i386" ) + intdir = srcdir + "\\obj-i386"; /* append relative dir from project dir */ + + if ( outdir == "output-i386" ) + outdir = srcdir + "\\output-i386"; + + //Generate global macros + _generate_macro("src", srcdir, true); + _generate_macro("out", outdir, true); + _generate_macro("obj", intdir, true); + _generate_macro("Tools", "$(out)\\tools", true); + _generate_macro("RosBE", rosbedir, true); + + _generate_global_includes(); + _generate_global_definitions(); + _generate_footer(); +} diff --git a/reactos/tools/rbuild/module.cpp b/reactos/tools/rbuild/module.cpp index df83ee2bb6c..1fdc5d64964 100644 --- a/reactos/tools/rbuild/module.cpp +++ b/reactos/tools/rbuild/module.cpp @@ -1430,6 +1430,24 @@ Module::GetDllName () const throw new InvalidOperationException ( __FILE__, __LINE__, "Module %s has no dllname." ); } +SpecFileType +Module::IsSpecDefinitionFile () const +{ + if(!importLibrary) + return None; + + std::string ext = GetExtension ( *importLibrary->source ); + + if ( ext == ".spec" ) + return Spec; + + if ( ext == ".pspec" ) + return PSpec; + + return None; +} + + File::File ( DirectoryLocation directory, const string& relative_path, const string& name, diff --git a/reactos/tools/rbuild/project.cpp b/reactos/tools/rbuild/project.cpp index 9378e16b22e..894c8dca515 100644 --- a/reactos/tools/rbuild/project.cpp +++ b/reactos/tools/rbuild/project.cpp @@ -63,6 +63,14 @@ Environment::GetIntermediatePath () } /* static */ string +Environment::GetSourcePath () +{ + char temp[_MAX_PATH]; + getcwd(temp, _MAX_PATH); + return string(temp); +} + +string Environment::GetOutputPath () { string defaultOutput = diff --git a/reactos/tools/rbuild/rbuild.cpp b/reactos/tools/rbuild/rbuild.cpp index 1119f22ca0f..dc098a819c4 100644 --- a/reactos/tools/rbuild/rbuild.cpp +++ b/reactos/tools/rbuild/rbuild.cpp @@ -134,6 +134,11 @@ ParseVCProjectSwitch ( if (configuration.VSProjectVersion.length() == 3) //7.1 configuration.VSProjectVersion.append("0"); + //We should set this here because in the end we will use + //msc sompiler so we need to parse msc specidic + //definitions and includes + configuration.Compiler = MicrosoftC; + break; case 'c': configuration.VSConfigurationType = string (&switchStart[3]); diff --git a/reactos/tools/rbuild/rbuild.h b/reactos/tools/rbuild/rbuild.h index 510203b068f..3635cea4d43 100644 --- a/reactos/tools/rbuild/rbuild.h +++ b/reactos/tools/rbuild/rbuild.h @@ -167,6 +167,13 @@ enum LinkerSet MicrosoftLink }; +enum SpecFileType +{ + None, + Spec = 1, + PSpec = 2 +}; + class Configuration { public: @@ -197,6 +204,7 @@ public: static std::string GetArch (); static std::string GetIntermediatePath (); static std::string GetOutputPath (); + static std::string GetSourcePath (); static std::string GetCdOutputPath (); static std::string GetInstallPath (); static std::string GetAutomakeFile ( const std::string& defaultFile ); @@ -425,6 +433,7 @@ public: void InvokeModule () const; void ProcessXML (); std::string GetDllName() const; + SpecFileType IsSpecDefinitionFile () const; private: void SetImportLibrary ( ImportLibrary* importLibrary ); void SetDelayImportLibrary ( ImportLibrary* importLibrary ); diff --git a/reactos/tools/rbuild/rbuild.mak b/reactos/tools/rbuild/rbuild.mak index f64e21d2335..1a3138f7d14 100644 --- a/reactos/tools/rbuild/rbuild.mak +++ b/reactos/tools/rbuild/rbuild.mak @@ -209,6 +209,7 @@ RBUILD_BACKEND_MSVC_BASE_SOURCES = $(addprefix $(RBUILD_MSVC_BASE_), \ slnmaker.cpp \ vcprojmaker.cpp \ vcxprojmaker.cpp \ + vspropsmaker.cpp \ ) RBUILD_BACKEND_SOURCES = \ @@ -496,7 +497,11 @@ $(RBUILD_MSVC_INT_)msvc.o: $(RBUILD_MSVC_BASE_)msvc.cpp $(RBUILD_HEADERS) | $(RB $(RBUILD_MSVC_INT_)projmaker.o: $(RBUILD_MSVC_BASE_)projmaker.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) $(ECHO_HOSTCC) ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ - + +$(RBUILD_MSVC_INT_)vspropsmaker.o: $(RBUILD_MSVC_BASE_)vspropsmaker.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) + $(ECHO_HOSTCC) + ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ + $(RBUILD_MSVC_INT_)slnmaker.o: $(RBUILD_MSVC_BASE_)slnmaker.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) $(ECHO_HOSTCC) ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ diff --git a/reactos/tools/rbuild/rbuild.vcproj b/reactos/tools/rbuild/rbuild.vcproj index 0d91687b4c3..763850a1804 100644 --- a/reactos/tools/rbuild/rbuild.vcproj +++ b/reactos/tools/rbuild/rbuild.vcproj @@ -1,7 +1,7 @@ + + Date: Wed, 10 Feb 2010 23:24:59 +0000 Subject: [PATCH 80/97] [REACTOS] Add asm.h containing macros to make assembly code both GAS and ML compatible at the same time. [NTOS/HAL] Move trap entry points from C into a GAS/ML compatile assembly file (might need fine tuning for ML). The entries are generated by a shared assembly macro TRAP_ENTRY. Removed KiTrapStub, KiIsV8086TrapSafe, KiIsUserTrapSafe, KiSetSaneSegments, removed segment handling from KiEnter*Trap. [NTOS] Make KiFastCallEntryHandler and KiSystemServiceHandler FASTCALL and pass the systemcall number in TrapFrame->Eax [HAL] Use _setjmp/longjmp instead of saving a trapframe in HalpBiosCall svn path=/trunk/; revision=45565 --- reactos/hal/halx86/generic/bios.c | 58 ++-- reactos/hal/halx86/generic/pic.c | 1 - reactos/hal/halx86/generic/systimer.S | 1 - reactos/hal/halx86/generic/timer.c | 2 - reactos/hal/halx86/generic/trap.S | 23 ++ reactos/hal/halx86/hal.rbuild | 1 + reactos/hal/halx86/hal_generic.rbuild | 1 + reactos/hal/halx86/halmps.rbuild | 1 + reactos/hal/halx86/halxbox.rbuild | 1 + reactos/hal/halx86/mp/apic.c | 21 ++ reactos/include/ndk/i386/asm.h | 2 + reactos/include/reactos/asm.h | 190 ++++++++++++ reactos/ntoskrnl/ex/i386/fastinterlck_asm.S | 6 +- reactos/ntoskrnl/ex/i386/interlck_asm.S | 6 +- .../ntoskrnl/include/internal/i386/asmmacro.S | 206 ++++++++----- reactos/ntoskrnl/include/internal/trap_x.h | 271 ------------------ reactos/ntoskrnl/ke/i386/irqobj.c | 6 +- reactos/ntoskrnl/ke/i386/trap.s | 98 ++++++- reactos/ntoskrnl/ke/i386/traphdlr.c | 80 ++---- reactos/ntoskrnl/ke/i386/usercall_asm.S | 7 +- 20 files changed, 522 insertions(+), 460 deletions(-) create mode 100644 reactos/hal/halx86/generic/trap.S create mode 100644 reactos/include/reactos/asm.h diff --git a/reactos/hal/halx86/generic/bios.c b/reactos/hal/halx86/generic/bios.c index 206ca2d3e3d..262fdd17207 100644 --- a/reactos/hal/halx86/generic/bios.c +++ b/reactos/hal/halx86/generic/bios.c @@ -12,6 +12,9 @@ #include #define NDEBUG #include +#include + +void HalpTrap0D(); /* GLOBALS ********************************************************************/ @@ -47,6 +50,9 @@ ULONG_PTR HalpSavedEsp; /* Where the real mode code ends */ extern PVOID HalpRealModeEnd; +/* Context saved for return from v86 mode */ +jmp_buf HalpSavedContext; + /* REAL MODE CODE AND STACK START HERE ****************************************/ VOID @@ -230,60 +236,44 @@ HalpTrap0DHandler(IN PKTRAP_FRAME TrapFrame) while (TRUE); } -KiTrap(HalpTrap0D, 0); - VOID DECLSPEC_NORETURN -HalpTrap06(VOID) +HalpTrap06() { - PKTRAP_FRAME TrapFrame; - /* Restore ES/DS to known good values first */ Ke386SetEs(KGDT_R3_DATA | RPL_MASK); Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - - /* Read trap frame address */ - TrapFrame = (PKTRAP_FRAME)HalpSavedEsp; - - /* Restore segments from the trap frame */ - Ke386SetGs(TrapFrame->SegGs); - Ke386SetFs(TrapFrame->SegFs); - Ke386SetEs(TrapFrame->SegEs); - Ke386SetDs(TrapFrame->SegDs); - - /* Restore EFlags */ - __writeeflags(TrapFrame->EFlags); - - /* Exit the V86 mode trap frame */ - KiCallReturn(TrapFrame); + + /* Restore the stack */ + KeGetPcr()->TSS->Esp0 = HalpSavedEsp0; + + /* Return back to where we left */ + longjmp(HalpSavedContext, 1); + UNREACHABLE; } /* V8086 ENTER ****************************************************************/ VOID -FASTCALL -DECLSPEC_NORETURN -HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame) +NTAPI +HalpBiosCall() { /* Must be volatile so it doesn't get optimized away! */ volatile KTRAP_FRAME V86TrapFrame; ULONG_PTR StackOffset, CodeOffset; - /* Fill out the quick-n-dirty trap frame */ - TrapFrame->EFlags = __readeflags(); - TrapFrame->SegGs = Ke386GetGs(); - TrapFrame->SegFs = Ke386GetFs(); - TrapFrame->SegEs = Ke386GetEs(); - TrapFrame->SegDs = Ke386GetDs(); - - /* Our stack (the frame) */ - HalpSavedEsp = (ULONG_PTR)TrapFrame; + /* Save the context, check for return */ + if (_setjmp(HalpSavedContext)) + { + /* Returned from v86 */ + return; + } /* Kill alignment faults */ __writecr0(__readcr0() & ~CR0_AM); /* Set new stack address */ - KeGetPcr()->TSS->Esp0 = HalpSavedEsp - sizeof(FX_SAVE_AREA); + KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA); /* Compute segmented IP and SP offsets */ StackOffset = (ULONG_PTR)&HalpRealModeEnd - 4 - (ULONG_PTR)HalpRealModeStart; @@ -304,8 +294,6 @@ HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame) KiDirectTrapReturn((PKTRAP_FRAME)&V86TrapFrame); } -KiTrampoline(HalpBiosCall, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY); - /* FUNCTIONS ******************************************************************/ VOID diff --git a/reactos/hal/halx86/generic/pic.c b/reactos/hal/halx86/generic/pic.c index 17adf0a8765..7197b9d91a8 100644 --- a/reactos/hal/halx86/generic/pic.c +++ b/reactos/hal/halx86/generic/pic.c @@ -1335,4 +1335,3 @@ HalpDispatchInterrupt2(VOID) } } -KiTrap(HalpApcInterrupt, KI_SOFTWARE_TRAP); diff --git a/reactos/hal/halx86/generic/systimer.S b/reactos/hal/halx86/generic/systimer.S index 82825b046ce..167bcf5fefd 100644 --- a/reactos/hal/halx86/generic/systimer.S +++ b/reactos/hal/halx86/generic/systimer.S @@ -8,7 +8,6 @@ /* INCLUDES ******************************************************************/ #include -#include .intel_syntax noprefix /* GLOBALS *******************************************************************/ diff --git a/reactos/hal/halx86/generic/timer.c b/reactos/hal/halx86/generic/timer.c index e44259d010f..360d237443d 100644 --- a/reactos/hal/halx86/generic/timer.c +++ b/reactos/hal/halx86/generic/timer.c @@ -161,8 +161,6 @@ HalpProfileInterruptHandler(IN PKTRAP_FRAME TrapFrame) KiEoiHelper(TrapFrame); } -KiTrap(HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE); /* PUBLIC FUNCTIONS ***********************************************************/ diff --git a/reactos/hal/halx86/generic/trap.S b/reactos/hal/halx86/generic/trap.S new file mode 100644 index 00000000000..00fc256387e --- /dev/null +++ b/reactos/hal/halx86/generic/trap.S @@ -0,0 +1,23 @@ +/* + * FILE: ntoskrnl/ke/i386/trap.S + * COPYRIGHT: See COPYING in the top level directory + * PURPOSE: System Traps, Entrypoints and Exitpoints + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + * NOTE: See asmmacro.S for the shared entry/exit code. + */ + +/* INCLUDES ******************************************************************/ + +#include +#include +#include + +.code32 +.text + +TRAP_ENTRY HalpTrap0D, 0 +TRAP_ENTRY HalpApcInterrupt, KI_SOFTWARE_TRAP +TRAP_ENTRY HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE + + diff --git a/reactos/hal/halx86/hal.rbuild b/reactos/hal/halx86/hal.rbuild index e4f7ea6f8da..d87973eb898 100644 --- a/reactos/hal/halx86/hal.rbuild +++ b/reactos/hal/halx86/hal.rbuild @@ -10,6 +10,7 @@ hal_generic hal_generic_up ntoskrnl + libcntpr halinit_up.c halup.rc diff --git a/reactos/hal/halx86/hal_generic.rbuild b/reactos/hal/halx86/hal_generic.rbuild index 9ec3d59bf8e..a8c64ac7bbb 100644 --- a/reactos/hal/halx86/hal_generic.rbuild +++ b/reactos/hal/halx86/hal_generic.rbuild @@ -28,6 +28,7 @@ sysinfo.c systimer.S timer.c + trap.S usage.c diff --git a/reactos/hal/halx86/halmps.rbuild b/reactos/hal/halx86/halmps.rbuild index 74a9f822107..458a58506c1 100644 --- a/reactos/hal/halx86/halmps.rbuild +++ b/reactos/hal/halx86/halmps.rbuild @@ -11,6 +11,7 @@ hal_generic hal_generic_mp ntoskrnl + libcntpr mps.S mpsboot.asm diff --git a/reactos/hal/halx86/halxbox.rbuild b/reactos/hal/halx86/halxbox.rbuild index 7996e653931..3db5216aa71 100644 --- a/reactos/hal/halx86/halxbox.rbuild +++ b/reactos/hal/halx86/halxbox.rbuild @@ -10,6 +10,7 @@ hal_generic hal_generic_up ntoskrnl + libcntpr halinit_xbox.c part_xbox.c diff --git a/reactos/hal/halx86/mp/apic.c b/reactos/hal/halx86/mp/apic.c index 32b5dd51a15..6aea485bbc4 100644 --- a/reactos/hal/halx86/mp/apic.c +++ b/reactos/hal/halx86/mp/apic.c @@ -1110,4 +1110,25 @@ HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack) #endif +VOID +FASTCALL +DECLSPEC_NORETURN +HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame) +{ + /* Set up a fake INT Stack */ + TrapFrame->EFlags = __readeflags(); + TrapFrame->SegCs = KGDT_R0_CODE; + TrapFrame->Eip = TrapFrame->Eax; + + /* Build the trap frame */ + KiEnterInterruptTrap(TrapFrame); + + /* unimplemented */ + UNIMPLEMENTED; + + /* Exit the interrupt */ + KiEoiHelper(TrapFrame); + +} + /* EOF */ diff --git a/reactos/include/ndk/i386/asm.h b/reactos/include/ndk/i386/asm.h index e2dbeb60963..eaaf2ae1bc4 100644 --- a/reactos/include/ndk/i386/asm.h +++ b/reactos/include/ndk/i386/asm.h @@ -248,10 +248,12 @@ Author: #define KINTERRUPT_SERVICE_CONTEXT 0x10 #define KINTERRUPT_TICK_COUNT 0x18 #define KINTERRUPT_ACTUAL_LOCK 0x1C +#define KINTERRUPT_DISPATCH_ADDRESS 0x20 #define KINTERRUPT_VECTOR 0x24 #define KINTERRUPT_IRQL 0x28 #define KINTERRUPT_SYNCHRONIZE_IRQL 0x29 #define KINTERRUPT_DISPATCH_COUNT 0x38 +#define KINTERRUPT_DISPATCH_CODE 0x3C // // KGDTENTRY Offsets diff --git a/reactos/include/reactos/asm.h b/reactos/include/reactos/asm.h new file mode 100644 index 00000000000..1005c1f715d --- /dev/null +++ b/reactos/include/reactos/asm.h @@ -0,0 +1,190 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: ntoskrnl/include/amd64/asmmacro.S + * PURPOSE: ASM macros for for GAS and MASM/ML64 + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#ifdef _MSC_VER + +/* Allow ".name" identifiers */ +OPTION DOTNAME + +.586 +.MODEL FLAT + +/* Hex numbers need to be in 01ABh format */ +#define HEX(x) 0##x##h + +/* Macro values need to be marked */ +#define VAL(x) x + +/* MASM/ML doesn't want explicit [rip] addressing */ +rip = 0 + +/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ +#define MACRO(name, ...) name MACRO __VA_ARGS__ + +/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ +.PROC MACRO name + name PROC FRAME + _name: +ENDM + +/* ... and .ENDP, replacing ENDP */ +.ENDP MACRO name + name ENDP +ENDM + +/* MASM doesn't have an ASCII macro */ +.ASCII MACRO text + DB text +ENDM + +/* MASM doesn't have an ASCIZ macro */ +.ASCIZ MACRO text + DB text, 0 +ENDM + +.text MACRO +ENDM + +.code64 MACRO + .code +ENDM + +.code32 MACRO + .code +ENDM + +UNIMPLEMENTED MACRO name +ENDM + +/* We need this to distinguish repeat from macros */ +#define ENDR ENDM + +#else /***********************************************************************/ + +/* Force intel syntax */ +.intel_syntax noprefix +.code64 + +.altmacro + +/* Hex numbers need to be in 0x1AB format */ +#define HEX(x) 0x##x + +/* Macro values need to be marked */ +#define VAL(x) \x + +/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ +#define MACRO(...) .macro __VA_ARGS__ +#define ENDM .endm + +/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ +.macro .PROC name + .func \name + \name: + .cfi_startproc + .equ cfa_current_offset, -8 +.endm + +/* ... and .ENDP, replacing ENDP */ +.macro .ENDP name + .cfi_endproc + .endfunc +.endm + +/* MASM compatible PUBLIC */ +.macro PUBLIC symbol + .global \symbol +.endm + +/* MASM compatible ALIGN */ +#define ALIGN .align + +/* MASM compatible REPEAT, additional ENDR */ +#define REPEAT .rept +#define ENDR .endr + +/* MASM compatible EXTERN */ +.macro EXTERN name +.endm + +/* MASM needs an END tag */ +#define END + +.macro .MODEL model +.endm + +.macro .code + .text +.endm + +/* Macros for x64 stack unwind OPs */ + +.macro .allocstack size + .cfi_adjust_cfa_offset \size + .set cfa_current_offset, cfa_current_offset - \size +.endm + +code = 1 +.macro .pushframe param=0 + .if (\param) + .cfi_adjust_cfa_offset 0x30 + .set cfa_current_offset, cfa_current_offset - 0x30 + .else + .cfi_adjust_cfa_offset 0x28 + .set cfa_current_offset, cfa_current_offset - 0x28 + .endif +.endm + +.macro .pushreg reg + .cfi_adjust_cfa_offset 8 + .equ cfa_current_offset, cfa_current_offset - 8 + .cfi_offset \reg, cfa_current_offset +.endm + +.macro .savereg reg, offset + // checkme!!! + .cfi_offset \reg, \offset +.endm + +.macro .savexmm128 reg, offset + // checkme!!! + .cfi_offset \reg, \offset +.endm + +.macro .setframe reg, offset + .cfi_def_cfa reg, \offset + .equ cfa_current_offset, \offset +.endm + +.macro .endprolog +.endm + +.macro UNIMPLEMENTED2 file, line, func + + jmp 3f +1: .asciz "\func" +2: .asciz \file +3: + sub rsp, 0x20 + lea rcx, MsgUnimplemented[rip] + lea rdx, 1b[rip] + lea r8, 2b[rip] + mov r9, \line + call DbgPrint + add rsp, 0x20 +.endm +#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__, + +/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time + conditionals. We therefore use "if", too. .if shouldn't be used at all */ +#define if .if +#define endif .endif +#define else .else +#define elseif .elseif + +#endif diff --git a/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S b/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S index 5331162a6a3..f09edfd3b9c 100644 --- a/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S +++ b/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S @@ -7,12 +7,16 @@ */ /* INCLUDES ******************************************************************/ + +#include #include #include -.intel_syntax noprefix /* FUNCTIONS ****************************************************************/ +.code32 +.text + /* * NOTE: These functions must obey the following rules: * - Acquire locks only on MP systems. diff --git a/reactos/ntoskrnl/ex/i386/interlck_asm.S b/reactos/ntoskrnl/ex/i386/interlck_asm.S index f7d602e2c3d..954091cee85 100644 --- a/reactos/ntoskrnl/ex/i386/interlck_asm.S +++ b/reactos/ntoskrnl/ex/i386/interlck_asm.S @@ -7,12 +7,16 @@ */ /* INCLUDES ******************************************************************/ + +#include #include #include -.intel_syntax noprefix /* FUNCTIONS ****************************************************************/ +.code32 +.text + /* * NOTE: These functions must obey the following rules: * - Acquire locks only on MP systems. diff --git a/reactos/ntoskrnl/include/internal/i386/asmmacro.S b/reactos/ntoskrnl/include/internal/i386/asmmacro.S index d0fabe98011..7e0596eaf92 100644 --- a/reactos/ntoskrnl/include/internal/i386/asmmacro.S +++ b/reactos/ntoskrnl/include/internal/i386/asmmacro.S @@ -4,17 +4,12 @@ * FILE: ntoskrnl/include/i386/asmmacro.S * PURPOSE: Assembly Macros for Spinlocks and common Trap Code * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) + * Timo Kreuzer (timo.kreuzer@reactos.org) */ -/* INCLUDES ******************************************************************/ - -#include - // Arguments for idt -#define INT_32_DPL0 0x8E00 -#define INT_32_DPL3 0xEE00 - -.intel_syntax noprefix +#define INT_32_DPL0 HEX(08E00) +#define INT_32_DPL3 HEX(0EE00) // // These macros are inlined equivalents of KiAcquire/ReleaseSpinlock, that is, @@ -30,7 +25,7 @@ // #IFDEF CONFIG_SMP // .spin // -/ SPIN_ON_LOCK(reg, .BeginYourFunction) +// SPIN_ON_LOCK(reg, .BeginYourFunction) // #ENDIF // #ifdef CONFIG_SMP @@ -64,74 +59,139 @@ // // @remark None. // -.macro idt Handler, Bits +MACRO(idt, Handler, Bits) .long \Handler .short \Bits .short KGDT_R0_CODE -.endm +ENDM -// -// @name GENERATE_IDT_STUB -// -// This macro creates an IDT entry for an unexpected interrupt handler. -// -// @param None. -// -// @remark None. -// -.macro GENERATE_IDT_STUB Number -idt _KiUnexpectedInterrupt&Number, INT_32_DPL0 -.endm -// -// @name GENERATE_IDT_STUBS -// -// This macro creates unexpected interrupt IDT entries. -// -// @param None. -// -// @remark None. -// -.altmacro -.macro GENERATE_IDT_STUBS -.set i, 0 -.rept 208 - GENERATE_IDT_STUB %i - .set i, i + 1 -.endr -.endm +KI_PUSH_FAKE_ERROR_CODE = HEX(0001) +KI_UNUSED = HEX(0002) +KI_NONVOLATILES_ONLY = HEX(0004) +KI_FAST_SYSTEM_CALL = HEX(0008) +KI_SOFTWARE_TRAP = HEX(0010) +KI_HARDWARE_INT = HEX(0020) +KI_DONT_SAVE_SEGS = HEX(0100) -// -// @name GENERATE_INT_HANDLER -// -// This macro creates an unexpected interrupt handler. -// -// @param None. -// -// @remark None. -// -.macro GENERATE_INT_HANDLER Number -.func KiUnexpectedInterrupt&Number -_KiUnexpectedInterrupt&Number: - mov eax, PRIMARY_VECTOR_BASE + Number - jmp _KiEndUnexpectedRange@0 -.endfunc -.endm +MACRO(KiEnterTrap, Flags) + LOCAL kernel_trap + LOCAL not_v86_trap + LOCAL set_sane_segs + + /* Check what kind of trap frame this trap requires */ + if (Flags AND KI_FAST_SYSTEM_CALL) + + /* SYSENTER requires us to build a complete ring transition trap frame */ + FrameSize = KTRAP_FRAME_V86_ES + + /* Fixup fs. cx is free to clobber */ + mov cx, KGDT_R0_PCR + mov fs, cx + + /* Get pointer to the TSS */ + mov ecx, fs:[KPCR_TSS] + + /* Get a stack pointer */ + mov esp, [ecx + KTSS_ESP0] + + elseif (Flags AND KI_SOFTWARE_TRAP) + + /* Software traps need a complete non-ring transition trap frame */ + FrameSize = KTRAP_FRAME_ESP + + /* Software traps need to get their EIP from the caller's frame */ + pop eax + + elseif (Flags AND KI_PUSH_FAKE_ERROR_CODE) + + /* If the trap doesn't have an error code, we'll make space for it */ + FrameSize = KTRAP_FRAME_EIP + + else + + /* The trap already has an error code, so just make space for the rest */ + FrameSize = KTRAP_FRAME_ERROR_CODE + + endif + + /* Save nonvolatile registers */ + mov [esp - FrameSize + KTRAP_FRAME_EBP], ebp + mov [esp - FrameSize + KTRAP_FRAME_EBX], ebx + mov [esp - FrameSize + KTRAP_FRAME_ESI], esi + mov [esp - FrameSize + KTRAP_FRAME_EDI], edi + + /* Save eax for system calls, for use by the C handler */ + mov [esp - FrameSize + KTRAP_FRAME_EAX], eax + + /* Does the caller want nonvolatiles only? */ + if ((Flags AND KI_NONVOLATILES_ONLY) == 0) + /* Otherwise, save the volatiles as well */ + mov [esp - FrameSize + KTRAP_FRAME_ECX], ecx + mov [esp - FrameSize + KTRAP_FRAME_EDX], edx + endif + + /* Save segment registers? */ + if ((Flags AND KI_DONT_SAVE_SEGS) == 0) + + /* Check for V86 mode */ + test byte ptr [esp - FrameSize + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK >> 16) + jz not_v86_trap + + /* Restore V8086 segments into Protected Mode segments */ + mov eax, [esp - FrameSize + KTRAP_FRAME_V86_DS] + mov ecx, [esp - FrameSize + KTRAP_FRAME_V86_ES] + mov [esp - FrameSize + KTRAP_FRAME_DS], eax + mov [esp - FrameSize + KTRAP_FRAME_ES], ecx + mov eax, [esp - FrameSize + KTRAP_FRAME_V86_FS] + mov ecx, [esp - FrameSize + KTRAP_FRAME_V86_GS] + mov [esp - FrameSize + KTRAP_FRAME_FS], eax + mov [esp - FrameSize + KTRAP_FRAME_GS], ecx + jmp set_sane_segs + + not_v86_trap: + + /* Save segment selectors */ + mov eax, ds + mov ecx, es + mov [esp - FrameSize + KTRAP_FRAME_DS], eax + mov [esp - FrameSize + KTRAP_FRAME_ES], ecx + mov eax, fs + mov ecx, gs + mov [esp - FrameSize + KTRAP_FRAME_FS], eax + mov [esp - FrameSize + KTRAP_FRAME_GS], ecx + + endif + +set_sane_segs: + /* Load correct data segments */ + mov ax, KGDT_R3_DATA OR RPL_MASK + mov ds, ax + mov es, ax + + /* Fast system calls have fs already fixed */ + if ((Flags AND KI_FAST_SYSTEM_CALL) == 0) + /* Otherwise fix fs now */ + mov ax, KGDT_R0_PCR + mov fs, ax + endif + + /* Make space for this frame */ + sub esp, FrameSize + + /* Clear direction flag */ + cld + + /* Set parameter 1 (ECX) to point to the frame */ + mov ecx, esp + +ENDM + +MACRO(TRAP_ENTRY, Trap, Flags) +EXTERN @&Trap&Handler@4 :PROC + PUBLIC _&Trap + _&Trap: + KiEnterTrap Flags + jmp @&Trap&Handler@4 +ENDM -// -// @name GENERATE_INT_HANDLERS -// -// This macro creates the unexpected interrupt handlers. -// -// @param None. -// -// @remark None. -// -.altmacro -.macro GENERATE_INT_HANDLERS -.set i, 0 -.rept 208 - GENERATE_INT_HANDLER %i - .set i, i + 1 -.endr -.endm diff --git a/reactos/ntoskrnl/include/internal/trap_x.h b/reactos/ntoskrnl/include/internal/trap_x.h index 205aa54e4e8..d1f9420d258 100644 --- a/reactos/ntoskrnl/include/internal/trap_x.h +++ b/reactos/ntoskrnl/include/internal/trap_x.h @@ -196,68 +196,6 @@ KiIssueBop(VOID) asm volatile(".byte 0xC4\n.byte 0xC4\n"); } -// -// Returns whether or not this is a V86 trap by checking the EFLAGS field. -// -// FIXME: GCC 4.5 Can Improve this with "goto labels" -// -BOOLEAN -FORCEINLINE -KiIsV8086TrapSafe(IN PKTRAP_FRAME TrapFrame) -{ - BOOLEAN Result; - - /* - * The check MUST be done this way, as we guarantee that no DS/ES/FS segment - * is used (since it might be garbage). - * - * Instead, we use the SS segment which is guaranteed to be correct. Because - * operate in 32-bit flat mode, this works just fine. - */ - asm volatile - ( - "testl $%c[f], %%ss:%1\n" - "setnz %0\n" - : "=a"(Result) - : "m"(TrapFrame->EFlags), - [f] "i"(EFLAGS_V86_MASK) - ); - - /* If V86 flag was set */ - return Result; -} - -// -// Returns whether or not this is a user-mode trap by checking the SegCs field. -// -// FIXME: GCC 4.5 Can Improve this with "goto labels" -// -BOOLEAN -FORCEINLINE -KiIsUserTrapSafe(IN PKTRAP_FRAME TrapFrame) -{ - BOOLEAN Result; - - /* - * The check MUST be done this way, as we guarantee that no DS/ES/FS segment - * is used (since it might be garbage). - * - * Instead, we use the SS segment which is guaranteed to be correct. Because - * operate in 32-bit flat mode, this works just fine. - */ - asm volatile - ( - "cmp $%c[f], %%ss:%1\n" - "setnz %0\n" - : "=a"(Result) - : "m"(TrapFrame->SegCs), - [f] "i"(KGDT_R0_CODE) - ); - - /* If V86 flag was set */ - return Result; -} - VOID FORCEINLINE KiUserSystemCall(IN PKTRAP_FRAME TrapFrame) @@ -281,30 +219,6 @@ KiUserSystemCall(IN PKTRAP_FRAME TrapFrame) ); } -VOID -FORCEINLINE -KiSetSaneSegments(IN PKTRAP_FRAME TrapFrame) -{ - ULONG Ds, Es; - - /* - * We really have to get a good DS/ES first before touching any data. - * - * These two reads will either go in a register (with optimizations ON) or - * a stack variable (which is on SS:ESP, guaranteed to be good/valid). - * - * Because the assembly is marked volatile, the order of instructions is - * as-is, otherwise the optimizer could simply get rid of our DS/ES. - * - */ - Ds = Ke386GetDs(); - Es = Ke386GetEs(); - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - TrapFrame->SegDs = Ds; - TrapFrame->SegEs = Es; -} - // // Generates an Exit Epilog Stub for the given name // @@ -643,17 +557,9 @@ VOID FORCEINLINE KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame) { - /* Load correct registers */ - Ke386SetFs(KGDT_R0_PCR); - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - /* Save exception list */ TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - /* Save DR7 and check for debugging */ TrapFrame->Dr7 = __readdr(7); if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0)) @@ -670,40 +576,10 @@ VOID FORCEINLINE KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame) { - /* Check for V86 mode, otherwise check for ring 3 code */ - if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 0)) - { - /* Set correct segments */ - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - Ke386SetFs(KGDT_R0_PCR); - - /* Restore V8086 segments into Protected Mode segments */ - TrapFrame->SegFs = TrapFrame->V86Fs; - TrapFrame->SegGs = TrapFrame->V86Gs; - TrapFrame->SegDs = TrapFrame->V86Ds; - TrapFrame->SegEs = TrapFrame->V86Es; - } - else if (__builtin_expect(KiIsUserTrapSafe(TrapFrame), 1)) /* Ring 3 is more common */ - { - /* Switch to sane segments */ - KiSetSaneSegments(TrapFrame); - - /* Save FS/GS */ - TrapFrame->SegFs = Ke386GetFs(); - TrapFrame->SegGs = Ke386GetGs(); - - /* Set correct FS */ - Ke386SetFs(KGDT_R0_PCR); - } - /* Save exception list and terminate it */ TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END; - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - /* Flush DR7 and check for debugging */ TrapFrame->Dr7 = 0; if (__builtin_expect(KeGetCurrentThread()->DispatcherHeader.DebugActive & 0xFF, 0)) @@ -723,30 +599,9 @@ VOID FORCEINLINE KiEnterTrap(IN PKTRAP_FRAME TrapFrame) { - /* Switch to sane segments */ - KiSetSaneSegments(TrapFrame); - - /* Now we can save the other segments and then switch to the correct FS */ - TrapFrame->SegFs = Ke386GetFs(); - TrapFrame->SegGs = Ke386GetGs(); - Ke386SetFs(KGDT_R0_PCR); - /* Save exception list */ TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; - /* Check for V86 mode */ - if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0)) - { - /* Restore V8086 segments into Protected Mode segments */ - TrapFrame->SegFs = TrapFrame->V86Fs; - TrapFrame->SegGs = TrapFrame->V86Gs; - TrapFrame->SegDs = TrapFrame->V86Ds; - TrapFrame->SegEs = TrapFrame->V86Es; - } - - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - /* Flush DR7 and check for debugging */ TrapFrame->Dr7 = 0; if (__builtin_expect(KeGetCurrentThread()->DispatcherHeader.DebugActive & 0xFF, 0)) @@ -759,130 +614,4 @@ KiEnterTrap(IN PKTRAP_FRAME TrapFrame) KiFillTrapFrameDebug(TrapFrame); } -// -// Generates a Trap Prolog Stub for the given name -// -#define KI_PUSH_FAKE_ERROR_CODE 0x1 -#define KI_UNUSED 0x2 -#define KI_NONVOLATILES_ONLY 0x4 -#define KI_FAST_SYSTEM_CALL 0x8 -#define KI_SOFTWARE_TRAP 0x10 -#define KI_HARDWARE_INT 0x20 -#define KiTrap(x, y) VOID DECLSPEC_NORETURN x(VOID) { KiTrapStub(y, x##Handler); UNREACHABLE; } -#define KiTrampoline(x, y) VOID DECLSPEC_NOINLINE x(VOID) { KiTrapStub(y, x##Handler); } - -// -// Trap Prolog Stub -// -VOID -FORCEINLINE -KiTrapStub(IN ULONG Flags, - IN PVOID Handler) -{ - ULONG FrameSize; - - /* Is this a fast system call? They don't have a stack! */ - if (Flags & KI_FAST_SYSTEM_CALL) __asm__ __volatile__ - ( - "movl %%ss:%c[t], %%esp\n" - "movl %c[e](%%esp), %%esp\n" - : - : [e] "i"(FIELD_OFFSET(KTSS, Esp0)), - [t] "i"(&PCR->TSS) - : "%esp" - ); - - /* Check what kind of trap frame this trap requires */ - if (Flags & KI_SOFTWARE_TRAP) - { - /* Software traps need a complete non-ring transition trap frame */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp); - } - else if (Flags & KI_FAST_SYSTEM_CALL) - { - /* SYSENTER requires us to build a complete ring transition trap frame */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, V86Es); - - /* And it only preserves nonvolatile registers */ - Flags |= KI_NONVOLATILES_ONLY; - } - else if (Flags & KI_PUSH_FAKE_ERROR_CODE) - { - /* If the trap doesn't have an error code, we'll make space for it */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, Eip); - } - else - { - /* The trap already has an error code, so just make space for the rest */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, ErrCode); - } - - /* Software traps need to get their EIP from the caller's frame */ - if (Flags & KI_SOFTWARE_TRAP) __asm__ __volatile__ ("popl %%eax\n":::"%esp"); - - /* Save nonvolatile registers */ - __asm__ __volatile__ - ( - /* EBX, ESI, EDI and EBP are saved */ - "movl %%ebp, %c[p](%%esp)\n" - "movl %%ebx, %c[b](%%esp)\n" - "movl %%esi, %c[s](%%esp)\n" - "movl %%edi, %c[i](%%esp)\n" - : - : [b] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebx)), - [s] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Esi)), - [i] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edi)), - [p] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebp)) - : "%esp" - ); - - /* Does the caller want nonvolatiles only? */ - if (!(Flags & KI_NONVOLATILES_ONLY)) __asm__ __volatile__ - ( - /* Otherwise, save the volatiles as well */ - "movl %%eax, %c[a](%%esp)\n" - "movl %%ecx, %c[c](%%esp)\n" - "movl %%edx, %c[d](%%esp)\n" - : - : [a] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Eax)), - [c] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ecx)), - [d] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edx)) - : "%esp" - ); - - /* Now set parameter 1 (ECX) to point to the frame */ - __asm__ __volatile__ ("movl %%esp, %%ecx\n":::"%esp"); - - /* Now go ahead and make space for this frame */ - __asm__ __volatile__ ("subl $%c[e],%%esp\n":: [e] "i"(FrameSize) : "%esp"); - __asm__ __volatile__ ("subl $%c[e],%%ecx\n":: [e] "i"(FrameSize) : "%ecx"); - - /* - * For hardware interrupts, set parameter 2 (EDX) to hold KINTERRUPT. - * This code will be dynamically patched when an interrupt is registered! - */ - if (Flags & KI_HARDWARE_INT) __asm__ __volatile__ - ( - ".globl _KiInterruptTemplate2ndDispatch\n_KiInterruptTemplate2ndDispatch:\n" - "movl $0, %%edx\n" - ".globl _KiInterruptTemplateObject\n_KiInterruptTemplateObject:\n" - ::: "%edx" - ); - - /* Now jump to the C handler */ - if (Flags & KI_HARDWARE_INT)__asm__ __volatile__ - ( - /* - * For hardware interrupts, use an absolute JMP instead of a relative JMP - * since the position of this code is arbitrary in memory, and therefore - * the compiler-generated offset will not be correct. - */ - "jmp *%0\n" - ".globl _KiInterruptTemplateDispatch\n_KiInterruptTemplateDispatch:\n" - : - : "a"(Handler) - ); - else __asm__ __volatile__ ("jmp %c[x]\n":: [x] "i"(Handler)); -} - #endif diff --git a/reactos/ntoskrnl/ke/i386/irqobj.c b/reactos/ntoskrnl/ke/i386/irqobj.c index 58b66248c30..5543f939170 100644 --- a/reactos/ntoskrnl/ke/i386/irqobj.c +++ b/reactos/ntoskrnl/ke/i386/irqobj.c @@ -233,7 +233,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, KIRQL OldIrql; BOOLEAN Handled; PLIST_ENTRY NextEntry, ListHead; - + /* Increase interrupt count */ KeGetCurrentPrcb()->InterruptCount++; @@ -299,7 +299,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, /* Now call the epilogue code */ KiExitInterrupt(TrapFrame, OldIrql, TRUE); } - } +} VOID FASTCALL @@ -313,8 +313,6 @@ KiInterruptTemplateHandler(IN PKTRAP_FRAME TrapFrame, ((PKI_INTERRUPT_DISPATCH*)Interrupt->DispatchAddress)(TrapFrame, Interrupt); } -KiTrap(KiInterruptTemplate, KI_PUSH_FAKE_ERROR_CODE | KI_HARDWARE_INT); -KiTrap(KiUnexpectedInterruptTail, KI_PUSH_FAKE_ERROR_CODE); /* PUBLIC FUNCTIONS **********************************************************/ diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 293cd6f8106..07e1161d33a 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -3,19 +3,33 @@ * COPYRIGHT: See COPYING in the top level directory * PURPOSE: System Traps, Entrypoints and Exitpoints * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * Timo Kreuzer (timo.kreuzer@reactos.org) * NOTE: See asmmacro.S for the shared entry/exit code. */ /* INCLUDES ******************************************************************/ -#include +#include +#include #include -.intel_syntax noprefix + +MACRO(GENERATE_IDT_STUB, Number) +idt _KiUnexpectedInterrupt&Number, INT_32_DPL0 +ENDM + +MACRO(GENERATE_INT_HANDLER, Number) +.func KiUnexpectedInterrupt&Number +_KiUnexpectedInterrupt&Number: + mov eax, PRIMARY_VECTOR_BASE + Number + jmp _KiEndUnexpectedRange@0 +.endfunc +ENDM /* GLOBALS *******************************************************************/ .data -.globl _KiIdt + +PUBLIC _KiIdt _KiIdt: /* This is the Software Interrupt Table that we handle in this file: */ idt _KiTrap00, INT_32_DPL0 /* INT 00: Divide Error (#DE) */ @@ -47,26 +61,86 @@ idt _KiRaiseAssertion, INT_32_DPL3 /* INT 2C: Debug Assertion Handler */ idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */ idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */ idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */ -GENERATE_IDT_STUBS /* INT 30-FF: UNEXPECTED INTERRUPTS */ +i = 0 +.rept 208 + GENERATE_IDT_STUB %i + i = i + 1 +.endr -.globl _KiIdtDescriptor +PUBLIC _KiIdtDescriptor _KiIdtDescriptor: .short 0 .short 0x7FF .long _KiIdt -.globl _KiUnexpectedEntrySize +PUBLIC _KiUnexpectedEntrySize _KiUnexpectedEntrySize: .long _KiUnexpectedInterrupt1 - _KiUnexpectedInterrupt0 +/******************************************************************************/ +.code32 .text -/* HARDWARE INTERRUPT HANDLERS ************************************************/ -.globl _KiStartUnexpectedRange@0 +TRAP_ENTRY KiTrap00, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap01, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap03, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap04, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap05, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap06, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap07, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap08, 0 +TRAP_ENTRY KiTrap09, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap0A, 0 +TRAP_ENTRY KiTrap0B, 0 +TRAP_ENTRY KiTrap0C, 0 +TRAP_ENTRY KiTrap0D, 0 +TRAP_ENTRY KiTrap0E, 0 +TRAP_ENTRY KiTrap0F, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap10, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap11, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap13, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiUnexpectedInterruptTail, KI_PUSH_FAKE_ERROR_CODE + +ALIGN 4 +EXTERN @KiInterruptTemplateHandler@8 +PUBLIC _KiInterruptTemplate +_KiInterruptTemplate: + KiEnterTrap KI_PUSH_FAKE_ERROR_CODE +PUBLIC _KiInterruptTemplate2ndDispatch +_KiInterruptTemplate2ndDispatch: + mov edx, 0 +PUBLIC _KiInterruptTemplateObject +_KiInterruptTemplateObject: + mov eax, offset @KiInterruptTemplateHandler@8 + jmp eax +PUBLIC _KiInterruptTemplateDispatch +_KiInterruptTemplateDispatch: + +EXTERN @KiSystemServiceHandler@8:PROC +PUBLIC _KiSystemService +_KiSystemService: + KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS) + jmp @KiSystemServiceHandler@8 + +EXTERN @KiFastCallEntryHandler@8:PROC +PUBLIC _KiFastCallEntry +_KiFastCallEntry: + KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS) + jmp @KiFastCallEntryHandler@8 + +PUBLIC _KiStartUnexpectedRange@0 _KiStartUnexpectedRange@0: - -GENERATE_INT_HANDLERS - -.globl _KiEndUnexpectedRange@0 +i = 0 +.rept 208 + GENERATE_INT_HANDLER %i + i = i + 1 +.endr +PUBLIC _KiEndUnexpectedRange@0 _KiEndUnexpectedRange@0: jmp _KiUnexpectedInterruptTail + +END diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index a6d8052c893..3b2f81b00a4 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -53,7 +53,15 @@ KiVdmTrap(IN PKTRAP_FRAME TrapFrame) return ((TrapFrame->EFlags & EFLAGS_V86_MASK) || ((KiUserTrap(TrapFrame)) && (PsGetCurrentProcess()->VdmObjects))); } - + +BOOLEAN +FORCEINLINE +KiV86Trap(IN PKTRAP_FRAME TrapFrame) +{ + /* Check if the V8086 flag is on */ + return ((TrapFrame->EFlags & EFLAGS_V86_MASK) != 0); +} + /* TRAP EXIT CODE *************************************************************/ VOID @@ -223,7 +231,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, DataOffset, TrapFrame); } - + /* Check for invalid operation */ if (Error & FSW_INVALID_OPERATION) { @@ -540,7 +548,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame) KIRQL OldIrql; /* Check for V86 GPF */ - if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1)) + if (__builtin_expect(KiV86Trap(TrapFrame), 1)) { /* Enter V86 trap */ KiEnterV86Trap(TrapFrame); @@ -800,7 +808,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) KIRQL OldIrql; /* Check for V86 GPF */ - if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1)) + if (__builtin_expect(KiV86Trap(TrapFrame), 1)) { /* Enter V86 trap */ KiEnterV86Trap(TrapFrame); @@ -845,7 +853,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) /* Check for user-mode GPF */ if (KiUserTrap(TrapFrame)) - { + { /* Should not be VDM */ ASSERT(KiVdmTrap(TrapFrame) == FALSE); @@ -1502,19 +1510,13 @@ KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame, } VOID -__attribute__((regparm(3))) +FASTCALL DECLSPEC_NORETURN -KiFastCallEntryHandler(IN ULONG ServiceNumber, - IN PVOID Arguments, - IN PKTRAP_FRAME TrapFrame) +KiFastCallEntryHandler(IN PKTRAP_FRAME TrapFrame, + IN PVOID Arguments) { PKTHREAD Thread; - - /* Fixup segments */ - Ke386SetFs(KGDT_R0_PCR); - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - + /* Set up a fake INT Stack and enable interrupts */ TrapFrame->HardwareSegSs = KGDT_R3_DATA | RPL_MASK; TrapFrame->HardwareEsp = (ULONG_PTR)Arguments; @@ -1531,7 +1533,7 @@ KiFastCallEntryHandler(IN ULONG ServiceNumber, /* Call the shared handler (inline) */ KiSystemCallHandler(TrapFrame, - ServiceNumber, + TrapFrame->Eax, Arguments, Thread, UserMode, @@ -1540,65 +1542,29 @@ KiFastCallEntryHandler(IN ULONG ServiceNumber, } VOID -__attribute__((regparm(3))) +FASTCALL DECLSPEC_NORETURN -KiSystemServiceHandler(IN ULONG ServiceNumber, - IN PVOID Arguments, - IN PKTRAP_FRAME TrapFrame) +KiSystemServiceHandler(IN PKTRAP_FRAME TrapFrame, + IN PVOID Arguments) { - USHORT SegFs; PKTHREAD Thread; - /* Save and fixup FS */ - SegFs = Ke386GetFs(); - Ke386SetFs(KGDT_R0_PCR); - /* Get the current thread */ Thread = KeGetCurrentThread(); /* Chain trap frames */ TrapFrame->Edx = (ULONG_PTR)Thread->TrapFrame; - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - /* Call the shared handler (inline) */ KiSystemCallHandler(TrapFrame, - ServiceNumber, + TrapFrame->Eax, Arguments, Thread, KiUserTrap(TrapFrame), Thread->PreviousMode, - SegFs); + TrapFrame->SegFs); } -/* CPU AND SOFTWARE TRAPS *****************************************************/ - -KiTrap(KiTrap00, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap01, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap03, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap04, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap05, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap06, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap07, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap08, 0); -KiTrap(KiTrap09, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap0A, 0); -KiTrap(KiTrap0B, 0); -KiTrap(KiTrap0C, 0); -KiTrap(KiTrap0D, 0); -KiTrap(KiTrap0E, 0); -KiTrap(KiTrap0F, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap10, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap11, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap13, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiDebugService, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiSystemService, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY); -KiTrap(KiFastCallEntry, KI_FAST_SYSTEM_CALL); - /* * @implemented */ diff --git a/reactos/ntoskrnl/ke/i386/usercall_asm.S b/reactos/ntoskrnl/ke/i386/usercall_asm.S index 017a736d1e3..2da726882eb 100644 --- a/reactos/ntoskrnl/ke/i386/usercall_asm.S +++ b/reactos/ntoskrnl/ke/i386/usercall_asm.S @@ -8,12 +8,15 @@ /* INCLUDES ******************************************************************/ -#include +#include +#include #include -.intel_syntax noprefix /* FUNCTIONS ****************************************************************/ +.code32 +.text + .globl _KiGetUserModeStackAddress@0 .func KiGetUserModeStackAddress@0 _KiGetUserModeStackAddress@0: From c7f7e3bac778692390d4e2d096db1e5ce1a20903 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 11 Feb 2010 00:01:32 +0000 Subject: [PATCH 81/97] [NTOS]: Move more functions from the i386 ARM3 directory to the portable/shared directory, since they apply to all architectures. [NTOS]: Refactor the mapping of the PTEs for the PFN database into MiMapPfnDatabase and move the code to portable directory. [NTOS]: Move and refactor some other definitions, and make some numbers more portable by defining arch-specific subvalues. [NTOS]: Make the PFN database actually 2 PFN Databases: MmPfnDatabase[0] which is the ReactOS mapping of PHYSICAL_PAGE structures, and MmPfnDatabase[1] which will be the ARM3 mapping of MMPFN structures. The latter is as-of-yet unused, but memory for it is now being reserved. svn path=/trunk/; revision=45566 --- reactos/ntoskrnl/include/internal/mm.h | 6 +- reactos/ntoskrnl/mm/ARM3/i386/init.c | 285 ++----------------------- reactos/ntoskrnl/mm/ARM3/miarm.h | 51 ++++- reactos/ntoskrnl/mm/ARM3/mminit.c | 284 +++++++++++++++++++++++- reactos/ntoskrnl/mm/freelist.c | 23 +- reactos/ntoskrnl/mm/mminit.c | 6 +- 6 files changed, 367 insertions(+), 288 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 61e4d658b3f..d7c21186f07 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -365,7 +365,7 @@ typedef struct _MMPFN } u4; } MMPFN, *PMMPFN; -extern PMMPFN MmPfnDatabase; +extern PMMPFN MmPfnDatabase[2]; typedef struct _MMPFNLIST { @@ -1098,7 +1098,7 @@ MiGetPfnEntry(IN PFN_TYPE Pfn) if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL; /* Get the entry */ - Page = &MmPfnDatabase[Pfn]; + Page = &MmPfnDatabase[0][Pfn]; /* Make sure it's valid */ ASSERT_PFN(Page); @@ -1114,7 +1114,7 @@ MiGetPfnEntryIndex(IN PMMPFN Pfn1) // // This will return the Page Frame Number (PFN) from the MMPFN // - return Pfn1 - MmPfnDatabase; + return Pfn1 - MmPfnDatabase[0]; } PFN_TYPE diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 21919c11bd4..5d3b976010b 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -18,42 +18,10 @@ /* GLOBALS ********************************************************************/ -// -// Before we have a PFN database, memory comes straight from our physical memory -// blocks, which is nice because it's guaranteed contiguous and also because once -// we take a page from here, the system doesn't see it anymore. -// However, once the fun is over, those pages must be re-integrated back into -// PFN society life, and that requires us keeping a copy of the original layout -// so that we can parse it later. -// -PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; -MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; - /* Template PTE and PDE for a kernel page */ MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; -/* - * For each page's worth bytes of L2 cache in a given set/way line, the zero and - * free lists are organized in what is called a "color". - * - * This array points to the two lists, so it can be thought of as a multi-dimensional - * array of MmFreePagesByColor[2][MmSecondaryColors]. Since the number is dynamic, - * we describe the array in pointer form instead. - * - * On a final note, the color tables themselves are right after the PFN database. - */ -C_ASSERT(FreePageList == 1); -PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1]; - -/* Make the code cleaner with some definitions for size multiples */ -#define _1KB (1024) -#define _1MB (1000 * _1KB) - -/* Architecture specific size of a PDE directory, and size of a page table */ -#define PDE_SIZE (4096 * sizeof(MMPDE)) -#define PT_SIZE (1024 * sizeof(MMPTE)) - /* PRIVATE FUNCTIONS **********************************************************/ VOID @@ -171,109 +139,6 @@ MiComputeNonPagedPoolVa(IN ULONG FreePages) } } -VOID -NTAPI -MiComputeColorInformation(VOID) -{ - ULONG L2Associativity; - - /* Check if no setting was provided already */ - if (!MmSecondaryColors) - { - /* Get L2 cache information */ - L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; - - /* The number of colors is the number of cache bytes by set/way */ - MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; - if (L2Associativity) MmSecondaryColors /= L2Associativity; - } - - /* Now convert cache bytes into pages */ - MmSecondaryColors >>= PAGE_SHIFT; - if (!MmSecondaryColors) - { - /* If there was no cache data from the KPCR, use the default colors */ - MmSecondaryColors = MI_SECONDARY_COLORS; - } - else - { - /* Otherwise, make sure there aren't too many colors */ - if (MmSecondaryColors > MI_MAX_SECONDARY_COLORS) - { - /* Set the maximum */ - MmSecondaryColors = MI_MAX_SECONDARY_COLORS; - } - - /* Make sure there aren't too little colors */ - if (MmSecondaryColors < MI_MIN_SECONDARY_COLORS) - { - /* Set the default */ - MmSecondaryColors = MI_SECONDARY_COLORS; - } - - /* Finally make sure the colors are a power of two */ - if (MmSecondaryColors & (MmSecondaryColors - 1)) - { - /* Set the default */ - MmSecondaryColors = MI_SECONDARY_COLORS; - } - } - - /* Compute the mask and store it */ - MmSecondaryColorMask = MmSecondaryColors - 1; - KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; -} - -VOID -NTAPI -MiInitializeColorTables(VOID) -{ - ULONG i; - PMMPTE PointerPte, LastPte; - MMPTE TempPte = ValidKernelPte; - - /* The color table starts after the PFN database */ - MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[MmHighestPhysicalPage + 1]; - - /* Loop the PTEs. We have two color tables for each secondary color */ - PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]); - LastPte = MiAddressToPte((ULONG_PTR)MmFreePagesByColor[0] + - (2 * MmSecondaryColors * sizeof(MMCOLOR_TABLES)) - - 1); - while (PointerPte <= LastPte) - { - /* Check for valid PTE */ - if (PointerPte->u.Hard.Valid == 0) - { - /* Get a page and map it */ - TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - /* Zero out the page */ - RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); - } - - /* Next */ - PointerPte++; - } - - /* Now set the address of the next list, right after this one */ - MmFreePagesByColor[1] = &MmFreePagesByColor[0][MmSecondaryColors]; - - /* Now loop the lists to set them up */ - for (i = 0; i < MmSecondaryColors; i++) - { - /* Set both free and zero lists for each color */ - MmFreePagesByColor[ZeroedPageList][i].Flink = 0xFFFFFFFF; - MmFreePagesByColor[ZeroedPageList][i].Blink = (PVOID)0xFFFFFFFF; - MmFreePagesByColor[ZeroedPageList][i].Count = 0; - MmFreePagesByColor[FreePageList][i].Flink = 0xFFFFFFFF; - MmFreePagesByColor[FreePageList][i].Blink = (PVOID)0xFFFFFFFF; - MmFreePagesByColor[FreePageList][i].Count = 0; - } -} - NTSTATUS NTAPI MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -286,7 +151,6 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; ULONG OldCount; - PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; /* Check for kernel stack size that's too big */ if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB)) @@ -436,10 +300,11 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MiComputeColorInformation(); // - // Calculate the number of bytes for the PFN database, and the color tables, - // and then convert to pages + // Calculate the number of bytes for the PFN database, double it for ARM3, + // then add the color tables and convert to pages // MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); + MxPfnAllocation <<= 1; MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2); MxPfnAllocation >>= PAGE_SHIFT; @@ -513,13 +378,19 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // with the old memory manager, so we'll create a "Shadow PFN Database" // instead, and arbitrarly start it at 0xB0000000. // - MmPfnDatabase = (PVOID)0xB0000000; - ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0); + // We actually create two PFN databases, one for ReactOS starting here, + // and the next one used for ARM3, which starts right after. The MmPfnAllocation + // variable actually holds the size of both (the colored tables come after + // the ARM3 PFN database). + // + MmPfnDatabase[0] = (PVOID)0xB0000000; + MmPfnDatabase[1] = &MmPfnDatabase[0][MmHighestPhysicalPage]; + ASSERT(((ULONG_PTR)MmPfnDatabase[0] & ((4 * 1024 * 1024) - 1)) == 0); // // Non paged pool comes after the PFN database // - MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase + + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase[0] + (MxPfnAllocation << PAGE_SHIFT)); // @@ -567,7 +438,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // // Now we need pages for the page tables which will map initial NP // - StartPde = MiAddressToPde(MmPfnDatabase); + StartPde = MiAddressToPde(MmPfnDatabase[0]); EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); while (StartPde <= EndPde) @@ -629,134 +500,16 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // MiInitializeArmPool(); - // - // Get current page data, since we won't be using MxGetNextPage as it - // would corrupt our state - // - FreePage = MxFreeDescriptor->BasePage; - FreePageCount = MxFreeDescriptor->PageCount; - PagesLeft = 0; - - // - // Loop the memory descriptors - // - NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead) - { - // - // Get the descriptor - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || - (MdBlock->MemoryType == LoaderBBTMemory) || - (MdBlock->MemoryType == LoaderSpecialMemory)) - { - // - // These pages are not part of the PFN database - // - NextEntry = MdBlock->ListEntry.Flink; - continue; - } - - // - // Next, check if this is our special free descriptor we've found - // - if (MdBlock == MxFreeDescriptor) - { - // - // Use the real numbers instead - // - BasePage = MxOldFreeDescriptor.BasePage; - PageCount = MxOldFreeDescriptor.PageCount; - } - else - { - // - // Use the descriptor's numbers - // - BasePage = MdBlock->BasePage; - PageCount = MdBlock->PageCount; - } - - // - // Get the PTEs for this range - // - PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]); - LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1); - DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); - - // - // Loop them - // - while (PointerPte <= LastPte) - { - // - // We'll only touch PTEs that aren't already valid - // - if (PointerPte->u.Hard.Valid == 0) - { - // - // Use the next free page - // - TempPte.u.Hard.PageFrameNumber = FreePage; - ASSERT(FreePageCount != 0); - - // - // Consume free pages - // - FreePage++; - FreePageCount--; - if (!FreePageCount) - { - // - // Out of memory - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - FreePageCount, - MxOldFreeDescriptor.PageCount, - 1); - } - - // - // Write out this PTE - // - PagesLeft++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - // - // Zero this page - // - RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); - } - - // - // Next! - // - PointerPte++; - } - - // - // Do the next address range - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // Now update the free descriptors to consume the pages we used up during - // the PFN allocation loop - // - MxFreeDescriptor->BasePage = FreePage; - MxFreeDescriptor->PageCount = FreePageCount; + /* Map the PFN database pages */ + MiMapPfnDatabase(LoaderBlock); /* Initialize the color tables */ MiInitializeColorTables(); + + /* Build the PFN Database */ + //MiInitializePfnDatabase(LoaderBlock); - /* Call back into shitMM to setup the PFN database */ + /* Call back into shitMM to setup the ReactOS PFN database */ MmInitializePageList(); // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index a308d831a99..a41b6fcade6 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -38,6 +38,26 @@ #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) +/* Make the code cleaner with some definitions for size multiples */ +#define _1KB (1024) +#define _1MB (1000 * _1KB) + +/* Size of a PDE directory, and size of a page table */ +#define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) +#define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) + +/* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */ +#ifdef _M_IX86 +#define PD_COUNT 1 +#define PDE_COUNT 4096 +#define PTE_COUNT 1024 +#elif _M_ARM +#define PD_COUNT 1 +#define PDE_COUNT 1024 +#define PTE_COUNT 256 +#else +#error Define these please! +#endif // // FIXFIX: These should go in ex.h after the pool merge @@ -190,11 +210,10 @@ extern ULONG MmSecondaryColors; extern ULONG MmSecondaryColorMask; extern ULONG MmNumberOfSystemPtes; extern ULONG MmMaximumNonPagedPoolPercent; +extern ULONG MmLargeStackSize; -// -// Actual (registry-configurable) size of a GUI thread's stack -// -ULONG MmLargeStackSize; +#define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) +#define MI_PFNENTRY_TO_PFN(x) (Pfn - &MmPfnDatabase[1]) NTSTATUS NTAPI @@ -209,6 +228,30 @@ MiInitMachineDependent( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +VOID +NTAPI +MiComputeColorInformation( + VOID +); + +VOID +NTAPI +MiMapPfnDatabase( + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + +VOID +NTAPI +MiInitializeColorTables( + VOID +); + +VOID +NTAPI +MiInitializePfnDatabase( + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + PFN_NUMBER NTAPI MxGetNextPage( diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 1d024d3f660..b911542bb03 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -234,6 +234,30 @@ ULONG MmSecondaryColorMask; // ULONG MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; +// +// Before we have a PFN database, memory comes straight from our physical memory +// blocks, which is nice because it's guaranteed contiguous and also because once +// we take a page from here, the system doesn't see it anymore. +// However, once the fun is over, those pages must be re-integrated back into +// PFN society life, and that requires us keeping a copy of the original layout +// so that we can parse it later. +// +PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; +MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; + +/* + * For each page's worth bytes of L2 cache in a given set/way line, the zero and + * free lists are organized in what is called a "color". + * + * This array points to the two lists, so it can be thought of as a multi-dimensional + * array of MmFreePagesByColor[2][MmSecondaryColors]. Since the number is dynamic, + * we describe the array in pointer form instead. + * + * On a final note, the color tables themselves are right after the PFN database. + */ +C_ASSERT(FreePageList == 1); +PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1]; + /* PRIVATE FUNCTIONS **********************************************************/ // @@ -283,6 +307,264 @@ MxGetNextPage(IN PFN_NUMBER PageCount) return Pfn; } +VOID +NTAPI +MiComputeColorInformation(VOID) +{ + ULONG L2Associativity; + + /* Check if no setting was provided already */ + if (!MmSecondaryColors) + { + /* Get L2 cache information */ + L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; + + /* The number of colors is the number of cache bytes by set/way */ + MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; + if (L2Associativity) MmSecondaryColors /= L2Associativity; + } + + /* Now convert cache bytes into pages */ + MmSecondaryColors >>= PAGE_SHIFT; + if (!MmSecondaryColors) + { + /* If there was no cache data from the KPCR, use the default colors */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + else + { + /* Otherwise, make sure there aren't too many colors */ + if (MmSecondaryColors > MI_MAX_SECONDARY_COLORS) + { + /* Set the maximum */ + MmSecondaryColors = MI_MAX_SECONDARY_COLORS; + } + + /* Make sure there aren't too little colors */ + if (MmSecondaryColors < MI_MIN_SECONDARY_COLORS) + { + /* Set the default */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + + /* Finally make sure the colors are a power of two */ + if (MmSecondaryColors & (MmSecondaryColors - 1)) + { + /* Set the default */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + } + + /* Compute the mask and store it */ + MmSecondaryColorMask = MmSecondaryColors - 1; + KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; +} + +VOID +NTAPI +MiInitializeColorTables(VOID) +{ + ULONG i; + PMMPTE PointerPte, LastPte; + MMPTE TempPte = ValidKernelPte; + + /* The color table starts after the ARM3 PFN database */ + MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[1][MmHighestPhysicalPage + 1]; + + /* Loop the PTEs. We have two color tables for each secondary color */ + PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]); + LastPte = MiAddressToPte((ULONG_PTR)MmFreePagesByColor[0] + + (2 * MmSecondaryColors * sizeof(MMCOLOR_TABLES)) + - 1); + while (PointerPte <= LastPte) + { + /* Check for valid PTE */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Get a page and map it */ + TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero out the page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next */ + PointerPte++; + } + + /* Now set the address of the next list, right after this one */ + MmFreePagesByColor[1] = &MmFreePagesByColor[0][MmSecondaryColors]; + + /* Now loop the lists to set them up */ + for (i = 0; i < MmSecondaryColors; i++) + { + /* Set both free and zero lists for each color */ + MmFreePagesByColor[ZeroedPageList][i].Flink = 0xFFFFFFFF; + MmFreePagesByColor[ZeroedPageList][i].Blink = (PVOID)0xFFFFFFFF; + MmFreePagesByColor[ZeroedPageList][i].Count = 0; + MmFreePagesByColor[FreePageList][i].Flink = 0xFFFFFFFF; + MmFreePagesByColor[FreePageList][i].Blink = (PVOID)0xFFFFFFFF; + MmFreePagesByColor[FreePageList][i].Count = 0; + } +} + +BOOLEAN +NTAPI +MiIsRegularMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PFN_NUMBER Pfn) +{ + PLIST_ENTRY NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + /* Loop the memory descriptors */ + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + /* Get the memory descriptor */ + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Check if this PFN could be part of the block */ + if (Pfn >= (MdBlock->BasePage)) + { + /* Check if it really is part of the block */ + if (Pfn < (MdBlock->BasePage + MdBlock->PageCount)) + { + /* Check if the block is actually memory we don't map */ + if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || + (MdBlock->MemoryType == LoaderBBTMemory) || + (MdBlock->MemoryType == LoaderSpecialMemory)) + { + /* We don't need PFN database entries for this memory */ + break; + } + + /* This is memory we want to map */ + return TRUE; + } + } + else + { + /* Blocks are ordered, so if it's not here, it doesn't exist */ + break; + } + + /* Get to the next descriptor */ + NextEntry = MdBlock->ListEntry.Flink; + } + + /* Check if this PFN is actually from our free memory descriptor */ + if ((Pfn >= MxOldFreeDescriptor.BasePage) && + (Pfn < MxOldFreeDescriptor.BasePage + MxOldFreeDescriptor.PageCount)) + { + /* We use these pages for initial mappings, so we do want to count them */ + return TRUE; + } + + /* Otherwise this isn't memory that we describe or care about */ + return FALSE; +} + +VOID +NTAPI +MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG FreePage, FreePageCount, PagesLeft, BasePage, PageCount; + PLIST_ENTRY NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + PMMPTE PointerPte, LastPte; + MMPTE TempPte = ValidKernelPte; + + /* Get current page data, since we won't be using MxGetNextPage as it would corrupt our state */ + FreePage = MxFreeDescriptor->BasePage; + FreePageCount = MxFreeDescriptor->PageCount; + PagesLeft = 0; + + /* Loop the memory descriptors */ + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + /* Get the descriptor */ + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || + (MdBlock->MemoryType == LoaderBBTMemory) || + (MdBlock->MemoryType == LoaderSpecialMemory)) + { + /* These pages are not part of the PFN database */ + NextEntry = MdBlock->ListEntry.Flink; + continue; + } + + /* Next, check if this is our special free descriptor we've found */ + if (MdBlock == MxFreeDescriptor) + { + /* Use the real numbers instead */ + BasePage = MxOldFreeDescriptor.BasePage; + PageCount = MxOldFreeDescriptor.PageCount; + } + else + { + /* Use the descriptor's numbers */ + BasePage = MdBlock->BasePage; + PageCount = MdBlock->PageCount; + } + + /* Get the PTEs for this range */ + PointerPte = MiAddressToPte(&MmPfnDatabase[0][BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[0][BasePage + PageCount]) - 1); + DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); + + /* Loop them */ + while (PointerPte <= LastPte) + { + /* We'll only touch PTEs that aren't already valid */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Use the next free page */ + TempPte.u.Hard.PageFrameNumber = FreePage; + ASSERT(FreePageCount != 0); + + /* Consume free pages */ + FreePage++; + FreePageCount--; + if (!FreePageCount) + { + /* Out of memory */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + FreePageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + /* Write out this PTE */ + PagesLeft++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero this page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next! */ + PointerPte++; + } + + /* Do the next address range */ + NextEntry = MdBlock->ListEntry.Flink; + } + + /* Now update the free descriptors to consume the pages we used up during the PFN allocation loop */ + MxFreeDescriptor->BasePage = FreePage; + MxFreeDescriptor->PageCount = FreePageCount; +} + PFN_NUMBER NTAPI MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, @@ -788,7 +1070,7 @@ MmArmInitSystem(IN ULONG Phase, // Sync us up with ReactOS Mm // MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); + MiSyncARM3WithROS(MmPfnDatabase[0], (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); // diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 5e31a4c8661..e32dcb2d1f1 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -48,7 +48,8 @@ #define PHYSICAL_PAGE MMPFN #define PPHYSICAL_PAGE PMMPFN -PPHYSICAL_PAGE MmPfnDatabase; +/* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */ +PPHYSICAL_PAGE MmPfnDatabase[2]; ULONG MmAvailablePages; ULONG MmResidentAvailablePages; @@ -59,7 +60,7 @@ SIZE_T MmSharedCommit; SIZE_T MmDriverCommit; SIZE_T MmProcessCommit; SIZE_T MmPagedPoolCommit; -SIZE_T MmPeakCommitment; +SIZE_T MmPeakCommitment; SIZE_T MmtotalCommitLimitMaximum; MMPFNLIST MmZeroedPageListHead; @@ -101,7 +102,7 @@ MmGetLRUFirstUserPage(VOID) PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); ASSERT_PFN(PageDescriptor); KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return PageDescriptor - MmPfnDatabase; + return PageDescriptor - MmPfnDatabase[0]; } VOID @@ -142,7 +143,7 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn) } PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return PageDescriptor - MmPfnDatabase; + return PageDescriptor - MmPfnDatabase[0]; } VOID @@ -758,9 +759,9 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Mark it as a free page */ - MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPfnDatabase[0][Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE; InsertTailList(&FreeUnzeroedPageListHead, - &MmPfnDatabase[Md->BasePage + i].ListEntry); + &MmPfnDatabase[0][Md->BasePage + i].ListEntry); UnzeroedPageCount++; MmAvailablePages++; } @@ -771,7 +772,7 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Everything else is used memory */ - MmPfnDatabase[Md->BasePage + i] = UsedPage; + MmPfnDatabase[0][Md->BasePage + i] = UsedPage; NrSystemPages++; } } @@ -781,10 +782,10 @@ MmInitializePageList(VOID) for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++) { /* Ensure this page was not added previously */ - ASSERT(MmPfnDatabase[i].Flags.Type == 0); + ASSERT(MmPfnDatabase[0][i].Flags.Type == 0); /* Mark it as used kernel memory */ - MmPfnDatabase[i] = UsedPage; + MmPfnDatabase[0][i] = UsedPage; NrSystemPages++; } @@ -1082,7 +1083,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) MmAvailablePages--; - PfnOffset = PageDescriptor - MmPfnDatabase; + PfnOffset = PageDescriptor - MmPfnDatabase[0]; if ((NeedClear) && (Consumer != MC_SYSTEM)) { MiZeroPage(PfnOffset); @@ -1155,7 +1156,7 @@ MmZeroPageThreadMain(PVOID Ignored) /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - Pfn = PageDescriptor - MmPfnDatabase; + Pfn = PageDescriptor - MmPfnDatabase[0]; Status = MiZeroPage(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 7ac2247df65..dd0dd6ddb13 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -109,7 +109,7 @@ MiInitSystemMemoryAreas() // // Protect the PFN database // - BaseAddress = MmPfnDatabase; + BaseAddress = MmPfnDatabase[0]; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, @@ -292,8 +292,8 @@ MiDbgDumpAddressSpace(VOID) (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize, "Paged Pool"); DPRINT1(" 0x%p - 0x%p\t%s\n", - MmPfnDatabase, - (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT), + MmPfnDatabase[0], + (ULONG_PTR)MmPfnDatabase[0] + (MxPfnAllocation << PAGE_SHIFT), "PFN Database"); DPRINT1(" 0x%p - 0x%p\t%s\n", MmNonPagedPoolStart, From aa9a3648eb062a4fde900837d77b68643d18b981 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 11 Feb 2010 02:22:34 +0000 Subject: [PATCH 82/97] - Fix floppy controller detection - Simplify waiting in Get_Byte and Send_Byte - See issue #4391 for details svn path=/trunk/; revision=45568 --- reactos/drivers/storage/floppy/floppy.c | 15 +-- reactos/drivers/storage/floppy/hardware.c | 120 ++++++---------------- 2 files changed, 40 insertions(+), 95 deletions(-) diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index fe22d3f00ae..dcb79e04a0c 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -686,19 +686,20 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) return STATUS_IO_DEVICE_ERROR; } - /* Check if floppy drive exists */ - if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS) + /* All controllers should support this so + * if we get something strange back then we + * know that this isn't a floppy controller + */ + if (HwGetVersion(ControllerInfo) <= 0) { - WARN_(FLOPPY, "Floppy drive not detected!\n"); + WARN_(FLOPPY, "InitController: unable to contact controller\n"); return STATUS_NO_SUCH_DEVICE; } - INFO_(FLOPPY, "InitController: resetting the controller after floppy detection\n"); - - /* Reset the controller again after drive detection */ + /* Reset the controller to avoid interrupt garbage on certain controllers */ if(HwReset(ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "InitController: unable to reset controller\n"); + WARN_(FLOPPY, "InitController: unable to reset controller #2\n"); return STATUS_IO_DEVICE_ERROR; } diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index 206e56e50a1..d89b5dc9224 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -45,7 +45,6 @@ * with the bit position in the register, or they *might not*. This should * all be converted to standardize on absolute values or shifts. * I prefer bit fields, but they break endianness. - * TODO: Figure out the right delays in Send_Byte and Get_Byte */ #include @@ -54,13 +53,6 @@ #include "floppy.h" #include "hardware.h" -/* - * Global variable that tracks the amount of time we've - * been waiting on the controller - */ -static ULONG TimeIncrement = 0; - - /* * Hardware Support Routines */ @@ -131,60 +123,35 @@ static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, * - Function designed after flowchart in intel datasheet * - 250us max delay. Note that this is exactly 5 times longer * than Microsoft recommends stalling the processor - * - Remember that we can be interrupted here, so this might - * take much more wall clock time than 250us * - PAGED_CODE, because we spin for more than the Microsoft-recommended * maximum. * - This function is necessary because sometimes the FIFO reacts slowly * and isn't yet ready to read or write the next byte - * FIXME: time interval here and in Get_Byte */ { - LARGE_INTEGER StartingTickCount; - LARGE_INTEGER CurrentTickCount; - PUCHAR Address; + int i; PAGED_CODE(); - Address = ControllerInfo->BaseAddress + FIFO; - - if(!TimeIncrement) - TimeIncrement = KeQueryTimeIncrement(); - - StartingTickCount.QuadPart = 0; - - for(;;) + for(i = 0; i < 5; i++) { - if(!ReadyForWrite(ControllerInfo)) - { - ULONG64 ElapsedTicks; - ULONG64 TimeUnits; + if(ReadyForWrite(ControllerInfo)) + break; - /* If this is the first time through... */ - if(!StartingTickCount.QuadPart) - { - KeQueryTickCount(&StartingTickCount); - continue; - } - - /* Otherwise, only do this for 250 us == 2500 100ns units */ - KeQueryTickCount(&CurrentTickCount); - ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; - TimeUnits = ElapsedTicks * TimeIncrement; - - if(TimeUnits > 25000000) - break; - - continue; - } - - WRITE_PORT_UCHAR(Address, Byte); - return STATUS_SUCCESS; + KeStallExecutionProcessor(50); } - INFO_(FLOPPY, "Send_Byte: timed out trying to write\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; + if (i < 5) + { + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO, Byte); + return STATUS_SUCCESS; + } + else + { + INFO_(FLOPPY, "Send_Byte: timed out trying to write\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } @@ -208,52 +175,29 @@ static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, * - PAGED_CODE because we spin for longer than Microsoft recommends */ { - LARGE_INTEGER StartingTickCount; - LARGE_INTEGER CurrentTickCount; - PUCHAR Address; + int i; PAGED_CODE(); - Address = ControllerInfo->BaseAddress + FIFO; - - if(!TimeIncrement) - TimeIncrement = KeQueryTimeIncrement(); - - StartingTickCount.QuadPart = 0; - - for(;;) + for(i = 0; i < 5; i++) { - if(!ReadyForRead(ControllerInfo)) - { - ULONG64 ElapsedTicks; - ULONG64 TimeUnits; + if(ReadyForRead(ControllerInfo)) + break; - /* if this is the first time through, start the timer */ - if(!StartingTickCount.QuadPart) - { - KeQueryTickCount(&StartingTickCount); - continue; - } - - /* Otherwise, only do this for 250 us == 2500 100ns units */ - KeQueryTickCount(&CurrentTickCount); - ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; - TimeUnits = ElapsedTicks * TimeIncrement; - - if(TimeUnits > 25000000) - break; - - continue; - } - - *Byte = READ_PORT_UCHAR(Address); - - return STATUS_SUCCESS; + KeStallExecutionProcessor(50); } - WARN_(FLOPPY, "Get_Byte: timed out trying to read\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; + if (i < 5) + { + *Byte = READ_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO); + return STATUS_SUCCESS; + } + else + { + INFO_(FLOPPY, "Get_Byte: timed out trying to write\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } From 6adba76502ec131ca0d0859072adb2462fbca12b Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 11 Feb 2010 09:15:50 +0000 Subject: [PATCH 83/97] [NTOS]: Fix a stupid bug: x86 has 1024 PDEs, and ARM has 4096 PDEs, not the other way around. [NTOS]: Map the ARM3 PFN database as well, now. [NTOS]: Start initializing the ARM3 PFN database entries, right now for pages that have been mapped directly through PTE/PDE manipulation. svn path=/trunk/; revision=45569 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 2 +- reactos/ntoskrnl/mm/ARM3/miarm.h | 4 +- reactos/ntoskrnl/mm/ARM3/mminit.c | 181 +++++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 5d3b976010b..bf272b168ee 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -507,7 +507,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MiInitializeColorTables(); /* Build the PFN Database */ - //MiInitializePfnDatabase(LoaderBlock); + MiInitializePfnDatabase(LoaderBlock); /* Call back into shitMM to setup the ReactOS PFN database */ MmInitializePageList(); diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index a41b6fcade6..9819e0866a3 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -49,11 +49,11 @@ /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */ #ifdef _M_IX86 #define PD_COUNT 1 -#define PDE_COUNT 4096 +#define PDE_COUNT 1024 #define PTE_COUNT 1024 #elif _M_ARM #define PD_COUNT 1 -#define PDE_COUNT 1024 +#define PDE_COUNT 4096 #define PTE_COUNT 256 #else #error Define these please! diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index b911542bb03..0773ca234be 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -556,6 +556,48 @@ MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PointerPte++; } + /* Get the PTEs for this range */ + PointerPte = MiAddressToPte(&MmPfnDatabase[1][BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[1][BasePage + PageCount]) - 1); + DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); + + /* Loop them */ + while (PointerPte <= LastPte) + { + /* We'll only touch PTEs that aren't already valid */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Use the next free page */ + TempPte.u.Hard.PageFrameNumber = FreePage; + ASSERT(FreePageCount != 0); + + /* Consume free pages */ + FreePage++; + FreePageCount--; + if (!FreePageCount) + { + /* Out of memory */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + FreePageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + /* Write out this PTE */ + PagesLeft++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero this page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next! */ + PointerPte++; + } + /* Do the next address range */ NextEntry = MdBlock->ListEntry.Flink; } @@ -565,6 +607,145 @@ MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MxFreeDescriptor->PageCount = FreePageCount; } +VOID +NTAPI +MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PMMPDE PointerPde; + PMMPTE PointerPte; + ULONG i, Count, j; + PFN_NUMBER PageFrameIndex, StartupPdIndex, PtePageIndex; + PMMPFN Pfn1, Pfn2; + ULONG_PTR BaseAddress = 0; + + /* PFN of the startup page directory */ + StartupPdIndex = PFN_FROM_PTE(MiAddressToPde(PDE_BASE)); + + /* Start with the first PDE and scan them all */ + PointerPde = MiAddressToPde(NULL); + Count = PD_COUNT * PDE_COUNT; + for (i = 0; i < Count; i++) + { + /* Check for valid PDE */ + if (PointerPde->u.Hard.Valid == 1) + { + /* Get the PFN from it */ + PageFrameIndex = PFN_FROM_PTE(PointerPde); + + /* Do we want a PFN entry for this page? */ + if (MiIsRegularMemory(LoaderBlock, PageFrameIndex)) + { + /* Yes we do, set it up */ + //DPRINT1("PDE is valid, setting up PFN entry\n"); + Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + Pfn1->u4.PteFrame = StartupPdIndex; + Pfn1->PteAddress = PointerPde; + Pfn1->u2.ShareCount++; + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + Pfn1->u3.e1.CacheAttribute = MiCached; + } + else + { + /* No PFN entry */ + Pfn1 = NULL; + } + + /* Now get the PTE and scan the pages */ + PointerPte = MiAddressToPte(BaseAddress); + for (j = 0; j < PTE_COUNT; j++) + { + /* Check for a valid PTE */ + if (PointerPte->u.Hard.Valid == 1) + { + /* Increase the shared count of the PFN entry for the PDE */ + ASSERT(Pfn1 != NULL); + Pfn1->u2.ShareCount++; + + /* Now check if the PTE is valid memory too */ + PtePageIndex = PFN_FROM_PTE(PointerPte); + if (MiIsRegularMemory(LoaderBlock, PtePageIndex)) + { + /* + * Only add pages above the end of system code or pages + * that are part of nonpaged pool + */ + if ((BaseAddress >= 0xA0000000) || + ((BaseAddress >= (ULONG_PTR)MmNonPagedPoolStart) && + (BaseAddress < (ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes))) + { + /* Get the PFN entry and make sure it too is valid */ + Pfn2 = MI_PFN_TO_PFNENTRY(PtePageIndex); + if ((MmIsAddressValid(Pfn2)) && + (MmIsAddressValid(Pfn2 + 1))) + { + /* Setup the PFN entry */ + Pfn2->u4.PteFrame = PageFrameIndex; + Pfn2->PteAddress = PointerPte; + Pfn2->u2.ShareCount++; + Pfn2->u3.e2.ReferenceCount = 1; + Pfn2->u3.e1.PageLocation = ActiveAndValid; + Pfn2->u3.e1.CacheAttribute = MiCached; + } + } + } + } + + /* Next PTE */ + PointerPte++; + BaseAddress += PAGE_SIZE; + } + } + else + { + /* Next PDE mapped address */ + BaseAddress += PTE_COUNT * PAGE_SIZE; + } + + /* Next PTE */ + PointerPde++; + } +} + +VOID +NTAPI +MiBuildPfnDatabaseZeroPage(VOID) +{ + /* FIXME: TODO */ +} + +VOID +NTAPI +MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + /* FIXME: TODO */ +} + +VOID +NTAPI +MiBuildPfnDatabaseSelf(VOID) +{ + /* FIXME: TODO */ +} + +VOID +NTAPI +MiInitializePfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + /* Scan memory and start setting up PFN entries */ + MiBuildPfnDatabaseFromPages(LoaderBlock); + + /* Add the zero page */ + MiBuildPfnDatabaseZeroPage(); + + /* Scan the loader block and build the rest of the PFN database */ + MiBuildPfnDatabaseFromLoaderBlock(LoaderBlock); + + /* Finally add the pages for the PFN database itself */ + MiBuildPfnDatabaseSelf(); +} + PFN_NUMBER NTAPI MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, From 43108b2dd024d4661e871b9382548d1f6a5e968f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 11 Feb 2010 17:36:57 +0000 Subject: [PATCH 84/97] [HAL] Restore fs in HalpTrap06. Should fix crash on 1st stage with VBox. svn path=/trunk/; revision=45573 --- reactos/hal/halx86/generic/bios.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/hal/halx86/generic/bios.c b/reactos/hal/halx86/generic/bios.c index 262fdd17207..5db0980bb37 100644 --- a/reactos/hal/halx86/generic/bios.c +++ b/reactos/hal/halx86/generic/bios.c @@ -243,6 +243,7 @@ HalpTrap06() /* Restore ES/DS to known good values first */ Ke386SetEs(KGDT_R3_DATA | RPL_MASK); Ke386SetDs(KGDT_R3_DATA | RPL_MASK); + Ke386SetFs(KGDT_R0_PCR); /* Restore the stack */ KeGetPcr()->TSS->Esp0 = HalpSavedEsp0; From a2fa6b804cba9a6063df89bec4e1a12feb48f238 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 11 Feb 2010 18:31:54 +0000 Subject: [PATCH 85/97] [NTOS]: Fix broken MI_PFNENTRY_TO_PFN macro. svn path=/trunk/; revision=45574 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 9819e0866a3..58660e08844 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -213,7 +213,7 @@ extern ULONG MmMaximumNonPagedPoolPercent; extern ULONG MmLargeStackSize; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) -#define MI_PFNENTRY_TO_PFN(x) (Pfn - &MmPfnDatabase[1]) +#define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) NTSTATUS NTAPI From 2cd1a22f66d95590b98ddb492b46a141d49b8c9a Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 11 Feb 2010 18:33:52 +0000 Subject: [PATCH 86/97] [NTOS]: Remove bogus assertion. svn path=/trunk/; revision=45575 --- reactos/ntoskrnl/include/internal/mm.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index d7c21186f07..04bbcaca2fe 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1082,8 +1082,6 @@ MmPageOutPhysicalAddress(PFN_TYPE Page); /* freelist.c **********************************************************/ -#define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0) - FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_TYPE Pfn) @@ -1100,9 +1098,6 @@ MiGetPfnEntry(IN PFN_TYPE Pfn) /* Get the entry */ Page = &MmPfnDatabase[0][Pfn]; - /* Make sure it's valid */ - ASSERT_PFN(Page); - /* Return it */ return Page; }; From 27494e478b536c649e743f01d059480188fcff30 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 11 Feb 2010 18:41:45 +0000 Subject: [PATCH 87/97] [NTOS]: Get rid of page locking mechanism for MDL since I can't see a reason this would make sense, since these pages won't be scheduled for page out anyway, and that is the only code that looked at this value. svn path=/trunk/; revision=45576 --- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 3 -- reactos/ntoskrnl/mm/anonmem.c | 19 ---------- reactos/ntoskrnl/mm/mmfault.c | 7 ---- reactos/ntoskrnl/mm/rmap.c | 2 +- reactos/ntoskrnl/mm/section.c | 61 ------------------------------- 5 files changed, 1 insertion(+), 91 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index a757d9eac95..7923621d3fa 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -966,7 +966,6 @@ MmProbeAndLockPages(IN PMDL Mdl, // Now lock the page // MmReferencePage(PageFrameIndex); - MmLockPage(PageFrameIndex); } else { @@ -1124,7 +1123,6 @@ MmUnlockPages(IN PMDL Mdl) // // Unlock and dereference // - MmUnlockPage(*MdlPages); MmDereferencePage(*MdlPages); } } while (++MdlPages < LastPage); @@ -1218,7 +1216,6 @@ MmUnlockPages(IN PMDL Mdl) // // Unlock and dereference // - MmUnlockPage(*MdlPages); MmDereferencePage(*MdlPages); } while (++MdlPages < LastPage); diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 495abf6863d..4b288917a2b 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -258,7 +258,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, PMM_REGION Region; PMM_PAGEOP PageOp; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - KIRQL OldIrql; /* * There is a window between taking the page fault and locking the @@ -267,12 +266,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, */ if (MmIsPagePresent(NULL, Address)) { - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(MmGetPfnForProcess(NULL, Address)); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } return(STATUS_SUCCESS); } @@ -363,12 +356,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, return(Status); } MmLockAddressSpace(AddressSpace); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(MmGetPfnForProcess(NULL, Address)); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); return(STATUS_SUCCESS); @@ -440,12 +427,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, /* * Finish the operation */ - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); diff --git a/reactos/ntoskrnl/mm/mmfault.c b/reactos/ntoskrnl/mm/mmfault.c index 15499870af7..e00739bb3b5 100644 --- a/reactos/ntoskrnl/mm/mmfault.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -305,7 +305,6 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) { NTSTATUS Status; PFN_TYPE AllocatedPage; - KIRQL OldIrql; Status = MmRequestPageMemoryConsumer(MC_PPOOL, FALSE, &AllocatedPage); if (!NT_SUCCESS(Status)) @@ -320,11 +319,5 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) PAGE_READWRITE, &AllocatedPage, 1); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(AllocatedPage); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } return(Status); } diff --git a/reactos/ntoskrnl/mm/rmap.c b/reactos/ntoskrnl/mm/rmap.c index e4f096ec9a0..3180e0ed860 100644 --- a/reactos/ntoskrnl/mm/rmap.c +++ b/reactos/ntoskrnl/mm/rmap.c @@ -202,7 +202,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page) ExAcquireFastMutex(&RmapListLock); entry = MmGetRmapListHeadPage(Page); - if (entry == NULL || MmGetLockCountPage(Page) != 0) + if (entry == NULL) { ExReleaseFastMutex(&RmapListLock); return(STATUS_UNSUCCESSFUL); diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index a9c448f5cb8..321a694f0d0 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -792,7 +792,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, PMM_REGION Region; BOOLEAN HasSwapEntry; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - KIRQL OldIrql; /* * There is a window between taking the page fault and locking the @@ -801,12 +800,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, */ if (MmIsPagePresent(Process, Address)) { - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(MmGetPfnForProcess(Process, Address)); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } return(STATUS_SUCCESS); } @@ -930,12 +923,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, } MmInsertRmap(Page, Process, (PVOID)PAddress); } - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } MmUnlockSectionSegment(Segment); PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); @@ -1002,12 +989,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, /* * Finish the operation */ - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1035,16 +1016,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, KeBugCheck(MEMORY_MANAGEMENT); return(Status); } - /* - * Don't add an rmap entry since the page mapped could be for - * anything. - */ - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } /* * Cleanup and release locks @@ -1084,12 +1055,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, return(Status); } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } /* * Cleanup and release locks @@ -1186,12 +1151,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1262,12 +1221,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, KeBugCheck(MEMORY_MANAGEMENT); } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1296,12 +1249,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, KeBugCheck(MEMORY_MANAGEMENT); } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1327,7 +1274,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, PMM_REGION Region; ULONG Entry; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - KIRQL OldIrql; DPRINT("MmAccessFaultSectionView(%x, %x, %x, %x)\n", AddressSpace, MemoryArea, Address, Locked); @@ -1466,13 +1412,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, DPRINT1("Unable to create virtual mapping\n"); KeBugCheck(MEMORY_MANAGEMENT); } - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(NewPage); - MmUnlockPage(OldPage); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } /* * Unshare the old page. From 7872be60713d576fd552607fd4f96822c177c926 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 11 Feb 2010 18:44:28 +0000 Subject: [PATCH 88/97] [NTOS]: Remove many hacks in freelist.c regarding the differences between PHYSICAL_PAGE and MMPFN. ReferenceCount field is now accessed directly. LockCount is gone. Type is gone: if a page is used, it has a consumer and is in the ActiveAndValid state, if it's free, it's on the free or zero page list. Get rid of Zero, if a page is zeroed, it is on the zero page list. [NTOS]: These changes will allow a smoother migration to MMPFN later on. svn path=/trunk/; revision=45577 --- reactos/ntoskrnl/mm/balance.c | 6 +- reactos/ntoskrnl/mm/freelist.c | 311 ++++++++++----------------------- 2 files changed, 97 insertions(+), 220 deletions(-) diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 9f6192bedf2..eae79ccf8ab 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -232,6 +232,8 @@ MiIsBalancerThread(VOID) PsGetCurrentThread() == MiBalancerThreadId.UniqueThread; } +VOID NTAPI MiSetConsumer(IN PFN_TYPE Pfn, IN ULONG Consumer); + NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, @@ -316,8 +318,8 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, { KeBugCheck(NO_PAGES_AVAILABLE); } - /* Update the Consumer */ - MiGetPfnEntry(Page)->u3.e1.PageLocation = Consumer; + /* Update the Consumer and make the page active */ + MiSetConsumer(Page, Consumer); if(Consumer == MC_USER) MmInsertLRULastUserPage(Page); *AllocatedPage = Page; (void)InterlockedDecrementUL(&MiPagesRequired); diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index e32dcb2d1f1..c13b8b21693 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -21,11 +21,6 @@ #define MODULE_INVOLVED_IN_ARM3 #include "ARM3/miarm.h" -/* TYPES *******************************************************************/ - -#define MM_PHYSICAL_PAGE_FREE (0x1) -#define MM_PHYSICAL_PAGE_USED (0x2) - /* GLOBALS ****************************************************************/ // @@ -34,14 +29,9 @@ // // REACTOS NT // -#define Consumer PageLocation -#define Type CacheAttribute -#define Zero PrototypePte -#define LockCount u3.e1.PageColor +#define Consumer u3.e1.PageColor #define RmapListHead AweReferenceCount #define SavedSwapEntry u4.EntireFrame -#define Flags u3.e1 -#define ReferenceCount u3.ReferenceCount #define RemoveEntryList(x) RemoveEntryList((PLIST_ENTRY)x) #define InsertTailList(x, y) InsertTailList(x, (PLIST_ENTRY)y) #define ListEntry u1 @@ -100,7 +90,6 @@ MmGetLRUFirstUserPage(VOID) return 0; } PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); - ASSERT_PFN(PageDescriptor); KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); return PageDescriptor - MmPfnDatabase[0]; } @@ -114,9 +103,9 @@ MmInsertLRULastUserPage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); - ASSERT(Page->Flags.Consumer == MC_USER); +// if (!Page->Consumer != MC_USER) DPRINT1("Page Consumer: %d\n", Page->Consumer); + ASSERT(Page->Consumer == MC_USER); + ASSERT(Page->u3.e1.PageLocation = ActiveAndValid); InsertTailList(&UserPageListHead, &Page->ListEntry); KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } @@ -132,9 +121,8 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(PreviousPfn); - ASSERT(Page); - ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); - ASSERT(Page->Flags.Consumer == MC_USER); + ASSERT(Page->Consumer == MC_USER); + ASSERT(Page->u3.e1.PageLocation = ActiveAndValid); NextListEntry = (PLIST_ENTRY)Page->ListEntry.Flink; if (NextListEntry == &UserPageListHead) { @@ -153,6 +141,14 @@ MmRemoveLRUUserPage(PFN_TYPE Page) RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry); } +BOOLEAN +NTAPI +MiIsPfnInUse(IN PMMPFN Pfn1) +{ + return ((Pfn1->u3.e1.PageLocation != FreePageList) && + (Pfn1->u3.e1.PageLocation != ZeroedPageList)); +} + PFN_NUMBER NTAPI MiFindContiguousPages(IN PFN_NUMBER LowestPfn, @@ -209,7 +205,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // If this PFN is in use, ignore it // - if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue; + if (MiIsPfnInUse(Pfn1)) continue; // // If we haven't chosen a start PFN yet and the caller specified an @@ -244,7 +240,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // Things might've changed for us. Is the page still free? // - if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) break; + if (MiIsPfnInUse(Pfn1)) break; // // So far so good. Is this the last confirmed valid page? @@ -265,7 +261,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // If this was an unzeroed page, there are now less // - if (Pfn1->Flags.Zero == 0) UnzeroedPageCount--; + if (Pfn1->u3.e1.PageLocation == ZeroedPageList) UnzeroedPageCount--; // // One less free page @@ -276,22 +272,25 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // This PFN is now a used page, set it up // RemoveEntryList(&Pfn1->ListEntry); - Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED; - Pfn1->Flags.Consumer = MC_NPPOOL; - Pfn1->ReferenceCount = 1; - Pfn1->LockCount = 0; + Pfn1->Consumer = MC_NPPOOL; + Pfn1->u3.e2.ReferenceCount = 1; Pfn1->SavedSwapEntry = 0; // // Check if it was already zeroed // - if (Pfn1->Flags.Zero == 0) + if (Pfn1->u3.e1.PageLocation != ZeroedPageList) { // // It wasn't, so zero it // MiZeroPage(MiGetPfnEntryIndex(Pfn1)); } + + // + // Mark it in use + // + Pfn1->u3.e1.PageLocation = ActiveAndValid; // // Check if this is the last PFN, otherwise go on @@ -303,8 +302,8 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // Mark the first and last PFN so we can find them later // - Pfn1->Flags.StartOfAllocation = 1; - (Pfn1 + SizeInPages - 1)->Flags.EndOfAllocation = 1; + Pfn1->u3.e1.StartOfAllocation = 1; + (Pfn1 + SizeInPages - 1)->u3.e1.EndOfAllocation = 1; // // Now it's safe to let go of the PFN lock @@ -466,18 +465,17 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // // Make sure it's really free // - ASSERT(Pfn1->Flags.Type == MM_PHYSICAL_PAGE_FREE); - ASSERT(Pfn1->ReferenceCount == 0); + ASSERT(MiIsPfnInUse(Pfn1) == FALSE); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); // // Allocate it and mark it // - Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED; - Pfn1->Flags.Consumer = MC_NPPOOL; - Pfn1->Flags.StartOfAllocation = 1; - Pfn1->Flags.EndOfAllocation = 1; - Pfn1->ReferenceCount = 1; - Pfn1->LockCount = 0; + Pfn1->Consumer = MC_NPPOOL; + Pfn1->u3.e1.StartOfAllocation = 1; + Pfn1->u3.e1.EndOfAllocation = 1; + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; Pfn1->SavedSwapEntry = 0; // @@ -513,29 +511,27 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // // Make sure it's free and if this is our first pass, zeroed // - if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue; - if (Pfn1->Flags.Zero != LookForZeroedPages) continue; + if (!MiIsPfnInUse(Pfn1)) continue; + if ((Pfn1->u3.e1.PageLocation == ZeroedPageList) != LookForZeroedPages) continue; // // Sanity checks // - ASSERT(Pfn1->ReferenceCount == 0); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); // // Now setup the page and mark it // - Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED; - Pfn1->Flags.Consumer = MC_NPPOOL; - Pfn1->ReferenceCount = 1; - Pfn1->Flags.StartOfAllocation = 1; - Pfn1->Flags.EndOfAllocation = 1; - Pfn1->LockCount = 0; + Pfn1->Consumer = MC_NPPOOL; + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.StartOfAllocation = 1; + Pfn1->u3.e1.EndOfAllocation = 1; Pfn1->SavedSwapEntry = 0; // // If this page was unzeroed, we've consumed such a page // - if (!Pfn1->Flags.Zero) UnzeroedPageCount--; + if (Pfn1->u3.e1.PageLocation != ZeroedPageList) UnzeroedPageCount--; // // Decrease available pages @@ -603,7 +599,8 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Pfn1 = MiGetPfnEntry(Page); ASSERT(Pfn1); - if (Pfn1->Flags.Zero == 0) MiZeroPage(Page); + if (Pfn1->u3.e1.PageLocation != ZeroedPageList) MiZeroPage(Page); + Pfn1->u3.e1.PageLocation = ActiveAndValid; } // @@ -620,7 +617,7 @@ MmDumpPfnDatabase(VOID) { ULONG i; PPHYSICAL_PAGE Pfn1; - PCHAR State = "????", Consumer = "Unknown"; + PCHAR State = "????", Type = "Unknown"; KIRQL OldIrql; ULONG Totals[5] = {0}, FreePages = 0; @@ -637,67 +634,63 @@ MmDumpPfnDatabase(VOID) // // Get the consumer // - switch (Pfn1->Flags.Consumer) + switch (Pfn1->Consumer) { case MC_NPPOOL: - Consumer = "Nonpaged Pool"; + Type = "Nonpaged Pool"; break; case MC_PPOOL: - Consumer = "Paged Pool"; + Type = "Paged Pool"; break; case MC_CACHE: - Consumer = "File System Cache"; + Type = "File System Cache"; break; case MC_USER: - Consumer = "Process Working Set"; + Type = "Process Working Set"; break; case MC_SYSTEM: - Consumer = "System"; + Type = "System"; break; } // // Get the type // - switch (Pfn1->Flags.Type) + if (MiIsPfnInUse(Pfn1)) { - case MM_PHYSICAL_PAGE_USED: - - State = "Used"; - Totals[Pfn1->Flags.Consumer]++; - break; - - case MM_PHYSICAL_PAGE_FREE: - - State = "Free"; - Consumer = "Free"; - FreePages++; - break; + State = "Used"; + Totals[Pfn1->Consumer]++; } - + else + { + State = "Free"; + Type = "Free"; + FreePages++; + break; + } + // // Pretty-print the page // - DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d) [%08p])\n", + DbgPrint("0x%08p:\t%04s\t%20s\t(%02d) [%08p])\n", i << PAGE_SHIFT, State, - Consumer, - Pfn1->ReferenceCount, - Pfn1->LockCount, + Type, + Pfn1->u3.e2.ReferenceCount, Pfn1->RmapListHead); } DbgPrint("Nonpaged Pool: %d pages\t[%d KB]\n", Totals[MC_NPPOOL], (Totals[MC_NPPOOL] << PAGE_SHIFT) / 1024); - DbgPrint("Paged Pool: %d pages\t[%d KB]\n", Totals[MC_PPOOL], (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024); + DbgPrint("Paged Pool: %d pages\t[%d KB]\n", Totals[MC_PPOOL], (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024); DbgPrint("File System Cache: %d pages\t[%d KB]\n", Totals[MC_CACHE], (Totals[MC_CACHE] << PAGE_SHIFT) / 1024); DbgPrint("Process Working Set: %d pages\t[%d KB]\n", Totals[MC_USER], (Totals[MC_USER] << PAGE_SHIFT) / 1024); DbgPrint("System: %d pages\t[%d KB]\n", Totals[MC_SYSTEM], (Totals[MC_SYSTEM] << PAGE_SHIFT) / 1024); @@ -723,9 +716,9 @@ MmInitializePageList(VOID) /* This is what a used page looks like */ RtlZeroMemory(&UsedPage, sizeof(UsedPage)); - UsedPage.Flags.Type = MM_PHYSICAL_PAGE_USED; - UsedPage.Flags.Consumer = MC_NPPOOL; - UsedPage.ReferenceCount = 1; + UsedPage.Consumer = MC_NPPOOL; + UsedPage.u3.e1.PageLocation = ActiveAndValid; + UsedPage.u3.e2.ReferenceCount = 1; /* Loop the memory descriptors */ for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; @@ -759,7 +752,7 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Mark it as a free page */ - MmPfnDatabase[0][Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPfnDatabase[0][Md->BasePage + i].u3.e1.PageLocation = FreePageList; InsertTailList(&FreeUnzeroedPageListHead, &MmPfnDatabase[0][Md->BasePage + i].ListEntry); UnzeroedPageCount++; @@ -782,7 +775,7 @@ MmInitializePageList(VOID) for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++) { /* Ensure this page was not added previously */ - ASSERT(MmPfnDatabase[0][i].Flags.Type == 0); + ASSERT(MmPfnDatabase[0][i].Consumer == 0); /* Mark it as used kernel memory */ MmPfnDatabase[0][i] = UsedPage; @@ -859,13 +852,8 @@ MmReferencePage(PFN_TYPE Pfn) Page = MiGetPfnEntry(Pfn); ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Referencing non-used page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->ReferenceCount++; + Page->u3.e2.ReferenceCount++; } ULONG @@ -881,13 +869,8 @@ MmGetReferenceCountPage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Getting reference count for free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - RCount = Page->ReferenceCount; + RCount = Page->u3.e2.ReferenceCount; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); return(RCount); @@ -897,10 +880,16 @@ BOOLEAN NTAPI MmIsPageInUse(PFN_TYPE Pfn) { + return MiIsPfnInUse(MiGetPfnEntry(Pfn)); +} - DPRINT("MmIsPageInUse(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - return (MiGetPfnEntry(Pfn)->Flags.Type == MM_PHYSICAL_PAGE_USED); +VOID +NTAPI +MiSetConsumer(IN PFN_TYPE Pfn, + IN ULONG Type) +{ + MiGetPfnEntry(Pfn)->Consumer = Type; + MiGetPfnEntry(Pfn)->u3.e1.PageLocation = ActiveAndValid; } VOID @@ -914,45 +903,12 @@ MmDereferencePage(PFN_TYPE Pfn) Page = MiGetPfnEntry(Pfn); ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Dereferencing free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->ReferenceCount == 0) - { - DPRINT1("Derefrencing page with reference count 0\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - Page->ReferenceCount--; - if (Page->ReferenceCount == 0) + Page->u3.e2.ReferenceCount--; + if (Page->u3.e2.ReferenceCount == 0) { MmAvailablePages++; - if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry); - if (Page->RmapListHead != (LONG)NULL) - { - DPRINT1("Freeing page with rmap entries.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->LockCount > 0) - { - DPRINT1("Freeing locked page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->SavedSwapEntry != 0) - { - DPRINT1("Freeing page with swap entry.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Freeing page with flags %x\n", - Page->Flags.Type); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->Flags.Type = MM_PHYSICAL_PAGE_FREE; - Page->Flags.Consumer = MC_MAXIMUM; + if (Page->Consumer == MC_USER) RemoveEntryList(&Page->ListEntry); + Page->u3.e1.PageLocation = FreePageList; InsertTailList(&FreeUnzeroedPageListHead, &Page->ListEntry); UnzeroedPageCount++; @@ -963,73 +919,9 @@ MmDereferencePage(PFN_TYPE Pfn) } } -ULONG -NTAPI -MmGetLockCountPage(PFN_TYPE Pfn) -{ - KIRQL oldIrql; - ULONG CurrentLockCount; - PPHYSICAL_PAGE Page; - - DPRINT("MmGetLockCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Getting lock count for free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - CurrentLockCount = Page->LockCount; - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - - return(CurrentLockCount); -} - -VOID -NTAPI -MmLockPage(PFN_TYPE Pfn) -{ - PPHYSICAL_PAGE Page; - - DPRINT("MmLockPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Locking free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - Page->LockCount++; -} - -VOID -NTAPI -MmUnlockPage(PFN_TYPE Pfn) -{ - PPHYSICAL_PAGE Page; - - DPRINT("MmUnlockPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Unlocking free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - Page->LockCount--; -} - PFN_TYPE NTAPI -MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) +MmAllocPage(ULONG Type, SWAPENTRY SwapEntry) { PFN_TYPE PfnOffset; PLIST_ENTRY ListEntry; @@ -1065,29 +957,19 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); } - if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE) - { - DPRINT1("Got non-free page from freelist\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (PageDescriptor->ReferenceCount != 0) - { - DPRINT1("%d\n", PageDescriptor->ReferenceCount); - KeBugCheck(MEMORY_MANAGEMENT); - } - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; - PageDescriptor->Flags.Consumer = Consumer; - PageDescriptor->ReferenceCount = 1; - PageDescriptor->LockCount = 0; + PageDescriptor->Consumer = Type; + PageDescriptor->u3.e2.ReferenceCount = 1; PageDescriptor->SavedSwapEntry = SwapEntry; MmAvailablePages--; PfnOffset = PageDescriptor - MmPfnDatabase[0]; - if ((NeedClear) && (Consumer != MC_SYSTEM)) + if ((NeedClear) && (Type != MC_SYSTEM)) { MiZeroPage(PfnOffset); } + + PageDescriptor->u3.e1.PageLocation = ActiveAndValid; return PfnOffset; } @@ -1135,11 +1017,6 @@ MmZeroPageThreadMain(PVOID Ignored) KernelMode, FALSE, NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZeroPageThread: Wait failed\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } if (ZeroPageThreadShouldTerminate) { @@ -1154,14 +1031,12 @@ MmZeroPageThreadMain(PVOID Ignored) UnzeroedPageCount--; PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); Pfn = PageDescriptor - MmPfnDatabase[0]; Status = MiZeroPage(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - PageDescriptor->Flags.Zero = 1; - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE; + PageDescriptor->u3.e1.PageLocation = ZeroedPageList; if (NT_SUCCESS(Status)) { InsertHeadList(&FreeZeroedPageListHead, ListEntry); From bfa7d233cdac440ea811fd57127dee46603b9724 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 11 Feb 2010 20:23:48 +0000 Subject: [PATCH 89/97] [DEVMGR] Display Matching Device ID. svn path=/trunk/; revision=45578 --- reactos/dll/win32/devmgr/advprop.c | 51 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/devmgr/advprop.c b/reactos/dll/win32/devmgr/advprop.c index f3f69553306..dc43c04dacf 100644 --- a/reactos/dll/win32/devmgr/advprop.c +++ b/reactos/dll/win32/devmgr/advprop.c @@ -851,6 +851,52 @@ DisplayCsFlags(IN PDEVADVPROP_INFO dap, } +static VOID +DisplayMatchingDeviceId(IN PDEVADVPROP_INFO dap, + IN HWND hwndListView) +{ + HDEVINFO DeviceInfoSet; + PSP_DEVINFO_DATA DeviceInfoData; + WCHAR szBuffer[256]; + HKEY hKey; + DWORD dwSize; + DWORD dwType; + + if (dap->CurrentDeviceInfoSet != INVALID_HANDLE_VALUE) + { + DeviceInfoSet = dap->CurrentDeviceInfoSet; + DeviceInfoData = &dap->CurrentDeviceInfoData; + } + else + { + DeviceInfoSet = dap->DeviceInfoSet; + DeviceInfoData = &dap->DeviceInfoData; + } + + hKey = SetupDiOpenDevRegKey(DeviceInfoSet, + DeviceInfoData, + DICS_FLAG_GLOBAL, + 0, + DIREG_DRV, + KEY_QUERY_VALUE); + if (hKey != INVALID_HANDLE_VALUE) + { + dwSize = 256 * sizeof(WCHAR); + if (RegQueryValueEx(hKey, + L"MatchingDeviceId", + NULL, + &dwType, + (LPBYTE)szBuffer, + &dwSize) == ERROR_SUCCESS) + { + SetListViewText(hwndListView, 0, szBuffer); + } + + RegCloseKey(hKey); + } +} + + static VOID DisplayDeviceProperties(IN PDEVADVPROP_INFO dap, IN HWND hwndComboBox, @@ -873,7 +919,6 @@ DisplayDeviceProperties(IN PDEVADVPROP_INFO dap, SetListViewText(hwndListView, 0, dap->szDeviceID); break; - case 1: /* Hardware ID */ DisplayDevicePropertyText(dap, hwndListView, @@ -886,10 +931,10 @@ DisplayDeviceProperties(IN PDEVADVPROP_INFO dap, SPDRP_COMPATIBLEIDS); break; -#if 0 case 3: /* Matching ID */ + DisplayMatchingDeviceId(dap, + hwndListView); break; -#endif case 4: /* Service */ DisplayDevicePropertyText(dap, From a19cbab2fc439e135949c616016b9dec7d3162ae Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 11 Feb 2010 21:04:57 +0000 Subject: [PATCH 90/97] [WDMAUD_KERNEL] - Replace mixer / wave support code by mmixer library [MMIXER] - Compare device name from 2 character onwards as there are difference in paths in user mode / kernel mode - Invoke create pin callback if the caller provides it [WDMAUD.DRV] - Apply changes from mmixer library -- Tested in Vbox with Winamp / ReactOS mplay32 svn path=/trunk/; revision=45579 --- reactos/boot/bootdata/packages/reactos.dff | 22 +- reactos/dll/win32/wdmaud.drv/mmixer.c | 2 +- .../drivers/wdm/audio/legacy/wdmaud/control.c | 33 +- .../drivers/wdm/audio/legacy/wdmaud/entry.c | 4 +- .../drivers/wdm/audio/legacy/wdmaud/mixer.c | 2438 ----------------- .../drivers/wdm/audio/legacy/wdmaud/mmixer.c | 663 +++++ reactos/drivers/wdm/audio/legacy/wdmaud/sup.c | 109 +- .../drivers/wdm/audio/legacy/wdmaud/wave.c | 756 ----- .../drivers/wdm/audio/legacy/wdmaud/wdmaud.h | 132 +- .../wdm/audio/legacy/wdmaud/wdmaud.rbuild | 9 +- reactos/lib/drivers/sound/mmixer/mmixer.h | 11 + reactos/lib/drivers/sound/mmixer/sup.c | 2 +- reactos/lib/drivers/sound/mmixer/wave.c | 31 +- 13 files changed, 891 insertions(+), 3321 deletions(-) delete mode 100644 reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c create mode 100644 reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c delete mode 100644 reactos/drivers/wdm/audio/legacy/wdmaud/wave.c diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index df124e93293..733aba39959 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -156,7 +156,7 @@ dll\directx\dinput8\dinput8.dll 1 dll\directx\dmusic\dmusic.dll 1 dll\directx\dplay\dplay.dll 1 dll\directx\dplayx\dplayx.dll 1 -dll\directx\dsound\dsound.dll 1 +dll\directx\dsound_new\dsound.dll 1 dll\directx\dxdiagn\dxdiagn.dll 1 dll\directx\wine\ddraw\ddraw.dll 1 dll\directx\d3d8thk\d3d8thk.dll 1 @@ -515,7 +515,7 @@ drivers\storage\ide\pciidex\pciidex.sys 2 ;drivers\usb\miniport\usbuhci\usbuhci.sys 2 ;drivers\usb\usbhub\usbhub.sys 2 ;drivers\usb\usbport\usbport.sys 2 -drivers\usb\nt4compat\usbdriver\usbdriver.sys 2 +;drivers\usb\nt4compat\usbdriver\usbdriver.sys 2 drivers\video\displays\vga\vgaddi.dll 1 drivers\video\displays\framebuf\framebuf.dll 1 @@ -528,6 +528,7 @@ drivers\wdm\audio\filters\kmixer\kmixer.sys 2 drivers\wdm\audio\sysaudio\sysaudio.sys 2 drivers\wdm\audio\legacy\wdmaud\wdmaud.sys 2 drivers\wdm\audio\backpln\portcls\portcls.sys 2 +drivers\wdm\audio\backpln\audio_test\audio_test.exe 1 drivers\wdm\audio\drm\drmk\drmk.sys 2 drivers\wmi\wmilib.sys 2 @@ -798,4 +799,21 @@ modules\rostests\winetests\wintrust\wintrust_winetest.exe 7 o modules\rostests\winetests\wlanapi\wlanapi_winetest.exe 7 optional modules\rostests\winetests\ws2_32\ws2_32_winetest.exe 7 optional + modules\wallpaper\Angelus_02_ROSWP.bmp 4 optional +modules\windows\alcxwdm.sys 2 optional +modules\windows\dlkfet5b.sys 2 optional +modules\windows\cmaudio.sys 2 optional +modules\windows\cmaudio.inf 6 optional +;modules\windows\es1370mp.sys 2 optional +;modules\windows\es1371mp.sys 2 optional +modules\windows\alcxwdm.inf 6 optional +modules\windows\netdlfet.inf 6 optional +modules\windows\ks.inf 6 optional +;modules\windows\wdma_ens.inf 6 optional +modules\windows\b.mp3 7 optional +modules\windows\winamp.exe 7 optional +modules\windows\windows.wav 7 optional +modules\windows\D530.exe 7 optional +modules\windows\vmaudio.sys 2 optional +modules\windows\vmaudio.inf 6 optional diff --git a/reactos/dll/win32/wdmaud.drv/mmixer.c b/reactos/dll/win32/wdmaud.drv/mmixer.c index 6ef1515c025..0b7cac15a2d 100644 --- a/reactos/dll/win32/wdmaud.drv/mmixer.c +++ b/reactos/dll/win32/wdmaud.drv/mmixer.c @@ -467,7 +467,7 @@ WdmAudSetWdmWaveDeviceFormatByMMixer( bWaveIn = (DeviceType == WAVE_IN_DEVICE_TYPE ? TRUE : FALSE); - if (MMixerOpenWave(&MixerContext, DeviceId, bWaveIn, WaveFormat, &Instance->Handle) == MM_STATUS_SUCCESS) + if (MMixerOpenWave(&MixerContext, DeviceId, bWaveIn, WaveFormat, NULL, NULL, &Instance->Handle) == MM_STATUS_SUCCESS) { if (DeviceType == WAVE_OUT_DEVICE_TYPE) { diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c index b5f1c53a968..07e9ef846d2 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c @@ -8,17 +8,7 @@ */ #include "wdmaud.h" -const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}}; -const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; const GUID KSPROPSETID_Sysaudio = {0xCBE3FAA0L, 0xCC75, 0x11D0, {0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6}}; -const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; -const GUID KSINTERFACESETID_Standard = {0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; -const GUID KSMEDIUMSETID_Standard = {0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; -const GUID KSDATAFORMAT_TYPE_AUDIO = {0x73647561L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; -const GUID KSDATAFORMAT_SUBTYPE_PCM = {0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; -const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = {0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}}; -const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; - NTSTATUS WdmAudControlOpen( @@ -55,15 +45,15 @@ WdmAudControlDeviceType( if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE) { - Result = DeviceExtension->MixerInfoCount; + Result = WdmAudGetMixerDeviceCount(); } else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) { - Result = DeviceExtension->WaveOutDeviceCount; + Result = WdmAudGetWaveInDeviceCount(); } else if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) { - Result = DeviceExtension->WaveInDeviceCount; + Result = WdmAudGetWaveOutDeviceCount(); } /* store result count */ @@ -221,7 +211,6 @@ WdmAudGetDeviceInterface( PWDMAUD_DEVICE_EXTENSION DeviceExtension; NTSTATUS Status; LPWSTR Device; - LPWAVE_INFO WaveInfo; ULONG Size, Length; /* get device extension */ @@ -233,7 +222,7 @@ WdmAudGetDeviceInterface( if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE || DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) { /* get wave info */ - Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo); + Status = WdmAudGetPnpNameByIndexAndType(DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &Device); /* check for success */ if (!NT_SUCCESS(Status)) @@ -242,14 +231,6 @@ WdmAudGetDeviceInterface( return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); } - Status = GetSysAudioDevicePnpName(DeviceObject, WaveInfo->FilterId, &Device); - /* check for success */ - if (!NT_SUCCESS(Status)) - { - /* invalid device id */ - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - } - /* calculate length */ Length = (wcslen(Device)+1) * sizeof(WCHAR); @@ -275,13 +256,13 @@ WdmAudGetDeviceInterface( } else if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE) { - if (DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount) + if (DeviceInfo->DeviceIndex >= WdmAudGetMixerDeviceCount()) { /* invalid device id */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, sizeof(WDMAUD_DEVICE_INFO)); } - Status = GetSysAudioDevicePnpName(DeviceObject, DeviceExtension->MixerInfo[DeviceInfo->DeviceIndex].DeviceIndex, &Device); + Status = WdmAudGetMixerPnpNameByIndex(DeviceInfo->DeviceIndex, &Device); /* check for success */ if (!NT_SUCCESS(Status)) { @@ -308,8 +289,6 @@ WdmAudGetDeviceInterface( //FIXME SEH RtlMoveMemory(DeviceInfo->u.Interface.DeviceInterfaceString, Device, Length); } - - ExFreePool(Device); return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); } diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c b/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c index 013be6aa020..20421ead5e4 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c @@ -80,9 +80,7 @@ WdmAudInstallDevice( } Status = WdmAudMixerInitialize(DeviceObject); - DPRINT("WdmAudMixerInitialize Status %x\n", Status); - Status = WdmAudWaveInitialize(DeviceObject); - DPRINT("WdmAudWaveInitialize Status %x\n", Status); + DPRINT("WdmAudMixerInitialize Status %x WaveIn %lu WaveOut %lu Mixer %lu\n", Status, WdmAudGetWaveInDeviceCount(), WdmAudGetWaveOutDeviceCount(), WdmAudGetMixerDeviceCount()); DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING; diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c deleted file mode 100644 index 5de3872e55d..00000000000 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c +++ /dev/null @@ -1,2438 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel Streaming - * FILE: drivers/wdm/audio/legacy/wdmaud/mixer.c - * PURPOSE: System Audio graph builder - * PROGRAMMER: Andrew Greenwood - * Johannes Anderwald - */ -#include "wdmaud.h" - -const GUID KSNODETYPE_DAC = {0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_ADC = {0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_AGC = {0xE88C9BA0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_LOUDNESS = {0x41887440L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_MUTE = {0x02B223C0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_TONE = {0x7607E580L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_VOLUME = {0x3A5ACC00L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_PEAKMETER = {0xa085651e, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}}; -const GUID KSNODETYPE_MUX = {0x2CEAF780, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_STEREO_WIDE = {0xA9E69800L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_CHORUS = {0x20173F20L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_REVERB = {0xEF0328E0L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_SUPERMIX = {0xE573ADC0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_SUM = {0xDA441A60L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; - -#define DESTINATION_LINE 0xFFFF0000 - -LPMIXERLINE_EXT -GetSourceMixerLine( - LPMIXER_INFO MixerInfo, - DWORD dwSource) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - DPRINT("dwSource %x dwSource %x\n", MixerLineSrc->Line.dwSource, dwSource); - if (MixerLineSrc->Line.dwSource == dwSource) - return MixerLineSrc; - - Entry = Entry->Flink; - } - - return NULL; -} - -LPMIXERCONTROL_DATA -GetMixerControlDataById( - PLIST_ENTRY ListHead, - DWORD dwControlId) -{ - PLIST_ENTRY Entry; - LPMIXERCONTROL_DATA Control; - - /* get first entry */ - Entry = ListHead->Flink; - - while(Entry != ListHead) - { - Control = (LPMIXERCONTROL_DATA)CONTAINING_RECORD(Entry, MIXERCONTROL_DATA, Entry); - DPRINT("dwSource %x dwSource %x\n", Control->dwControlID, dwControlId); - if (Control->dwControlID == dwControlId) - return Control; - - Entry = Entry->Flink; - } - return NULL; -} - -NTSTATUS -GetMixerControlById( - LPMIXER_INFO MixerInfo, - DWORD dwControlID, - LPMIXERLINE_EXT *MixerLine, - LPMIXERCONTROLW *MixerControl, - PULONG NodeId) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - ULONG Index; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - - for(Index = 0; Index < MixerLineSrc->Line.cControls; Index++) - { - if (MixerLineSrc->LineControls[Index].dwControlID == dwControlID) - { - if (MixerLine) - *MixerLine = MixerLineSrc; - if (MixerControl) - *MixerControl = &MixerLineSrc->LineControls[Index]; - if (NodeId) - *NodeId = MixerLineSrc->NodeIds[Index]; - return STATUS_SUCCESS; - } - } - Entry = Entry->Flink; - } - - return STATUS_NOT_FOUND; -} - -LPMIXERLINE_EXT -GetSourceMixerLineByComponentType( - LPMIXER_INFO MixerInfo, - DWORD dwComponentType) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - if (MixerLineSrc->Line.dwComponentType == dwComponentType) - return MixerLineSrc; - - Entry = Entry->Flink; - } - - return NULL; -} - -LPMIXERLINE_EXT -GetSourceMixerLineByLineId( - LPMIXER_INFO MixerInfo, - DWORD dwLineID) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - DPRINT("dwLineID %x dwLineID %x\n", MixerLineSrc->Line.dwLineID, dwLineID); - if (MixerLineSrc->Line.dwLineID == dwLineID) - return MixerLineSrc; - - Entry = Entry->Flink; - } - - return NULL; -} - - - -ULONG -GetPinCount( - IN PFILE_OBJECT FileObject) -{ - KSPROPERTY Pin; - NTSTATUS Status; - ULONG NumPins, BytesReturned; - - Pin.Flags = KSPROPERTY_TYPE_GET; - Pin.Set = KSPROPSETID_Pin; - Pin.Id = KSPROPERTY_PIN_CTYPES; - - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&NumPins, sizeof(ULONG), &BytesReturned); - if (!NT_SUCCESS(Status)) - return 0; - - return NumPins; -} - - -ULONG -GetSysAudioDeviceCount( - IN PDEVICE_OBJECT DeviceObject) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - KSPROPERTY Pin; - ULONG Count, BytesReturned; - NTSTATUS Status; - - /* setup the query request */ - Pin.Set = KSPROPSETID_Sysaudio; - Pin.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT; - Pin.Flags = KSPROPERTY_TYPE_GET; - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* query sysaudio for the device count */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned); - if (!NT_SUCCESS(Status)) - return 0; - - return Count; -} - -NTSTATUS -GetSysAudioDevicePnpName( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - OUT LPWSTR * Device) -{ - ULONG BytesReturned; - KSP_PIN Pin; - NTSTATUS Status; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - - /* first check if the device index is within bounds */ - if (DeviceIndex >= GetSysAudioDeviceCount(DeviceObject)) - return STATUS_INVALID_PARAMETER; - - /* setup the query request */ - Pin.Property.Set = KSPROPSETID_Sysaudio; - Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.PinId = DeviceIndex; - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* query sysaudio for the device path */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), NULL, 0, &BytesReturned); - - /* check if the request failed */ - if (Status != STATUS_BUFFER_TOO_SMALL || BytesReturned == 0) - return STATUS_UNSUCCESSFUL; - - /* allocate buffer for the device */ - *Device = ExAllocatePool(NonPagedPool, BytesReturned); - if (!Device) - return STATUS_INSUFFICIENT_RESOURCES; - - /* query sysaudio again for the device path */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), (PVOID)*Device, BytesReturned, &BytesReturned); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(*Device); - return Status; - } - - return Status; -} - -ULONG -GetDeviceIndexFromPnpName( - IN PDEVICE_OBJECT DeviceObject, - LPWSTR Device) -{ - ULONG Count, Index; - LPWSTR DeviceName; - NTSTATUS Status; - - /* get device count */ - Count = GetSysAudioDeviceCount(DeviceObject); - - if (!Count) - return MAXULONG; - - for(Index = 0; Index < Count; Index++) - { - /* get device name */ - Status = GetSysAudioDevicePnpName(DeviceObject, Index, &DeviceName); - if (NT_SUCCESS(Status)) - { - if (!wcsicmp(Device, DeviceName)) - { - /* found device index */ - ExFreePool(DeviceName); - return Index; - } - ExFreePool(DeviceName); - } - } - - return MAXULONG; -} - - -NTSTATUS -OpenDevice( - IN LPWSTR Device, - OUT PHANDLE DeviceHandle, - OUT PFILE_OBJECT * FileObject) -{ - NTSTATUS Status; - HANDLE hDevice; - - /* now open the device */ - Status = WdmAudOpenSysAudioDevice(Device, &hDevice); - - if (!NT_SUCCESS(Status)) - { - return Status; - } - - *DeviceHandle = hDevice; - - if (FileObject) - { - Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL); - - if (!NT_SUCCESS(Status)) - { - ZwClose(hDevice); - } - } - - return Status; - -} - - -NTSTATUS -OpenSysAudioDeviceByIndex( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN PHANDLE DeviceHandle, - IN PFILE_OBJECT * FileObject) -{ - LPWSTR Device = NULL; - NTSTATUS Status; - - Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, &Device); - if (!NT_SUCCESS(Status)) - return Status; - - Status = OpenDevice(Device, DeviceHandle, FileObject); - - /* free device buffer */ - ExFreePool(Device); - - return Status; -} - -NTSTATUS -GetFilterNodeProperty( - IN PFILE_OBJECT FileObject, - IN ULONG PropertyId, - PKSMULTIPLE_ITEM * Item) -{ - NTSTATUS Status; - ULONG BytesReturned; - PKSMULTIPLE_ITEM MultipleItem; - KSPROPERTY Property; - - /* setup query request */ - Property.Id = PropertyId; - Property.Flags = KSPROPERTY_TYPE_GET; - Property.Set = KSPROPSETID_Topology; - - /* query for required size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned); - - /* check for success */ - if (Status != STATUS_MORE_ENTRIES) - return Status; - - /* allocate buffer */ - MultipleItem = (PKSMULTIPLE_ITEM)ExAllocatePool(NonPagedPool, BytesReturned); - if (!MultipleItem) - return STATUS_INSUFFICIENT_RESOURCES; - - /* query for required size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)MultipleItem, BytesReturned, &BytesReturned); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(MultipleItem); - return Status; - } - - *Item = MultipleItem; - return Status; -} - -ULONG -CountNodeType( - PKSMULTIPLE_ITEM MultipleItem, - LPGUID NodeType) -{ - ULONG Count; - ULONG Index; - LPGUID Guid; - - Count = 0; - Guid = (LPGUID)(MultipleItem+1); - - /* iterate through node type array */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (IsEqualGUIDAligned(NodeType, Guid)) - { - /* found matching guid */ - Count++; - } - Guid++; - } - return Count; -} - -ULONG -GetNodeTypeIndex( - PKSMULTIPLE_ITEM MultipleItem, - LPGUID NodeType) -{ - ULONG Index; - LPGUID Guid; - - Guid = (LPGUID)(MultipleItem+1); - - /* iterate through node type array */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (IsEqualGUIDAligned(NodeType, Guid)) - { - /* found matching guid */ - return Index; - } - Guid++; - } - return MAXULONG; -} - -ULONG -GetControlTypeFromTopologyNode( - IN LPGUID NodeType) -{ - if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_AGC)) - { - // automatic gain control - return MIXERCONTROL_CONTROLTYPE_ONOFF; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_LOUDNESS)) - { - // loudness control - return MIXERCONTROL_CONTROLTYPE_LOUDNESS; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUTE )) - { - // mute control - return MIXERCONTROL_CONTROLTYPE_MUTE; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_TONE)) - { - // tpne control - //FIXME - // MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported - // MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported - // MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported - UNIMPLEMENTED; - return MIXERCONTROL_CONTROLTYPE_ONOFF; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_VOLUME)) - { - // volume control - return MIXERCONTROL_CONTROLTYPE_VOLUME; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_PEAKMETER)) - { - // peakmeter control - return MIXERCONTROL_CONTROLTYPE_PEAKMETER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) - { - // mux control - return MIXERCONTROL_CONTROLTYPE_MUX; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) - { - // mux control - return MIXERCONTROL_CONTROLTYPE_MUX; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_STEREO_WIDE)) - { - // stero wide control - return MIXERCONTROL_CONTROLTYPE_FADER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_CHORUS)) - { - // chorus control - return MIXERCONTROL_CONTROLTYPE_FADER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_REVERB)) - { - // reverb control - return MIXERCONTROL_CONTROLTYPE_FADER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_SUPERMIX)) - { - // supermix control - // MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported - UNIMPLEMENTED; - return MIXERCONTROL_CONTROLTYPE_VOLUME; - } - UNIMPLEMENTED - return 0; -} - -NTSTATUS -GetPhysicalConnection( - IN PFILE_OBJECT FileObject, - IN ULONG PinId, - OUT PKSPIN_PHYSICALCONNECTION *OutConnection) -{ - KSP_PIN Pin; - NTSTATUS Status; - ULONG BytesReturned; - PKSPIN_PHYSICALCONNECTION Connection; - - /* setup the request */ - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Id = KSPROPERTY_PIN_PHYSICALCONNECTION; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.PinId = PinId; - - /* query the pin for the physical connection */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - - if (Status == STATUS_NOT_FOUND) - { - /* pin does not have a physical connection */ - return Status; - } - - Connection = ExAllocatePool(NonPagedPool, BytesReturned); - if (!Connection) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* query the pin for the physical connection */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Connection, BytesReturned, &BytesReturned); - if (!NT_SUCCESS(Status)) - { - /* failed to query the physical connection */ - ExFreePool(Connection); - return Status; - } - - /* store connection */ - *OutConnection = Connection; - return Status; -} - -NTSTATUS -GetNodeIndexes( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG NodeIndex, - IN ULONG bNode, - IN ULONG bFrom, - OUT PULONG NodeReferenceCount, - OUT PULONG *NodeReference) -{ - ULONG Index, Count = 0; - PKSTOPOLOGY_CONNECTION Connection; - PULONG Refs; - - /* KSMULTIPLE_ITEM is followed by several KSTOPOLOGY_CONNECTION */ - Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - - /* first count all referenced nodes */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - //DbgPrint("FromPin %u FromNode %u ToPin %u ToNode %u\n", Connection->FromNodePin, Connection->FromNode, Connection->ToNodePin, Connection->ToNode); - if (bNode) - { - if (bFrom) - { - if (Connection->FromNode == NodeIndex) - { - /* node id has a connection */ - Count++; - } - } - else - { - if (Connection->ToNode == NodeIndex) - { - /* node id has a connection */ - Count++; - } - } - } - else - { - if (bFrom) - { - if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE) - { - /* node id has a connection */ - Count++; - } - } - else - { - if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE) - { - /* node id has a connection */ - Count++; - } - } - } - - - /* move to next connection */ - Connection++; - } - - ASSERT(Count != 0); - - /* now allocate node index array */ - Refs = ExAllocatePool(NonPagedPool, sizeof(ULONG) * Count); - if (!Refs) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* clear node index array */ - RtlZeroMemory(Refs, Count * sizeof(ULONG)); - - Count = 0; - Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (bNode) - { - if (bFrom) - { - if (Connection->FromNode == NodeIndex) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - else - { - if (Connection->ToNode == NodeIndex) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - } - else - { - if (bFrom) - { - if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - else - { - if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - } - - /* move to next connection */ - Connection++; - } - - /* store result */ - *NodeReference = Refs; - *NodeReferenceCount = Count; - - return STATUS_SUCCESS; -} - - -NTSTATUS -GetTargetPinsByNodeConnectionIndex( - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG bUpDirection, - IN ULONG NodeConnectionIndex, - OUT PULONG Pins) -{ - PKSTOPOLOGY_CONNECTION Connection; - ULONG PinId, NodeConnectionCount, Index; - PULONG NodeConnection; - NTSTATUS Status; - - - /* sanity check */ - ASSERT(NodeConnectionIndex < NodeConnections->Count); - - Connection = (PKSTOPOLOGY_CONNECTION)(NodeConnections + 1); - - DPRINT("FromNode %u FromNodePin %u -> ToNode %u ToNodePin %u\n", Connection[NodeConnectionIndex].FromNode, Connection[NodeConnectionIndex].FromNodePin, Connection[NodeConnectionIndex].ToNode, Connection[NodeConnectionIndex].ToNodePin ); - - if ((Connection[NodeConnectionIndex].ToNode == KSFILTER_NODE && bUpDirection == FALSE) || - (Connection[NodeConnectionIndex].FromNode == KSFILTER_NODE && bUpDirection == TRUE)) - { - /* iteration stops here */ - if (bUpDirection) - PinId = Connection[NodeConnectionIndex].FromNodePin; - else - PinId = Connection[NodeConnectionIndex].ToNodePin; - - DPRINT("GetTargetPinsByNodeIndex FOUND Target Pin %u Parsed %u\n", PinId, Pins[PinId]); - - /* mark pin index as a target pin */ - Pins[PinId] = TRUE; - return STATUS_SUCCESS; - } - - /* get all node indexes referenced by that node */ - if (bUpDirection) - { - Status = GetNodeIndexes(NodeConnections, Connection[NodeConnectionIndex].FromNode, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - } - else - { - Status = GetNodeIndexes(NodeConnections, Connection[NodeConnectionIndex].ToNode, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - } - - if (NT_SUCCESS(Status)) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* iterate recursively into the nodes */ - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins); - ASSERT(Status == STATUS_SUCCESS); - } - /* free node connection indexes */ - ExFreePool(NodeConnection); - } - - return Status; -} - - - -NTSTATUS -GetTargetPins( - PKSMULTIPLE_ITEM NodeTypes, - PKSMULTIPLE_ITEM NodeConnections, - IN ULONG NodeIndex, - IN ULONG bUpDirection, - PULONG Pins, - ULONG PinCount) -{ - ULONG NodeConnectionCount, Index; - NTSTATUS Status; - PULONG NodeConnection; - - /* sanity check */ - ASSERT(NodeIndex != (ULONG)-1); - - /* get all node indexes referenced by that pin */ - if (bUpDirection) - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - else - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - - DPRINT("NodeIndex %u Status %x Count %u\n", NodeIndex, Status, NodeConnectionCount); - - if (NT_SUCCESS(Status)) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins); - ASSERT(Status == STATUS_SUCCESS); - } - ExFreePool(NodeConnection); - } - - return Status; -} - -PULONG -AllocatePinArray( - ULONG PinCount) -{ - PULONG Pins = ExAllocatePool(NonPagedPool, PinCount * sizeof(ULONG)); - if (!Pins) - return NULL; - - RtlZeroMemory(Pins, sizeof(ULONG) * PinCount); - - return Pins; -} - -PKSTOPOLOGY_CONNECTION -GetConnectionByIndex( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG Index) -{ - PKSTOPOLOGY_CONNECTION Descriptor; - - ASSERT(Index < MultipleItem->Count); - - Descriptor = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - return &Descriptor[Index]; -} - -LPGUID -GetNodeType( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG Index) -{ - LPGUID NodeType; - - ASSERT(Index < MultipleItem->Count); - - NodeType = (LPGUID)(MultipleItem + 1); - return &NodeType[Index]; -} - -NTSTATUS -GetControlsFromPinByConnectionIndex( - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG bUpDirection, - IN ULONG NodeConnectionIndex, - OUT PULONG Nodes) -{ - PKSTOPOLOGY_CONNECTION CurConnection; - LPGUID NodeType; - ULONG NodeIndex; - NTSTATUS Status; - ULONG NodeConnectionCount, Index; - PULONG NodeConnection; - - - /* get current connection */ - CurConnection = GetConnectionByIndex(NodeConnections, NodeConnectionIndex); - - if (bUpDirection) - NodeIndex = CurConnection->FromNode; - else - NodeIndex = CurConnection->ToNode; - - /* get target node type of current connection */ - NodeType = GetNodeType(NodeTypes, NodeIndex); - - if (IsEqualGUIDAligned(NodeType, &KSNODETYPE_SUM) || IsEqualGUIDAligned(NodeType, &KSNODETYPE_MUX)) - { - if (bUpDirection) - { - /* add the sum / mux node to destination line */ - Nodes[NodeIndex] = TRUE; - } - - return STATUS_SUCCESS; - } - - /* now add the node */ - Nodes[NodeIndex] = TRUE; - - - /* get all node indexes referenced by that node */ - if (bUpDirection) - { - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - } - else - { - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - } - - if (NT_SUCCESS(Status)) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* iterate recursively into the nodes */ - Status = GetControlsFromPinByConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes); - ASSERT(Status == STATUS_SUCCESS); - } - /* free node connection indexes */ - ExFreePool(NodeConnection); - } - - return Status; -} - -NTSTATUS -GetControlsFromPin( - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG PinId, - IN ULONG bUpDirection, - OUT PULONG Nodes) -{ - ULONG NodeConnectionCount, Index; - NTSTATUS Status; - PULONG NodeConnection; - - /* sanity check */ - ASSERT(PinId != (ULONG)-1); - - /* get all node indexes referenced by that pin */ - if (bUpDirection) - Status = GetNodeIndexes(NodeConnections, PinId, FALSE, FALSE, &NodeConnectionCount, &NodeConnection); - else - Status = GetNodeIndexes(NodeConnections, PinId, FALSE, TRUE, &NodeConnectionCount, &NodeConnection); - - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* get all associated controls */ - Status = GetControlsFromPinByConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes); - } - - ExFreePool(NodeConnection); - - return Status; -} - -NTSTATUS -AddMixerControl( - IN LPMIXER_INFO MixerInfo, - IN PFILE_OBJECT FileObject, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG NodeIndex, - IN LPMIXERLINE_EXT MixerLine, - OUT LPMIXERCONTROLW MixerControl) -{ - LPGUID NodeType; - KSP_NODE Node; - ULONG BytesReturned; - NTSTATUS Status; - LPWSTR Name; - - /* initialize mixer control */ - MixerControl->cbStruct = sizeof(MIXERCONTROLW); - MixerControl->dwControlID = MixerInfo->ControlId; - - /* get node type */ - NodeType = GetNodeType(NodeTypes, NodeIndex); - /* store control type */ - MixerControl->dwControlType = GetControlTypeFromTopologyNode(NodeType); - - MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; //FIXME - MixerControl->cMultipleItems = 0; //FIXME - - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) - { - MixerControl->Bounds.dwMinimum = 0; - MixerControl->Bounds.dwMaximum = 1; - } - else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - MixerControl->Bounds.dwMinimum = 0; - MixerControl->Bounds.dwMaximum = 0xFFFF; - MixerControl->Metrics.cSteps = 0xC0; //FIXME - } - - /* setup request to retrieve name */ - Node.NodeId = NodeIndex; - Node.Property.Id = KSPROPERTY_TOPOLOGY_NAME; - Node.Property.Flags = KSPROPERTY_TYPE_GET; - Node.Property.Set = KSPROPSETID_Topology; - Node.Reserved = 0; - - /* get node name size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), NULL, 0, &BytesReturned); - - if (Status == STATUS_BUFFER_TOO_SMALL) - { - ASSERT(BytesReturned != 0); - Name = ExAllocatePool(NonPagedPool, BytesReturned); - if (!Name) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* get node name */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), (LPVOID)Name, BytesReturned, &BytesReturned); - if (NT_SUCCESS(Status)) - { - RtlMoveMemory(MixerControl->szShortName, Name, (min(MIXER_SHORT_NAME_CHARS, wcslen(Name)+1)) * sizeof(WCHAR)); - MixerControl->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0'; - - RtlMoveMemory(MixerControl->szName, Name, (min(MIXER_LONG_NAME_CHARS, wcslen(Name)+1)) * sizeof(WCHAR)); - MixerControl->szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; - } - - /* free name buffer */ - ExFreePool(Name); - } - - MixerInfo->ControlId++; -#if 0 - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUX) - { - KSNODEPROPERTY Property; - ULONG PinId = 2; - - /* setup the request */ - RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY)); - - Property.NodeId = NodeIndex; - Property.Property.Id = KSPROPERTY_AUDIO_MUX_SOURCE; - Property.Property.Flags = KSPROPERTY_TYPE_SET; - Property.Property.Set = KSPROPSETID_Audio; - - /* get node volume level info */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY), (PVOID)&PinId, sizeof(ULONG), &BytesReturned); - - DPRINT1("Status %x NodeIndex %u PinId %u\n", Status, NodeIndex, PinId); - //DbgBreakPoint(); - }else -#endif - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - KSNODEPROPERTY_AUDIO_CHANNEL Property; - ULONG Length; - PKSPROPERTY_DESCRIPTION Desc; - PKSPROPERTY_MEMBERSHEADER Members; - PKSPROPERTY_STEPPING_LONG Range; - - Length = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG); - Desc = ExAllocatePool(NonPagedPool, Length); - ASSERT(Desc); - RtlZeroMemory(Desc, Length); - - /* setup the request */ - RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL)); - - Property.NodeProperty.NodeId = NodeIndex; - Property.NodeProperty.Property.Id = KSPROPERTY_AUDIO_VOLUMELEVEL; - Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_BASICSUPPORT; - Property.NodeProperty.Property.Set = KSPROPSETID_Audio; - - /* get node volume level info */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), Desc, Length, &BytesReturned); - - if (NT_SUCCESS(Status)) - { - LPMIXERVOLUME_DATA VolumeData; - ULONG Steps, MaxRange, Index; - LONG Value; - - Members = (PKSPROPERTY_MEMBERSHEADER)(Desc + 1); - Range = (PKSPROPERTY_STEPPING_LONG)(Members + 1); //98304 - - DPRINT("NodeIndex %u Range Min %d Max %d Steps %x UMin %x UMax %x\n", NodeIndex, Range->Bounds.SignedMinimum, Range->Bounds.SignedMaximum, Range->SteppingDelta, Range->Bounds.UnsignedMinimum, Range->Bounds.UnsignedMaximum); - - MaxRange = Range->Bounds.UnsignedMaximum - Range->Bounds.UnsignedMinimum; - - if (MaxRange) - { - ASSERT(MaxRange); - VolumeData = ExAllocatePool(NonPagedPool, sizeof(MIXERVOLUME_DATA)); - if (!VolumeData) - return STATUS_INSUFFICIENT_RESOURCES; - - Steps = MaxRange / Range->SteppingDelta + 1; - - /* store mixer control info there */ - VolumeData->Header.dwControlID = MixerControl->dwControlID; - VolumeData->SignedMaximum = Range->Bounds.SignedMaximum; - VolumeData->SignedMinimum = Range->Bounds.SignedMinimum; - VolumeData->SteppingDelta = Range->SteppingDelta; - VolumeData->ValuesCount = Steps; - VolumeData->InputSteppingDelta = 0x10000 / Steps; - - VolumeData->Values = ExAllocatePool(NonPagedPool, sizeof(LONG) * Steps); - if (!VolumeData->Values) - { - ExFreePool(Desc); - ExFreePool(VolumeData); - - return STATUS_INSUFFICIENT_RESOURCES; - } - - Value = Range->Bounds.SignedMinimum; - for(Index = 0; Index < Steps; Index++) - { - VolumeData->Values[Index] = Value; - Value += Range->SteppingDelta; - } - InsertTailList(&MixerLine->LineControlsExtraData, &VolumeData->Header.Entry); - } - } - ExFreePool(Desc); - } - - - DPRINT("Status %x Name %S\n", Status, MixerControl->szName); - return STATUS_SUCCESS; -} - -NTSTATUS -AddMixerSourceLine( - IN OUT LPMIXER_INFO MixerInfo, - IN PFILE_OBJECT FileObject, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG DeviceIndex, - IN ULONG PinId, - IN ULONG bBridgePin, - IN ULONG bTargetPin) -{ - LPMIXERLINE_EXT SrcLine, DstLine; - NTSTATUS Status; - KSP_PIN Pin; - LPWSTR PinName; - GUID NodeType; - ULONG BytesReturned, ControlCount, Index; - PULONG Nodes; - - if (!bTargetPin) - { - /* allocate src mixer line */ - SrcLine = (LPMIXERLINE_EXT)ExAllocatePool(NonPagedPool, sizeof(MIXERLINE_EXT)); - - if (!SrcLine) - return STATUS_INSUFFICIENT_RESOURCES; - - /* zero struct */ - RtlZeroMemory(SrcLine, sizeof(MIXERLINE_EXT)); - - } - else - { - ASSERT(!IsListEmpty(&MixerInfo->LineList)); - SrcLine = GetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); - } - - /* get destination line */ - DstLine = GetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); - ASSERT(DstLine); - - - if (!bTargetPin) - { - /* initialize mixer src line */ - SrcLine->DeviceIndex = DeviceIndex; - SrcLine->PinId = PinId; - SrcLine->Line.cbStruct = sizeof(MIXERLINEW); - - /* initialize mixer destination line */ - SrcLine->Line.cbStruct = sizeof(MIXERLINEW); - SrcLine->Line.dwDestination = 0; - SrcLine->Line.dwSource = DstLine->Line.cConnections; - SrcLine->Line.dwLineID = (DstLine->Line.cConnections * 0x10000); - SrcLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE | MIXERLINE_LINEF_SOURCE; - SrcLine->Line.dwUser = 0; - SrcLine->Line.cChannels = DstLine->Line.cChannels; - SrcLine->Line.cConnections = 0; - SrcLine->Line.Target.dwType = 1; - SrcLine->Line.Target.dwDeviceID = DstLine->Line.Target.dwDeviceID; - SrcLine->Line.Target.wMid = MixerInfo->MixCaps.wMid; - SrcLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; - SrcLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; - InitializeListHead(&SrcLine->LineControlsExtraData); - wcscpy(SrcLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); - - } - - /* allocate a node arrary */ - Nodes = ExAllocatePool(NonPagedPool, sizeof(ULONG) * NodeTypes->Count); - - if (!Nodes) - { - /* not enough memory */ - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* clear nodes array */ - RtlZeroMemory(Nodes, sizeof(ULONG) * NodeTypes->Count); - - Status = GetControlsFromPin(NodeConnections, NodeTypes, PinId, bTargetPin, Nodes); - if (!NT_SUCCESS(Status)) - { - /* something went wrong */ - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - ExFreePool(Nodes); - return Status; - } - - /* now count all nodes controlled by that pin */ - ControlCount = 0; - for(Index = 0; Index < NodeTypes->Count; Index++) - { - if (Nodes[Index]) - ControlCount++; - } - - /* now allocate the line controls */ - if (ControlCount) - { - SrcLine->LineControls = ExAllocatePool(NonPagedPool, sizeof(MIXERCONTROLW) * ControlCount); - - if (!SrcLine->LineControls) - { - /* no memory available */ - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - ExFreePool(Nodes); - return STATUS_INSUFFICIENT_RESOURCES; - } - - SrcLine->NodeIds = ExAllocatePool(NonPagedPool, sizeof(ULONG) * ControlCount); - if (!SrcLine->NodeIds) - { - /* no memory available */ - ExFreePool(SrcLine->LineControls); - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - ExFreePool(Nodes); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* zero line controls */ - RtlZeroMemory(SrcLine->LineControls, sizeof(MIXERCONTROLW) * ControlCount); - RtlZeroMemory(SrcLine->NodeIds, sizeof(ULONG) * ControlCount); - - ControlCount = 0; - for(Index = 0; Index < NodeTypes->Count; Index++) - { - if (Nodes[Index]) - { - /* store the node index for retrieving / setting details */ - SrcLine->NodeIds[ControlCount] = Index; - - Status = AddMixerControl(MixerInfo, FileObject, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]); - if (NT_SUCCESS(Status)) - { - /* increment control count on success */ - ControlCount++; - } - } - } - /* store control count */ - SrcLine->Line.cControls = ControlCount; - } - - /* release nodes array */ - ExFreePool(Nodes); - - /* get pin category */ - Pin.PinId = PinId; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_CATEGORY; - - /* try get pin category */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)&NodeType, sizeof(GUID), &BytesReturned); - if (NT_SUCCESS(Status)) - { - //FIXME - //map component type - } - - /* retrieve pin name */ - Pin.PinId = PinId; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_NAME; - - /* try get pin name size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - - if (Status != STATUS_MORE_ENTRIES) - { - SrcLine->Line.szShortName[0] = L'\0'; - SrcLine->Line.szName[0] = L'\0'; - } - else - { - PinName = (LPWSTR)ExAllocatePool(NonPagedPool, BytesReturned); - if (PinName) - { - /* try get pin name */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)PinName, BytesReturned, &BytesReturned); - - if (NT_SUCCESS(Status)) - { - RtlMoveMemory(SrcLine->Line.szShortName, PinName, (min(MIXER_SHORT_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); - SrcLine->Line.szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0'; - - RtlMoveMemory(SrcLine->Line.szName, PinName, (min(MIXER_LONG_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); - SrcLine->Line.szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; - } - ExFreePool(PinName); - } - } - - /* insert src line */ - if (!bTargetPin) - { - InsertTailList(&MixerInfo->LineList, &SrcLine->Entry); - DstLine->Line.cConnections++; - } - - return STATUS_SUCCESS; -} - - -NTSTATUS -AddMixerSourceLines( - IN OUT LPMIXER_INFO MixerInfo, - IN PFILE_OBJECT FileObject, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG DeviceIndex, - IN ULONG PinsCount, - IN ULONG BridgePinIndex, - IN ULONG TargetPinIndex, - IN PULONG Pins) -{ - ULONG Index; - NTSTATUS Status = STATUS_SUCCESS; - - for(Index = PinsCount; Index > 0; Index--) - { - if (Pins[Index-1]) - { - AddMixerSourceLine(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, Index-1, (Index -1 == BridgePinIndex), (Index -1 == TargetPinIndex)); - } - } - return Status; -} - - - -NTSTATUS -HandlePhysicalConnection( - IN OUT LPMIXER_INFO MixerInfo, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG bInput, - IN PKSPIN_PHYSICALCONNECTION OutConnection) -{ - PULONG PinsRef = NULL, PinConnectionIndex = NULL, PinsSrcRef; - ULONG PinsRefCount, Index, PinConnectionIndexCount, DeviceIndex; - NTSTATUS Status; - HANDLE hDevice = NULL; - PFILE_OBJECT FileObject = NULL; - PKSMULTIPLE_ITEM NodeTypes = NULL; - PKSMULTIPLE_ITEM NodeConnections = NULL; - PULONG MixerControls; - ULONG MixerControlsCount; - - - /* open the connected filter */ - Status = OpenDevice(OutConnection->SymbolicLinkName, &hDevice, &FileObject); - if (!NT_SUCCESS(Status)) - { - DPRINT1("OpenDevice failed with %x\n", Status); - return Status; - } - - /* get device index */ - DeviceIndex = GetDeviceIndexFromPnpName(DeviceObject, OutConnection->SymbolicLinkName); - - /* get connected filter pin count */ - PinsRefCount = GetPinCount(FileObject); - ASSERT(PinsRefCount); - - PinsRef = AllocatePinArray(PinsRefCount); - if (!PinsRef) - { - /* no memory */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - /* get topology node types */ - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetFilterNodeProperty failed with %x\n", Status); - goto cleanup; - } - - /* get topology connections */ - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetFilterNodeProperty failed with %x\n", Status); - goto cleanup; - } - /* gets connection index of the bridge pin which connects to a node */ - DPRINT("Pin %u\n", OutConnection->Pin); - Status = GetNodeIndexes(NodeConnections, OutConnection->Pin, FALSE, !bInput, &PinConnectionIndexCount, &PinConnectionIndex); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetNodeIndexes failed with %x\n", Status); - goto cleanup; - } - - /* there should be no split in the bride pin */ - ASSERT(PinConnectionIndexCount == 1); - - /* find all target pins of this connection */ - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, FALSE, PinConnectionIndex[0], PinsRef); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetTargetPinsByNodeConnectionIndex failed with %x\n", Status); - goto cleanup; - } - - for(Index = 0; Index < PinsRefCount; Index++) - { - if (PinsRef[Index]) - { - - /* found a target pin, now get all references */ - Status = GetNodeIndexes(NodeConnections, Index, FALSE, FALSE, &MixerControlsCount, &MixerControls); - if (!NT_SUCCESS(Status)) - break; - - /* sanity check */ - ASSERT(MixerControlsCount == 1); - - - PinsSrcRef = AllocatePinArray(PinsRefCount); - if (!PinsSrcRef) - { - /* no memory */ - ExFreePool(MixerControls); - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - /* now get all connected source pins */ - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, TRUE, MixerControls[0], PinsSrcRef); - if (!NT_SUCCESS(Status)) - { - /* no memory */ - ExFreePool(MixerControls); - ExFreePool(PinsSrcRef); - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - /* add pins from target line */ - if (!bInput) - { - // dont add bridge pin for input mixers - PinsSrcRef[Index] = TRUE; - PinsSrcRef[OutConnection->Pin] = TRUE; - } - PinsSrcRef[OutConnection->Pin] = TRUE; - - Status = AddMixerSourceLines(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, PinsRefCount, OutConnection->Pin, Index, PinsSrcRef); - - ExFreePool(MixerControls); - ExFreePool(PinsSrcRef); - } - } - -cleanup: - - if (PinsRef) - ExFreePool(PinsRef); - - if (NodeConnections) - ExFreePool(NodeConnections); - - if (NodeTypes) - ExFreePool(NodeTypes); - - if (FileObject) - ObDereferenceObject(FileObject); - - if (hDevice) - ZwClose(hDevice); - - if (PinConnectionIndex) - ExFreePool(PinConnectionIndex); - - - return Status; -} - - - -NTSTATUS -InitializeMixer( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN OUT LPMIXER_INFO MixerInfo, - IN HANDLE hDevice, - IN PFILE_OBJECT FileObject, - IN ULONG PinCount, - IN PKSMULTIPLE_ITEM NodeTypes, - IN PKSMULTIPLE_ITEM NodeConnections, - IN ULONG NodeIndex, - IN ULONG bInput) -{ - WCHAR Buffer[100]; - LPWSTR Device; - NTSTATUS Status; - PULONG Pins; - ULONG Index; - PKSPIN_PHYSICALCONNECTION OutConnection; - LPMIXERLINE_EXT DestinationLine; - - DestinationLine = ExAllocatePool(NonPagedPool, sizeof(MIXERLINE_EXT)); - if (!DestinationLine) - return STATUS_INSUFFICIENT_RESOURCES; - - /* intialize mixer caps */ - MixerInfo->MixCaps.wMid = MM_MICROSOFT; //FIXME - MixerInfo->MixCaps.wPid = MM_PID_UNMAPPED; //FIXME - MixerInfo->MixCaps.vDriverVersion = 1; //FIXME - MixerInfo->MixCaps.fdwSupport = 0; - MixerInfo->MixCaps.cDestinations = 1; - MixerInfo->DeviceIndex = DeviceIndex; - - /* get target pnp name */ - Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, &Device); - if (NT_SUCCESS(Status)) - { - /* find product name */ - Status = FindProductName(Device, sizeof(Buffer) / sizeof(WCHAR), Buffer); - if (NT_SUCCESS(Status)) - { - if (bInput) - wcscat(Buffer, L" Input"); - else - wcscat(Buffer, L" output"); - RtlMoveMemory(MixerInfo->MixCaps.szPname, Buffer, min(MAXPNAMELEN, wcslen(Buffer)+1) * sizeof(WCHAR)); - MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0'; - } - ExFreePool(Device); - } - - /* initialize mixer destination line */ - RtlZeroMemory(DestinationLine, sizeof(MIXERLINE_EXT)); - DestinationLine->Line.cbStruct = sizeof(MIXERLINEW); - DestinationLine->Line.dwSource = MAXULONG; - DestinationLine->Line.dwLineID = DESTINATION_LINE; - DestinationLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE; - DestinationLine->Line.dwUser = 0; - DestinationLine->Line.dwComponentType = (bInput == 0 ? MIXERLINE_COMPONENTTYPE_DST_SPEAKERS : MIXERLINE_COMPONENTTYPE_DST_WAVEIN); - DestinationLine->Line.cChannels = 2; //FIXME - wcscpy(DestinationLine->Line.szShortName, L"Summe"); //FIXME - wcscpy(DestinationLine->Line.szName, L"Summe"); //FIXME - DestinationLine->Line.Target.dwType = (bInput == 0 ? MIXERLINE_TARGETTYPE_WAVEOUT : MIXERLINE_TARGETTYPE_WAVEIN); - DestinationLine->Line.Target.dwDeviceID = !bInput; - DestinationLine->Line.Target.wMid = MixerInfo->MixCaps.wMid; - DestinationLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; - DestinationLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; - wcscpy(DestinationLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); - - /* initialize source line list */ - InitializeListHead(&MixerInfo->LineList); - InitializeListHead(&DestinationLine->LineControlsExtraData); - - /* insert destination line */ - InsertHeadList(&MixerInfo->LineList, &DestinationLine->Entry); - - Pins = AllocatePinArray(PinCount); - if (!Pins) - return STATUS_INSUFFICIENT_RESOURCES; - - if (bInput) - { - Status = GetTargetPins(NodeTypes, NodeConnections, NodeIndex, TRUE, Pins, PinCount); - } - else - { - Status = GetTargetPins(NodeTypes, NodeConnections, NodeIndex, FALSE, Pins, PinCount); - } - - for(Index = 0; Index < PinCount; Index++) - { - if (Pins[Index]) - { - Status = GetPhysicalConnection(FileObject, Index, &OutConnection); - if (NT_SUCCESS(Status)) - { - Status = HandlePhysicalConnection(MixerInfo, DeviceObject, bInput, OutConnection); - ExFreePool(OutConnection); - } - } - } - ExFreePool(Pins); - - return STATUS_SUCCESS; -} - -NTSTATUS -WdmAudMixerInitialize( - IN PDEVICE_OBJECT DeviceObject) -{ - ULONG DeviceCount, Index, Count, NodeIndex, PinCount; - NTSTATUS Status; - HANDLE hDevice; - PFILE_OBJECT FileObject; - PKSMULTIPLE_ITEM NodeTypes, NodeConnections; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - - /* get number of devices */ - DeviceCount = GetSysAudioDeviceCount(DeviceObject); - - if (!DeviceCount) - { - /* no audio devices available atm */ - DeviceExtension->MixerInfoCount = 0; - DeviceExtension->MixerInfo = NULL; - return STATUS_SUCCESS; - } - - /* each virtual audio device can at most have an input + output mixer */ - DeviceExtension->MixerInfo = ExAllocatePool(NonPagedPool, sizeof(MIXER_INFO) * DeviceCount * 2); - if (!DeviceExtension->MixerInfo) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* clear mixer info */ - RtlZeroMemory(DeviceExtension->MixerInfo, sizeof(MIXER_INFO) * DeviceCount * 2); - - Index = 0; - Count = 0; - do - { - /* open the virtual audio device */ - Status = OpenSysAudioDeviceByIndex(DeviceObject, Index, &hDevice, &FileObject); - - if (NT_SUCCESS(Status)) - { - /* retrieve all available node types */ - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - ZwClose(hDevice); - break; - } - - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - ZwClose(hDevice); - ExFreePool(NodeTypes); - break; - } - - /* get num of pins */ - PinCount = GetPinCount(FileObject); - /* get the first available dac node index */ - NodeIndex = GetNodeTypeIndex(NodeTypes, (LPGUID)&KSNODETYPE_DAC); - if (NodeIndex != (ULONG)-1) - { - Status = InitializeMixer(DeviceObject, Index, &DeviceExtension->MixerInfo[Count], hDevice, FileObject, PinCount, NodeTypes, NodeConnections, NodeIndex, FALSE); - if (NT_SUCCESS(Status)) - { - /* increment mixer offset */ - Count++; - } - } - - /* get the first available adc node index */ - NodeIndex = GetNodeTypeIndex(NodeTypes, (LPGUID)&KSNODETYPE_ADC); - if (NodeIndex != (ULONG)-1) - { - Status = InitializeMixer(DeviceObject, Index, &DeviceExtension->MixerInfo[Count], hDevice, FileObject, PinCount, NodeTypes, NodeConnections, NodeIndex, TRUE); - if (NT_SUCCESS(Status)) - { - /* increment mixer offset */ - Count++; - } - } - - /* free node connections array */ - ExFreePool(NodeTypes); - ExFreePool(NodeConnections); - - /* close virtual audio device */ - ObDereferenceObject(FileObject); - ZwClose(hDevice); - - } - /* increment virtual audio device index */ - Index++; - }while(Index < DeviceCount); - - /* store mixer count */ - DeviceExtension->MixerInfoCount = Count; - - return Status; -} - - - -NTSTATUS -WdmAudMixerCapabilities( - IN PDEVICE_OBJECT DeviceObject, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo, - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) -{ - if ((ULONG)DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return STATUS_INVALID_PARAMETER; - } - - /* copy cached mixer caps */ - RtlMoveMemory(&DeviceInfo->u.MixCaps, &DeviceExtension->MixerInfo[(ULONG)DeviceInfo->DeviceIndex].MixCaps, sizeof(MIXERCAPSW)); - - return STATUS_SUCCESS; -} - - -NTSTATUS -WdmAudControlOpenMixer( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - ULONG Index; - PWDMAUD_HANDLE Handels; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - PKEVENT EventObject = NULL; - - DPRINT("WdmAudControlOpenMixer\n"); - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount) - { - /* mixer index doesnt exist */ - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - if (DeviceInfo->u.hNotifyEvent) - { - Status = ObReferenceObjectByHandle(DeviceInfo->u.hNotifyEvent, EVENT_MODIFY_STATE, ExEventObjectType, UserMode, (LPVOID*)&EventObject, NULL); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Invalid notify event passed %p from client %p\n", DeviceInfo->u.hNotifyEvent, ClientInfo); - DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - } - - - for(Index = 0; Index < ClientInfo->NumPins; Index++) - { - if (ClientInfo->hPins[Index].Handle == (HANDLE)DeviceInfo->DeviceIndex && ClientInfo->hPins[Index].Type == MIXER_DEVICE_TYPE) - { - /* re-use pseudo handle */ - DeviceInfo->hDevice = (HANDLE)DeviceInfo->DeviceIndex; - ClientInfo->hPins[Index].NotifyEvent = EventObject; - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - } - - Handels = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1)); - - if (Handels) - { - if (ClientInfo->NumPins) - { - RtlMoveMemory(Handels, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins); - ExFreePool(ClientInfo->hPins); - } - - ClientInfo->hPins = Handels; - ClientInfo->hPins[ClientInfo->NumPins].Handle = (HANDLE)DeviceInfo->DeviceIndex; - ClientInfo->hPins[ClientInfo->NumPins].Type = MIXER_DEVICE_TYPE; - ClientInfo->hPins[ClientInfo->NumPins].NotifyEvent = EventObject; - ClientInfo->NumPins++; - } - else - { - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); - } - DeviceInfo->hDevice = (HANDLE)DeviceInfo->DeviceIndex; - - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); -} - -NTSTATUS -NTAPI -WdmAudGetLineInfo( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - LPMIXERLINE_EXT MixerLineSrc; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - if (DeviceInfo->Flags == MIXER_GETLINEINFOF_DESTINATION) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - if (DeviceInfo->u.MixLine.dwDestination != 0) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE); - ASSERT(MixerLineSrc); - - /* copy cached data */ - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_SOURCE) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE); - ASSERT(MixerLineSrc); - - if (DeviceInfo->u.MixLine.dwSource >= MixerLineSrc->Line.cConnections) - { - DPRINT1("dwSource %u > Destinations %u\n", DeviceInfo->u.MixLine.dwSource, MixerLineSrc->Line.cConnections); - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLine(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwSource); - if (MixerLineSrc) - { - DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName); - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - } - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_LINEID) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwLineID); - if (!MixerLineSrc) - { - DPRINT1("Failed to find Line with id %u\n", DeviceInfo->u.MixLine.dwLineID); - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - /* copy cached data */ - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_COMPONENTTYPE) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByComponentType(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwComponentType); - if (!MixerLineSrc) - { - DPRINT1("Failed to find component type %x\n", DeviceInfo->u.MixLine.dwComponentType); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - ASSERT(MixerLineSrc); - - /* copy cached data */ - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - - DPRINT("Flags %x\n", DeviceInfo->Flags); - UNIMPLEMENTED; - - //DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - -} - -NTSTATUS -NTAPI -WdmAudGetLineControls( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - LPMIXERLINE_EXT MixerLineSrc; - LPMIXERCONTROLW MixerControl; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - ULONG Index; - NTSTATUS Status; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ALL) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); - ASSERT(MixerLineSrc); - if (MixerLineSrc) - { - RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerLineSrc->LineControls, min(MixerLineSrc->Line.cControls, DeviceInfo->u.MixControls.cControls) * sizeof(MIXERCONTROLW)); - } - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); - ASSERT(MixerLineSrc); - - Index = 0; - for(Index = 0; Index < MixerLineSrc->Line.cControls; Index++) - { - DPRINT("dwControlType %x\n", MixerLineSrc->LineControls[Index].dwControlType); - if (DeviceInfo->u.MixControls.dwControlType == MixerLineSrc->LineControls[Index].dwControlType) - { - RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, &MixerLineSrc->LineControls[Index], sizeof(MIXERCONTROLW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - } - DPRINT("DeviceInfo->u.MixControls.dwControlType %x not found in Line %x cControls %u \n", DeviceInfo->u.MixControls.dwControlType, DeviceInfo->u.MixControls.dwLineID, MixerLineSrc->Line.cControls); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYID) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - DPRINT("MixerId %u ControlId %u\n",(ULONG_PTR)DeviceInfo->hDevice, DeviceInfo->u.MixControls.dwControlID); - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwControlID, NULL, &MixerControl, NULL); - if (NT_SUCCESS(Status)) - { - RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerControl, sizeof(MIXERCONTROLW)); - } - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - } - - UNIMPLEMENTED; - //DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - -} - -NTSTATUS -SetGetControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceId, - IN ULONG NodeId, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN ULONG bSet, - IN ULONG PropertyId, - IN ULONG Channel, - IN PLONG InputValue) -{ - KSNODEPROPERTY_AUDIO_CHANNEL Property; - NTSTATUS Status; - HANDLE hDevice; - PFILE_OBJECT FileObject; - LONG Value; - ULONG BytesReturned; - - if (bSet) - Value = *InputValue; - - /* open virtual audio device */ - Status = OpenSysAudioDeviceByIndex(DeviceObject, DeviceId, &hDevice, &FileObject); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - return Status; - } - - /* setup the request */ - RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL)); - - Property.NodeProperty.NodeId = NodeId; - Property.NodeProperty.Property.Id = PropertyId; - Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY; - Property.NodeProperty.Property.Set = KSPROPSETID_Audio; - Property.Channel = Channel; - - if (bSet) - Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_SET; - else - Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_GET; - - /* send the request */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), (PVOID)&Value, sizeof(LONG), &BytesReturned); - - ObDereferenceObject(FileObject); - ZwClose(hDevice); - - if (!bSet) - { - *InputValue = Value; - } - - DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status, bSet, NodeId, Value, PropertyId); - return Status; -} - -NTSTATUS -NotifyWdmAudClients( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NotificationType, - IN HANDLE hMixer, - IN ULONG Value) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - PLIST_ENTRY Entry; - PWDMAUD_CLIENT CurClient; - PMIXER_EVENT Event; - KIRQL OldIrql; - ULONG Index; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* acquire client context lock */ - KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); - - /* point to first entry */ - Entry = DeviceExtension->WdmAudClientList.Flink; - - /* iterate through all clients */ - while(Entry != &DeviceExtension->WdmAudClientList) - { - /* get client context */ - CurClient = (PWDMAUD_CLIENT)CONTAINING_RECORD(Entry, WDMAUD_CLIENT, Entry); - - /* now iterate through all pins and try to find an matching handle */ - for(Index = 0; Index < CurClient->NumPins; Index++) - { - if (CurClient->hPins[Index].Handle == hMixer && CurClient->hPins[Index].Type == MIXER_DEVICE_TYPE && CurClient->hPins[Index].NotifyEvent) - { - /* allocate event entry */ - Event = (PMIXER_EVENT)ExAllocatePool(NonPagedPool, sizeof(MIXER_EVENT)); - if (!Event) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* initialize event entry */ - Event->hMixer = hMixer; - Event->NotificationType = NotificationType; - Event->Value = Value; - - /* insert event entry */ - InsertTailList(&CurClient->MixerEventList, &Event->Entry); - - DPRINT("Notifying %p hMixer %p Value %x NotificationType %u\n", CurClient->hPins[Index].NotifyEvent, hMixer, Value, NotificationType); - - /* now signal the event */ - KeSetEvent(CurClient->hPins[Index].NotifyEvent, 0, FALSE); - - - - /* search next client */ - break; - } - } - - /* move to next client */ - Entry = Entry->Flink; - } - - /* release client context lock */ - KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); - - /* done */ - return STATUS_SUCCESS; -} - -NTSTATUS -SetGetMuteControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceId, - IN ULONG NodeId, - IN ULONG dwLineID, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN ULONG bSet) -{ - LPMIXERCONTROLDETAILS_BOOLEAN Input; - LONG Value; - NTSTATUS Status; - - if (DeviceInfo->u.MixDetails.cbDetails != sizeof(MIXERCONTROLDETAILS_BOOLEAN)) - return STATUS_INVALID_PARAMETER; - - /* get input */ - Input = (LPMIXERCONTROLDETAILS_BOOLEAN)DeviceInfo->u.MixDetails.paDetails; - - /* FIXME SEH */ - if (bSet) - Value = Input->fValue; - - /* set control details */ - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_MUTE, 0, &Value); - - if (!NT_SUCCESS(Status)) - return Status; - - /* FIXME SEH */ - if (!bSet) - { - Input->fValue = Value; - return Status; - } - else - { - /* notify clients of a line change */ - NotifyWdmAudClients(DeviceObject, MM_MIXM_LINE_CHANGE, DeviceInfo->hDevice, dwLineID); - } - - - return Status; -} - -ULONG -GetVolumeControlIndex( - LPMIXERVOLUME_DATA VolumeData, - LONG Value) -{ - ULONG Index; - - for(Index = 0; Index < VolumeData->ValuesCount; Index++) - { - if (VolumeData->Values[Index] > Value) - { - return VolumeData->InputSteppingDelta * Index; - } - } - return VolumeData->InputSteppingDelta * (VolumeData->ValuesCount-1); -} - - -NTSTATUS -SetGetVolumeControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceId, - IN ULONG NodeId, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN ULONG bSet, - LPMIXERCONTROLW MixerControl, - LPMIXERLINE_EXT MixerLine) -{ - LPMIXERCONTROLDETAILS_UNSIGNED Input; - LONG Value, Index, Channel = 0; - ULONG dwValue; - NTSTATUS Status; - LPMIXERVOLUME_DATA VolumeData; - - if (DeviceInfo->u.MixDetails.cbDetails != sizeof(MIXERCONTROLDETAILS_SIGNED)) - return STATUS_INVALID_PARAMETER; - - VolumeData = (LPMIXERVOLUME_DATA)GetMixerControlDataById(&MixerLine->LineControlsExtraData, MixerControl->dwControlID); - if (!VolumeData) - return STATUS_INSUFFICIENT_RESOURCES; - - - /* get input */ - Input = (LPMIXERCONTROLDETAILS_UNSIGNED)DeviceInfo->u.MixDetails.paDetails; - - if (bSet) - { - /* FIXME SEH */ - Value = Input->dwValue; - Index = Value / VolumeData->InputSteppingDelta; - - if (Index >= VolumeData->ValuesCount) - { - DPRINT1("Index %u out of bounds %u \n", Index, VolumeData->ValuesCount); - DbgBreakPoint(); - return STATUS_INVALID_PARAMETER; - } - - Value = VolumeData->Values[Index]; - } - - /* set control details */ - if (bSet) - { - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 0, &Value); - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 1, &Value); - } - else - { - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, Channel, &Value); - } - - if (!bSet) - { - dwValue = GetVolumeControlIndex(VolumeData, (LONG)Value); - /* FIXME SEH */ - Input->dwValue = dwValue; - } - else - { - /* notify clients of a line change */ - NotifyWdmAudClients(DeviceObject, MM_MIXM_CONTROL_CHANGE, DeviceInfo->hDevice, MixerControl->dwControlID); - } - return Status; -} - -NTSTATUS -NTAPI -WdmAudGetMixerEvent( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - PMIXER_EVENT Event = NULL; - PLIST_ENTRY Entry; - KIRQL OldIrql; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* acquire client context lock */ - KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); - - /* point to first entry */ - Entry = ClientInfo->MixerEventList.Flink; - - while(Entry != &ClientInfo->MixerEventList) - { - /* get mixer event */ - Event = (PMIXER_EVENT)CONTAINING_RECORD(Entry, MIXER_EVENT, Entry); - - if (Event->hMixer == DeviceInfo->hDevice) - { - /* found an event for that particular device */ - RemoveEntryList(&Event->Entry); - break; - } - - /* no match found */ - Event = NULL; - - /* move to next entry */ - Entry = Entry->Flink; - } - - /* release client context lock */ - KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); - - if (!Event) - { - /* no events available */ - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* store event result */ - DeviceInfo->u.MixerEvent.hMixer = Event->hMixer; - DeviceInfo->u.MixerEvent.NotificationType = Event->NotificationType; - DeviceInfo->u.MixerEvent.Value = Event->Value; - - /* free event info */ - ExFreePool(Event); - - /* done */ - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); -} - -NTSTATUS -NTAPI -WdmAudSetControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - LPMIXERLINE_EXT MixerLine; - LPMIXERCONTROLW MixerControl; - ULONG NodeId; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - DPRINT("cbStruct %u Expected %u dwControlID %u cChannels %u cMultipleItems %u cbDetails %u paDetails %p Flags %x\n", - DeviceInfo->u.MixDetails.cbStruct, sizeof(MIXERCONTROLDETAILS), DeviceInfo->u.MixDetails.dwControlID, DeviceInfo->u.MixDetails.cChannels, DeviceInfo->u.MixDetails.cMultipleItems, DeviceInfo->u.MixDetails.cbDetails, DeviceInfo->u.MixDetails.paDetails, DeviceInfo->Flags); - - if (DeviceInfo->Flags & MIXER_GETCONTROLDETAILSF_LISTTEXT) - { - UNIMPLEMENTED; - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - } - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* get mixer control */ - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("MixerControl %x not found\n", DeviceInfo->u.MixDetails.dwControlID); - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - Status = STATUS_NOT_IMPLEMENTED; - DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType); - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) - { - /* send the request */ - Status = SetGetMuteControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, MixerLine->Line.dwLineID, DeviceInfo, TRUE); - } - else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - Status = SetGetVolumeControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, DeviceInfo, TRUE, MixerControl, MixerLine); - } - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - -} - -NTSTATUS -NTAPI -WdmAudGetControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - LPMIXERLINE_EXT MixerLine; - LPMIXERCONTROLW MixerControl; - ULONG NodeId; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - DPRINT("cbStruct %u Expected %u dwControlID %u cChannels %u cMultipleItems %u cbDetails %u paDetails %p Flags %x\n", - DeviceInfo->u.MixDetails.cbStruct, sizeof(MIXERCONTROLDETAILS), DeviceInfo->u.MixDetails.dwControlID, DeviceInfo->u.MixDetails.cChannels, DeviceInfo->u.MixDetails.cMultipleItems, DeviceInfo->u.MixDetails.cbDetails, DeviceInfo->u.MixDetails.paDetails, DeviceInfo->Flags); - - if (DeviceInfo->Flags & MIXER_GETCONTROLDETAILSF_LISTTEXT) - { - UNIMPLEMENTED; - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - } - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* get mixer control */ - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("MixerControl %x not found\n", DeviceInfo->u.MixDetails.dwControlID); - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - Status = STATUS_NOT_IMPLEMENTED; - DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType); - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) - { - /* send the request */ - Status = SetGetMuteControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, MixerLine->Line.dwLineID, DeviceInfo, FALSE); - } - else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - Status = SetGetVolumeControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, DeviceInfo, FALSE, MixerControl, MixerLine); - } - - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - -} - diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c new file mode 100644 index 00000000000..1d8a806d430 --- /dev/null +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -0,0 +1,663 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel Streaming + * FILE: drivers/wdm/audio/legacy/wdmaud/mmixer.c + * PURPOSE: WDM Legacy Mixer + * PROGRAMMER: Johannes Anderwald + */ + +#include "wdmaud.h" + + +PVOID Alloc(ULONG NumBytes); +MIXER_STATUS Close(HANDLE hDevice); +VOID Free(PVOID Block); +VOID Copy(PVOID Src, PVOID Dst, ULONG NumBytes); +MIXER_STATUS Open(IN LPWSTR DevicePath, OUT PHANDLE hDevice); +MIXER_STATUS Control(IN HANDLE hMixer, IN ULONG dwIoControlCode, IN PVOID lpInBuffer, IN ULONG nInBufferSize, OUT PVOID lpOutBuffer, ULONG nOutBufferSize, PULONG lpBytesReturned); +MIXER_STATUS Enum(IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR * DeviceName, OUT PHANDLE OutHandle, OUT PHANDLE OutKey); +MIXER_STATUS OpenKey(IN HANDLE hKey, IN LPWSTR SubKey, IN ULONG DesiredAccess, OUT PHANDLE OutKey); +MIXER_STATUS CloseKey(IN HANDLE hKey); +MIXER_STATUS QueryKeyValue(IN HANDLE hKey, IN LPWSTR KeyName, OUT PVOID * ResultBuffer, OUT PULONG ResultLength, OUT PULONG KeyType); +PVOID AllocEventData(IN ULONG ExtraSize); +VOID FreeEventData(IN PVOID EventData); + +MIXER_CONTEXT MixerContext = +{ + sizeof(MIXER_CONTEXT), + NULL, + Alloc, + Control, + Free, + Open, + Close, + Copy, + OpenKey, + QueryKeyValue, + CloseKey, + AllocEventData, + FreeEventData +}; + +GUID CategoryGuid = {STATIC_KSCATEGORY_AUDIO}; + +MIXER_STATUS +QueryKeyValue( + IN HANDLE hKey, + IN LPWSTR lpKeyName, + OUT PVOID * ResultBuffer, + OUT PULONG ResultLength, + OUT PULONG KeyType) +{ + NTSTATUS Status; + UNICODE_STRING KeyName; + ULONG Length; + PKEY_VALUE_PARTIAL_INFORMATION PartialInformation; + + /* initialize key name */ + RtlInitUnicodeString(&KeyName, lpKeyName); + + /* now query MatchingDeviceId key */ + Status = ZwQueryValueKey(hKey, &KeyName, KeyValuePartialInformation, NULL, 0, &Length); + + /* check for success */ + if (Status != STATUS_BUFFER_TOO_SMALL) + return MM_STATUS_UNSUCCESSFUL; + + /* allocate a buffer for key data */ + PartialInformation = ExAllocatePool(NonPagedPool, Length); + + if (!PartialInformation) + return MM_STATUS_NO_MEMORY; + + + /* now query MatchingDeviceId key */ + Status = ZwQueryValueKey(hKey, &KeyName, KeyValuePartialInformation, PartialInformation, Length, &Length); + + /* check for success */ + if (!NT_SUCCESS(Status)) + { + ExFreePool(PartialInformation); + return MM_STATUS_UNSUCCESSFUL; + } + + if (KeyType) + { + /* return key type */ + *KeyType = PartialInformation->Type; + } + + if (ResultLength) + { + /* return data length */ + *ResultLength = PartialInformation->DataLength; + } + + *ResultBuffer = ExAllocatePool(NonPagedPool, PartialInformation->DataLength); + if (!*ResultBuffer) + { + /* not enough memory */ + ExFreePool(PartialInformation); + return MM_STATUS_NO_MEMORY; + } + + /* copy key value */ + RtlMoveMemory(*ResultBuffer, PartialInformation->Data, PartialInformation->DataLength); + + /* free key info */ + ExFreePool(PartialInformation); + + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +OpenKey( + IN HANDLE hKey, + IN LPWSTR lpSubKeyName, + IN ULONG DesiredAccess, + OUT PHANDLE OutKey) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING SubKeyName; + NTSTATUS Status; + + /* initialize sub key name */ + RtlInitUnicodeString(&SubKeyName, lpSubKeyName); + + /* initialize key attributes */ + InitializeObjectAttributes(&ObjectAttributes, &SubKeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF, hKey, NULL); + + /* open the key */ + Status = ZwOpenKey(OutKey, DesiredAccess, &ObjectAttributes); + + if (NT_SUCCESS(Status)) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + +MIXER_STATUS +CloseKey( + IN HANDLE hKey) +{ + if (ZwClose(hKey) == STATUS_SUCCESS) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + + +PVOID Alloc(ULONG NumBytes) +{ + PVOID Mem = ExAllocatePool(NonPagedPool, NumBytes); + if (!Mem) + return Mem; + + RtlZeroMemory(Mem, NumBytes); + return Mem; +} + +MIXER_STATUS +Close(HANDLE hDevice) +{ + if (ZwClose(hDevice) == STATUS_SUCCESS) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + +VOID +Free(PVOID Block) +{ + ExFreePool(Block); +} + +VOID +Copy(PVOID Src, PVOID Dst, ULONG NumBytes) +{ + RtlMoveMemory(Src, Dst, NumBytes); +} + +MIXER_STATUS +Open( + IN LPWSTR DevicePath, + OUT PHANDLE hDevice) +{ + if (WdmAudOpenSysAudioDevice(DevicePath, hDevice) == STATUS_SUCCESS) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + +MIXER_STATUS +Control( + IN HANDLE hMixer, + IN ULONG dwIoControlCode, + IN PVOID lpInBuffer, + IN ULONG nInBufferSize, + OUT PVOID lpOutBuffer, + ULONG nOutBufferSize, + PULONG lpBytesReturned) +{ + NTSTATUS Status; + PFILE_OBJECT FileObject; + + /* get file object */ + Status = ObReferenceObjectByHandle(hMixer, GENERIC_READ | GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT("failed to reference %p with %lx\n", hMixer, Status); + return MM_STATUS_UNSUCCESSFUL; + } + + /* perform request */ + Status = KsSynchronousIoControlDevice(FileObject, KernelMode, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned); + + /* release object reference */ + ObDereferenceObject(FileObject); + + if (Status == STATUS_MORE_ENTRIES || Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) + { + /* more data is available */ + return MM_STATUS_MORE_ENTRIES; + } + else if (Status == STATUS_SUCCESS) + { + /* operation succeeded */ + return MM_STATUS_SUCCESS; + } + else + { + DPRINT("Failed with %lx\n", Status); + return MM_STATUS_UNSUCCESSFUL; + } +} + +MIXER_STATUS +Enum( + IN PVOID EnumContext, + IN ULONG DeviceIndex, + OUT LPWSTR * DeviceName, + OUT PHANDLE OutHandle, + OUT PHANDLE OutKey) +{ + PDEVICE_OBJECT DeviceObject; + ULONG DeviceCount; + NTSTATUS Status; + UNICODE_STRING KeyName; + + /* get enumeration context */ + DeviceObject = (PDEVICE_OBJECT)EnumContext; + + /* get device count */ + DeviceCount = GetSysAudioDeviceCount(DeviceObject); + + if (DeviceIndex >= DeviceCount) + { + /* no more devices */ + return MM_STATUS_NO_MORE_DEVICES; + } + + /* get device name */ + Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, DeviceName); + + if (!NT_SUCCESS(Status)) + { + /* failed to retrieve device name */ + return MM_STATUS_UNSUCCESSFUL; + } + + /* intialize key name */ + RtlInitUnicodeString(&KeyName, *DeviceName); + + /* open device interface key */ + Status = IoOpenDeviceInterfaceRegistryKey(&KeyName, GENERIC_READ | GENERIC_WRITE, OutKey); +#if 0 + if (!NT_SUCCESS(Status)) + { + /* failed to open key */ + DPRINT("IoOpenDeviceInterfaceRegistryKey failed with %lx\n", Status); + ExFreePool(*DeviceName); + return MM_STATUS_UNSUCCESSFUL; + } +#endif + + /* open device handle */ + Status = OpenDevice(*DeviceName, OutHandle, NULL); + if (!NT_SUCCESS(Status)) + { + /* failed to open device */ + return MM_STATUS_UNSUCCESSFUL; + } + + return MM_STATUS_SUCCESS; +} + +PVOID +AllocEventData( + IN ULONG ExtraSize) +{ + PKSEVENTDATA Data = (PKSEVENTDATA)ExAllocatePool(NonPagedPool, sizeof(KSEVENTDATA) + ExtraSize); + if (!Data) + return NULL; + + Data->EventObject.Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); + if (!Data->EventHandle.Event) + { + ExFreePool(Data); + return NULL; + } + + KeInitializeEvent(Data->EventObject.Event, NotificationEvent, FALSE); + + Data->NotificationType = KSEVENTF_EVENT_HANDLE; + return Data; +} + +VOID +FreeEventData(IN PVOID EventData) +{ + PKSEVENTDATA Data = (PKSEVENTDATA)EventData; + + ExFreePool(Data->EventHandle.Event); + ExFreePool(Data); +} + +NTSTATUS +WdmAudMixerInitialize( + IN PDEVICE_OBJECT DeviceObject) +{ + MIXER_STATUS Status; + + /* initialize the mixer library */ + Status = MMixerInitialize(&MixerContext, Enum, (PVOID)DeviceObject); + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to initialize mmixer library */ + DPRINT("MMixerInitialize failed with %lx\n", Status); + } + + return Status; +} + +NTSTATUS +WdmAudMixerCapabilities( + IN PDEVICE_OBJECT DeviceObject, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo, + IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) +{ + if (MMixerGetCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.MixCaps) == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + + return STATUS_INVALID_PARAMETER; +} + +NTSTATUS +WdmAudControlOpenMixer( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + HANDLE hMixer; + PWDMAUD_HANDLE Handles; + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + PKEVENT EventObject = NULL; + + DPRINT("WdmAudControlOpenMixer\n"); + + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (DeviceInfo->u.hNotifyEvent) + { + Status = ObReferenceObjectByHandle(DeviceInfo->u.hNotifyEvent, EVENT_MODIFY_STATE, ExEventObjectType, UserMode, (LPVOID*)&EventObject, NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Invalid notify event passed %p from client %p\n", DeviceInfo->u.hNotifyEvent, ClientInfo); + DbgBreakPoint(); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); + } + } + + if (MMixerOpen(&MixerContext, DeviceInfo->DeviceIndex, EventObject, NULL /* FIXME */, &hMixer) != MM_STATUS_SUCCESS) + { + ObDereferenceObject(EventObject); + DPRINT1("Failed to open mixer\n"); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); + } + + + Handles = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1)); + + if (Handles) + { + if (ClientInfo->NumPins) + { + RtlMoveMemory(Handles, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins); + ExFreePool(ClientInfo->hPins); + } + + ClientInfo->hPins = Handles; + ClientInfo->hPins[ClientInfo->NumPins].Handle = hMixer; + ClientInfo->hPins[ClientInfo->NumPins].Type = MIXER_DEVICE_TYPE; + ClientInfo->hPins[ClientInfo->NumPins].NotifyEvent = EventObject; + ClientInfo->NumPins++; + } + else + { + ObDereferenceObject(EventObject); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); + } + + DeviceInfo->hDevice = hMixer; + + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetControlDetails( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mmixer library */ + Status = MMixerGetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetLineInfo( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mixer library */ + Status = MMixerGetLineInfo(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixLine); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetLineControls( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mixer library */ + Status = MMixerGetLineControls(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixControls); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); + + +} + +NTSTATUS +NTAPI +WdmAudSetControlDetails( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mixer library */ + Status = MMixerSetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetMixerEvent( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + UNIMPLEMENTED + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +ULONG +WdmAudGetMixerDeviceCount() +{ + return MMixerGetCount(&MixerContext); +} + +ULONG +WdmAudGetWaveInDeviceCount() +{ + return MMixerGetWaveInCount(&MixerContext); +} + +ULONG +WdmAudGetWaveOutDeviceCount() +{ + return MMixerGetWaveOutCount(&MixerContext); +} + +NTSTATUS +WdmAudGetMixerPnpNameByIndex( + IN ULONG DeviceIndex, + OUT LPWSTR * Device) +{ + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +WdmAudGetPnpNameByIndexAndType( + IN ULONG DeviceIndex, + IN SOUND_DEVICE_TYPE DeviceType, + OUT LPWSTR *Device) +{ + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +WdmAudWaveCapabilities( + IN PDEVICE_OBJECT DeviceObject, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo, + IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) +{ + MIXER_STATUS Status; + + if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) + { + /* get capabilities */ + Status = MMixerWaveInCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.WaveInCaps); + } + else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) + { + /* get capabilities */ + Status = MMixerWaveOutCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.WaveOutCaps); + } + else + { + ASSERT(0); + return STATUS_UNSUCCESSFUL; + } + + if (Status == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + else + return STATUS_UNSUCCESSFUL; +} + + +MIXER_STATUS +CreatePinCallback( + IN PVOID Ctx, + IN ULONG VirtualDeviceId, + IN ULONG PinId, + IN HANDLE hFilter, + IN PKSPIN_CONNECT PinConnect, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE PinHandle) +{ + ULONG BytesReturned; + SYSAUDIO_INSTANCE_INFO InstanceInfo; + NTSTATUS Status; + ULONG FreeIndex; + PPIN_CREATE_CONTEXT Context = (PPIN_CREATE_CONTEXT)Ctx; + + /* setup property request */ + InstanceInfo.Property.Set = KSPROPSETID_Sysaudio; + InstanceInfo.Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO; + InstanceInfo.Property.Flags = KSPROPERTY_TYPE_SET; + InstanceInfo.Flags = 0; + InstanceInfo.DeviceNumber = VirtualDeviceId; + + /* attach to virtual device */ + Status = KsSynchronousIoControlDevice(Context->DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned); + + if (!NT_SUCCESS(Status)) + return MM_STATUS_UNSUCCESSFUL; + + /* close existing pin */ + FreeIndex = ClosePin(Context->ClientInfo, VirtualDeviceId, PinId, Context->DeviceType); + + /* now create the pin */ + Status = KsCreatePin(Context->DeviceExtension->hSysAudio, PinConnect, DesiredAccess, PinHandle); + + /* check for success */ + if (!NT_SUCCESS(Status)) + return MM_STATUS_UNSUCCESSFUL; + + /* store the handle */ + Status = InsertPinHandle(Context->ClientInfo, VirtualDeviceId, PinId, Context->DeviceType, *PinHandle, FreeIndex); + if (!NT_SUCCESS(Status)) + { + /* failed to insert handle */ + ZwClose(*PinHandle); + return MM_STATUS_UNSUCCESSFUL; + } + + return MM_STATUS_SUCCESS; +} + +NTSTATUS +WdmAudControlOpenWave( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + PIN_CREATE_CONTEXT Context; + + Context.ClientInfo = ClientInfo; + Context.DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + Context.DeviceType = DeviceInfo->DeviceType; + + Status = MMixerOpenWave(&MixerContext, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE, &DeviceInfo->u.WaveFormatEx, CreatePinCallback, &Context, &DeviceInfo->hDevice); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_NOT_SUPPORTED, sizeof(WDMAUD_DEVICE_INFO)); +} diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c b/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c index dd61c34f1f4..5820abc2500 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c @@ -2,12 +2,37 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Kernel Streaming * FILE: drivers/wdm/audio/legacy/wdmaud/sup.c - * PURPOSE: System Audio graph builder + * PURPOSE: Misc support routines * PROGRAMMER: Andrew Greenwood * Johannes Anderwald */ #include "wdmaud.h" +ULONG +GetSysAudioDeviceCount( + IN PDEVICE_OBJECT DeviceObject) +{ + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + KSPROPERTY Pin; + ULONG Count, BytesReturned; + NTSTATUS Status; + + /* setup the query request */ + Pin.Set = KSPROPSETID_Sysaudio; + Pin.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT; + Pin.Flags = KSPROPERTY_TYPE_GET; + + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + /* query sysaudio for the device count */ + Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned); + if (!NT_SUCCESS(Status)) + return 0; + + return Count; +} + + NTSTATUS SetIrpIoStatus( IN PIRP Irp, @@ -21,7 +46,7 @@ SetIrpIoStatus( } -NTSTATUS +ULONG ClosePin( IN PWDMAUD_CLIENT ClientInfo, IN ULONG FilterId, @@ -298,3 +323,83 @@ FindProductName( return Status; } +NTSTATUS +GetSysAudioDevicePnpName( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DeviceIndex, + OUT LPWSTR * Device) +{ + ULONG BytesReturned; + KSP_PIN Pin; + NTSTATUS Status; + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + + /* first check if the device index is within bounds */ + if (DeviceIndex >= GetSysAudioDeviceCount(DeviceObject)) + return STATUS_INVALID_PARAMETER; + + /* setup the query request */ + Pin.Property.Set = KSPROPSETID_Sysaudio; + Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME; + Pin.Property.Flags = KSPROPERTY_TYPE_GET; + Pin.PinId = DeviceIndex; + + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + /* query sysaudio for the device path */ + Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), NULL, 0, &BytesReturned); + + /* check if the request failed */ + if (Status != STATUS_BUFFER_TOO_SMALL || BytesReturned == 0) + return STATUS_UNSUCCESSFUL; + + /* allocate buffer for the device */ + *Device = ExAllocatePool(NonPagedPool, BytesReturned); + if (!Device) + return STATUS_INSUFFICIENT_RESOURCES; + + /* query sysaudio again for the device path */ + Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), (PVOID)*Device, BytesReturned, &BytesReturned); + + if (!NT_SUCCESS(Status)) + { + /* failed */ + ExFreePool(*Device); + return Status; + } + + return Status; +} + +NTSTATUS +OpenDevice( + IN LPWSTR Device, + OUT PHANDLE DeviceHandle, + OUT PFILE_OBJECT * FileObject) +{ + NTSTATUS Status; + HANDLE hDevice; + + /* now open the device */ + Status = WdmAudOpenSysAudioDevice(Device, &hDevice); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + *DeviceHandle = hDevice; + + if (FileObject) + { + Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL); + + if (!NT_SUCCESS(Status)) + { + ZwClose(hDevice); + } + } + + return Status; + +} diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c b/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c deleted file mode 100644 index be57468d2ad..00000000000 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c +++ /dev/null @@ -1,756 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel Streaming - * FILE: drivers/wdm/audio/legacy/wdmaud/wave.c - * PURPOSE: Wave Out enumeration - * PROGRAMMER: Andrew Greenwood - * Johannes Anderwald - */ -#include "wdmaud.h" - - -typedef struct -{ - ULONG SampleRate; - ULONG Bit8Mono; - ULONG Bit8Stereo; - ULONG Bit16Mono; - ULONG Bit16Stereo; -}AUDIO_RANGE; - -#define AUDIO_TEST_RANGE (5) - -static AUDIO_RANGE TestRange[AUDIO_TEST_RANGE] = -{ - { - 11025, - WAVE_FORMAT_1M08, - WAVE_FORMAT_1S08, - WAVE_FORMAT_1M16, - WAVE_FORMAT_1S16 - }, - { - 22050, - WAVE_FORMAT_2M08, - WAVE_FORMAT_2S08, - WAVE_FORMAT_2M16, - WAVE_FORMAT_2S16 - }, - { - 44100, - WAVE_FORMAT_4M08, - WAVE_FORMAT_4S08, - WAVE_FORMAT_4M16, - WAVE_FORMAT_4S16 - }, - { - 48000, - WAVE_FORMAT_48M08, - WAVE_FORMAT_48S08, - WAVE_FORMAT_48M16, - WAVE_FORMAT_48S16 - }, - { - 96000, - WAVE_FORMAT_96M08, - WAVE_FORMAT_96S08, - WAVE_FORMAT_96M16, - WAVE_FORMAT_96S16 - } -}; - -LPWAVE_INFO -AllocateWaveInfo() -{ - /* allocate wav info */ - LPWAVE_INFO WaveOutInfo = ExAllocatePool(NonPagedPool, sizeof(WAVE_INFO)); - if (!WaveOutInfo) - return NULL; - - /* zero wave info struct */ - RtlZeroMemory(WaveOutInfo, sizeof(WAVE_INFO)); - - return WaveOutInfo; -} - -PKSPIN_CONNECT -AllocatePinConnect( - ULONG DataFormatSize) -{ - PKSPIN_CONNECT Connect = ExAllocatePool(NonPagedPool, sizeof(KSPIN_CONNECT) + DataFormatSize); - if (!Connect) - return NULL; - - /* zero pin connect struct */ - RtlZeroMemory(Connect, sizeof(KSPIN_CONNECT) + DataFormatSize); - - return Connect; -} - -NTSTATUS -GetWaveInfoByIndexAndType( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN SOUND_DEVICE_TYPE DeviceType, - OUT LPWAVE_INFO *OutWaveInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - ULONG Index = 0; - PLIST_ENTRY Entry, ListHead; - LPWAVE_INFO WaveInfo; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceType == WAVE_IN_DEVICE_TYPE) - ListHead = &DeviceExtension->WaveInList; - else - ListHead = &DeviceExtension->WaveOutList; - - /* get first entry */ - Entry = ListHead->Flink; - - while(Entry != ListHead) - { - WaveInfo = (LPWAVE_INFO)CONTAINING_RECORD(Entry, WAVE_INFO, Entry); - - if (Index == DeviceIndex) - { - *OutWaveInfo = WaveInfo; - return STATUS_SUCCESS; - } - Index++; - Entry = Entry->Flink; - } - - return STATUS_NOT_FOUND; -} - - -VOID -InitializePinConnect( - IN OUT PKSPIN_CONNECT PinConnect, - IN ULONG PinId) -{ - PinConnect->Interface.Set = KSINTERFACESETID_Standard; - PinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING; - PinConnect->Interface.Flags = 0; - PinConnect->Medium.Set = KSMEDIUMSETID_Standard; - PinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE; - PinConnect->Medium.Flags = 0; - PinConnect->PinToHandle = NULL; - PinConnect->PinId = PinId; - PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL; - PinConnect->Priority.PrioritySubClass = 1; -} - -VOID -InitializeDataFormat( - IN PKSDATAFORMAT_WAVEFORMATEX DataFormat, - LPWAVEFORMATEX WaveFormatEx) -{ - - DataFormat->WaveFormatEx.wFormatTag = WaveFormatEx->wFormatTag; - DataFormat->WaveFormatEx.nChannels = WaveFormatEx->nChannels; - DataFormat->WaveFormatEx.nSamplesPerSec = WaveFormatEx->nSamplesPerSec; - DataFormat->WaveFormatEx.nBlockAlign = WaveFormatEx->nBlockAlign; - DataFormat->WaveFormatEx.nAvgBytesPerSec = WaveFormatEx->nAvgBytesPerSec; - DataFormat->WaveFormatEx.wBitsPerSample = WaveFormatEx->wBitsPerSample; - DataFormat->WaveFormatEx.cbSize = 0; - DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX); - DataFormat->DataFormat.Flags = 0; - DataFormat->DataFormat.Reserved = 0; - DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO; - - DataFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - DataFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX; - DataFormat->DataFormat.SampleSize = 4; -} - - -NTSTATUS -AttachToVirtualAudioDevice( - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension, - IN ULONG VirtualDeviceId) -{ - ULONG BytesReturned; - SYSAUDIO_INSTANCE_INFO InstanceInfo; - - /* setup property request */ - InstanceInfo.Property.Set = KSPROPSETID_Sysaudio; - InstanceInfo.Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO; - InstanceInfo.Property.Flags = KSPROPERTY_TYPE_SET; - InstanceInfo.Flags = 0; - InstanceInfo.DeviceNumber = VirtualDeviceId; - - /* attach to virtual device */ - return KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned); - -} - -NTSTATUS -GetAudioPinDataRanges( - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension, - IN ULONG FilterId, - IN ULONG PinId, - IN OUT PKSMULTIPLE_ITEM * OutMultipleItem) -{ - KSP_PIN PinProperty; - ULONG BytesReturned = 0; - NTSTATUS Status; - PKSMULTIPLE_ITEM MultipleItem; - - /* retrieve size of data ranges buffer */ - PinProperty.Reserved = FilterId; - PinProperty.PinId = PinId; - PinProperty.Property.Set = KSPROPSETID_Pin; - PinProperty.Property.Id = KSPROPERTY_PIN_DATARANGES; - PinProperty.Property.Flags = KSPROPERTY_TYPE_GET; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)NULL, 0, &BytesReturned); - if (Status != STATUS_MORE_ENTRIES) - { - return Status; - } - - MultipleItem = ExAllocatePool(NonPagedPool, BytesReturned); - if (!MultipleItem) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)MultipleItem, BytesReturned, &BytesReturned); - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(MultipleItem); - return Status; - } - - /* save result */ - *OutMultipleItem = MultipleItem; - return Status; -} - -NTSTATUS -FindAudioDataRange( - PKSMULTIPLE_ITEM MultipleItem, - PKSDATARANGE_AUDIO * OutDataRangeAudio) -{ - ULONG Index; - PKSDATARANGE_AUDIO DataRangeAudio; - PKSDATARANGE DataRange; - - DataRange = (PKSDATARANGE) (MultipleItem + 1); - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (DataRange->FormatSize == sizeof(KSDATARANGE_AUDIO)) - { - DataRangeAudio = (PKSDATARANGE_AUDIO)DataRange; - if (IsEqualGUIDAligned(&DataRangeAudio->DataRange.MajorFormat, &KSDATAFORMAT_TYPE_AUDIO) && - IsEqualGUIDAligned(&DataRangeAudio->DataRange.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM) && - IsEqualGUIDAligned(&DataRangeAudio->DataRange.Specifier, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)) - { - DPRINT("Min Sample %u Max Sample %u Min Bits %u Max Bits %u Max Channel %u\n", DataRangeAudio->MinimumSampleFrequency, DataRangeAudio->MaximumSampleFrequency, - DataRangeAudio->MinimumBitsPerSample, DataRangeAudio->MaximumBitsPerSample, DataRangeAudio->MaximumChannels); - *OutDataRangeAudio = DataRangeAudio; - return STATUS_SUCCESS; - } - } - } - return STATUS_UNSUCCESSFUL; -} - -NTSTATUS -NTAPI -OpenWavePin( - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension, - IN ULONG FilterId, - IN ULONG PinId, - IN LPWAVEFORMATEX WaveFormatEx, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE PinHandle) -{ - PKSPIN_CONNECT PinConnect; - PKSDATAFORMAT_WAVEFORMATEX DataFormat; - NTSTATUS Status; - - /* allocate pin connect */ - PinConnect = AllocatePinConnect(sizeof(KSDATAFORMAT_WAVEFORMATEX)); - if (!PinConnect) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* initialize pin connect struct */ - InitializePinConnect(PinConnect, PinId); - - /* get offset to dataformat */ - DataFormat = (PKSDATAFORMAT_WAVEFORMATEX) (PinConnect + 1); - /* initialize with requested wave format */ - InitializeDataFormat(DataFormat, WaveFormatEx); - - /* first attach to the virtual device */ - Status = AttachToVirtualAudioDevice(DeviceExtension, FilterId); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(PinConnect); - return Status; - } - - /* now create the pin */ - Status = KsCreatePin(DeviceExtension->hSysAudio, PinConnect, DesiredAccess, PinHandle); - - /* free create info */ - ExFreePool(PinConnect); - - return Status; -} - -ULONG -GetPinInstanceCount( - PWDMAUD_DEVICE_EXTENSION DeviceExtension, - ULONG FilterId, - ULONG PinId) -{ - KSP_PIN PinRequest; - KSPIN_CINSTANCES PinInstances; - ULONG BytesReturned; - NTSTATUS Status; - - /* query the instance count */ - PinRequest.Reserved = FilterId; - PinRequest.PinId = PinId; - PinRequest.Property.Set = KSPROPSETID_Pin; - PinRequest.Property.Flags = KSPROPERTY_TYPE_GET; - PinRequest.Property.Id = KSPROPERTY_PIN_CINSTANCES; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinRequest, sizeof(KSP_PIN), (PVOID)&PinInstances, sizeof(KSPIN_CINSTANCES), &BytesReturned); - ASSERT(Status == STATUS_SUCCESS); - return PinInstances.CurrentCount; -} - - -NTSTATUS -CheckSampleFormat( - PWDMAUD_DEVICE_EXTENSION DeviceExtension, - LPWAVE_INFO WaveInfo, - ULONG SampleRate, - ULONG NumChannels, - ULONG BitsPerSample) -{ - NTSTATUS Status = STATUS_SUCCESS; -#if 0 - - WAVEFORMATEX WaveFormat; - HANDLE PinHandle; - - /* clear wave format */ - RtlZeroMemory(&WaveFormat, sizeof(WAVEFORMATEX)); - - WaveFormat.wFormatTag = WAVE_FORMAT_PCM; - WaveFormat.nChannels = NumChannels; - WaveFormat.nSamplesPerSec = SampleRate; - WaveFormat.nAvgBytesPerSec = SampleRate * NumChannels * (BitsPerSample/8); - WaveFormat.nBlockAlign = (NumChannels * BitsPerSample) / 8; - WaveFormat.wBitsPerSample = BitsPerSample; - WaveFormat.cbSize = sizeof(WAVEFORMATEX); - - Status = OpenWavePin(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId, &WaveFormat, GENERIC_READ | GENERIC_WRITE, &PinHandle); - - if (NT_SUCCESS(Status)) - { - /* success */ - ZwClose(PinHandle); - - while(GetPinInstanceCount(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId)) - KeStallExecutionProcessor(5); - } - - DPRINT("SampleRate %u BitsPerSample %u NumChannels %u Status %x bInput %u\n", SampleRate, BitsPerSample, NumChannels, Status, WaveInfo->bInput); -#endif - - - return Status; -} - - -NTSTATUS -CheckFormat( - PWDMAUD_DEVICE_EXTENSION DeviceExtension, - PKSDATARANGE_AUDIO DataRangeAudio, - LPWAVE_INFO WaveInfo) -{ - ULONG Index, SampleFrequency; - ULONG Result = 0; - NTSTATUS Status; - - for(Index = 0; Index < AUDIO_TEST_RANGE; Index++) - { - SampleFrequency = TestRange[Index].SampleRate; - - if (DataRangeAudio->MinimumSampleFrequency <= SampleFrequency && DataRangeAudio->MaximumSampleFrequency >= SampleFrequency) - { - /* the audio adapter supports the sample frequency */ - if (DataRangeAudio->MinimumBitsPerSample <= 8 && DataRangeAudio->MaximumBitsPerSample >= 8) - { - /* check if pin supports the sample rate in 8-Bit Mono */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 1, 8); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit8Mono; - } - - if (DataRangeAudio->MaximumChannels > 1) - { - /* check if pin supports the sample rate in 8-Bit Stereo */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 2, 8); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit8Stereo; - } - } - } - - if (DataRangeAudio->MinimumBitsPerSample <= 16 && DataRangeAudio->MaximumBitsPerSample >= 16) - { - /* check if pin supports the sample rate in 16-Bit Mono */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 1, 16); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit16Mono; - } - - if (DataRangeAudio->MaximumChannels > 1) - { - /* check if pin supports the sample rate in 16-Bit Stereo */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 2, 16); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit16Stereo; - } - } - } - } - } - - - if (WaveInfo->bInput) - WaveInfo->u.InCaps.dwFormats = Result; - else - WaveInfo->u.OutCaps.dwFormats = Result; - - DPRINT("Format %x bInput %u\n", Result, WaveInfo->bInput); - - - return STATUS_SUCCESS; -} - -NTSTATUS -InitializeWaveInfo( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG FilterId, - IN ULONG PinId, - IN ULONG bInput) -{ - KSP_PIN PinProperty; - KSCOMPONENTID ComponentId; - NTSTATUS Status; - ULONG BytesReturned; - WCHAR DeviceName[MAX_PATH]; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - PKSMULTIPLE_ITEM MultipleItem; - PKSDATARANGE_AUDIO DataRangeAudio; - LPWAVE_INFO WaveInfo = AllocateWaveInfo(); - - - if (!WaveInfo) - return STATUS_INSUFFICIENT_RESOURCES; - - /* initialize wave info */ - WaveInfo->bInput = bInput; - WaveInfo->FilterId = FilterId; - WaveInfo->PinId = PinId; - - /* setup request to return component id */ - PinProperty.PinId = FilterId; - PinProperty.Property.Set = KSPROPSETID_Sysaudio; - PinProperty.Property.Id = KSPROPERTY_SYSAUDIO_COMPONENT_ID; - PinProperty.Property.Flags = KSPROPERTY_TYPE_GET; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* query sysaudio for component id */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)&ComponentId, sizeof(KSCOMPONENTID), &BytesReturned); - if (NT_SUCCESS(Status)) - { - if (bInput) - { - WaveInfo->u.InCaps.wMid = ComponentId.Manufacturer.Data1 - 0xd5a47fa7; - WaveInfo->u.InCaps.vDriverVersion = MAKELONG(ComponentId.Version, ComponentId.Revision); - } - else - { - WaveInfo->u.OutCaps.wMid = ComponentId.Manufacturer.Data1 - 0xd5a47fa7; - WaveInfo->u.OutCaps.vDriverVersion = MAKELONG(ComponentId.Version, ComponentId.Revision); - } - } - else - { - /* set up something useful */ - if (bInput) - { - WaveInfo->u.InCaps.wMid = MM_MICROSOFT; - WaveInfo->u.InCaps.wPid = MM_PID_UNMAPPED; - WaveInfo->u.InCaps.vDriverVersion = 1; - } - else - { - WaveInfo->u.OutCaps.wMid = MM_MICROSOFT; - WaveInfo->u.OutCaps.wPid = MM_PID_UNMAPPED; - WaveInfo->u.OutCaps.vDriverVersion = 1; - } - } - - /* retrieve pnp base name */ - PinProperty.PinId = FilterId; - PinProperty.Property.Set = KSPROPSETID_Sysaudio; - PinProperty.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME; - PinProperty.Property.Flags = KSPROPERTY_TYPE_GET; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)DeviceName, sizeof(DeviceName), &BytesReturned); - if (NT_SUCCESS(Status)) - { - /* find product name */ - if (bInput) - Status = FindProductName(DeviceName, MAXPNAMELEN, WaveInfo->u.OutCaps.szPname); - else - Status = FindProductName(DeviceName, MAXPNAMELEN, WaveInfo->u.InCaps.szPname); - - /* check for success */ - if (!NT_SUCCESS(Status)) - { - if (bInput) - WaveInfo->u.OutCaps.szPname[0] = L'\0'; - else - WaveInfo->u.InCaps.szPname[0] = L'\0'; - } - } - - Status = GetAudioPinDataRanges(DeviceExtension, FilterId, PinId, &MultipleItem); - if (NT_SUCCESS(Status)) - { - /* find a audio data range */ - Status = FindAudioDataRange(MultipleItem, &DataRangeAudio); - - if (NT_SUCCESS(Status)) - { - if (bInput) - { - WaveInfo->u.InCaps.wChannels = DataRangeAudio->MaximumChannels; - } - else - { - WaveInfo->u.OutCaps.wChannels = DataRangeAudio->MaximumChannels; - } - CheckFormat(DeviceExtension, DataRangeAudio, WaveInfo); - } - ExFreePool(MultipleItem); - } - - if (bInput) - { - InsertTailList(&DeviceExtension->WaveInList, &WaveInfo->Entry); - DeviceExtension->WaveInDeviceCount++; - } - else - { - InsertTailList(&DeviceExtension->WaveOutList, &WaveInfo->Entry); - DeviceExtension->WaveOutDeviceCount++; - } - - - return STATUS_SUCCESS; -} - - -NTSTATUS -NTAPI -WdmAudWaveInitialize( - IN PDEVICE_OBJECT DeviceObject) -{ - KSP_PIN Pin; - ULONG Count, BytesReturned, Index, SubIndex, Result, NumPins; - NTSTATUS Status; - KSPIN_COMMUNICATION Communication; - KSPIN_DATAFLOW DataFlow; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - - Pin.Property.Set = KSPROPSETID_Sysaudio; - Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* set wave count to zero */ - DeviceExtension->WaveInDeviceCount = 0; - DeviceExtension->WaveOutDeviceCount = 0; - - /* intialize list head */ - InitializeListHead(&DeviceExtension->WaveInList); - InitializeListHead(&DeviceExtension->WaveOutList); - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned); - if (!NT_SUCCESS(Status)) - return STATUS_UNSUCCESSFUL; - - Result = 0; - for(Index = 0; Index < Count; Index++) - { - /* query number of pins */ - Pin.Reserved = Index; // see sysaudio - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_CTYPES; - Pin.PinId = 0; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&NumPins, sizeof(ULONG), &BytesReturned); - if (NT_SUCCESS(Status)) - { - /* enumerate now all pins */ - for(SubIndex = 0; SubIndex < NumPins; SubIndex++) - { - Pin.PinId = SubIndex; - Pin.Property.Id = KSPROPERTY_PIN_COMMUNICATION; - Communication = KSPIN_COMMUNICATION_NONE; - - /* get pin communication type */ - KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned); - - Pin.Property.Id = KSPROPERTY_PIN_DATAFLOW; - DataFlow = 0; - - /* get pin dataflow type */ - KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned); - - if (Communication == KSPIN_COMMUNICATION_SINK && DataFlow == KSPIN_DATAFLOW_IN) - { - /* found a wave out device */ - InitializeWaveInfo(DeviceObject, Index, SubIndex, FALSE); - } - else if (Communication == KSPIN_COMMUNICATION_SINK && DataFlow == KSPIN_DATAFLOW_OUT) - { - /* found a wave in device */ - InitializeWaveInfo(DeviceObject, Index, SubIndex, TRUE); - } - } - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS -WdmAudControlOpenWave( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - LPWAVE_INFO WaveInfo; - NTSTATUS Status; - ACCESS_MASK DesiredAccess = 0; - HANDLE PinHandle; - ULONG FreeIndex; - - if (DeviceInfo->u.WaveFormatEx.wFormatTag != WAVE_FORMAT_PCM) - { - DPRINT("FIXME: Only WAVE_FORMAT_PCM is supported RequestFormat %x\n", DeviceInfo->u.WaveFormatEx.wFormatTag); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* find destination wave */ - Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo); - if (!NT_SUCCESS(Status)) - { - /* failed to find wave info */ - DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* close pin handle which uses same virtual audio device id and pin id */ - FreeIndex = ClosePin(ClientInfo, WaveInfo->FilterId, WaveInfo->PinId, DeviceInfo->DeviceType); - - /* get desired access */ - if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) - { - DesiredAccess |= GENERIC_READ; - } - else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) - { - DesiredAccess |= GENERIC_WRITE; - } - - /* now try open the pin */ - Status = OpenWavePin(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId, &DeviceInfo->u.WaveFormatEx, DesiredAccess, &PinHandle); - - if (!NT_SUCCESS(Status)) - { - /* failed to open the pin */ - return SetIrpIoStatus(Irp, STATUS_NOT_SUPPORTED, 0); - } - - /* store the handle */ - Status = InsertPinHandle(ClientInfo, WaveInfo->FilterId, WaveInfo->PinId, DeviceInfo->DeviceType, PinHandle, FreeIndex); - if (!NT_SUCCESS(Status)) - { - /* failed to insert handle */ - ZwClose(PinHandle); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* store pin handle */ - DeviceInfo->hDevice = PinHandle; - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); -} - -NTSTATUS -WdmAudWaveCapabilities( - IN PDEVICE_OBJECT DeviceObject, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo, - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) -{ - LPWAVE_INFO WaveInfo; - NTSTATUS Status; - - /* find destination wave */ - Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo); - if (!NT_SUCCESS(Status)) - { - /* failed to find wave info */ - DbgBreakPoint(); - return STATUS_UNSUCCESSFUL; - } - - if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) - { - RtlMoveMemory(&DeviceInfo->u.WaveInCaps, &WaveInfo->u.InCaps, sizeof(WAVEINCAPSW)); - } - else - { - RtlMoveMemory(&DeviceInfo->u.WaveOutCaps, &WaveInfo->u.OutCaps, sizeof(WAVEOUTCAPSW)); - } - - return STATUS_SUCCESS; -} - diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h index c8e53320e1e..c0dcfcca848 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h @@ -13,18 +13,10 @@ #include #include #include +#include "mmixer.h" #include "interface.h" -typedef struct -{ - LIST_ENTRY Entry; - HANDLE hMixer; - ULONG NotificationType; - ULONG Value; -}MIXER_EVENT, *PMIXER_EVENT; - - typedef struct { HANDLE Handle; @@ -44,60 +36,6 @@ typedef struct LIST_ENTRY MixerEventList; }WDMAUD_CLIENT, *PWDMAUD_CLIENT; -typedef struct -{ - LIST_ENTRY Entry; - ULONG dwControlID; -}MIXERCONTROL_DATA, *LPMIXERCONTROL_DATA; - -typedef struct -{ - MIXERCONTROL_DATA Header; - LONG SignedMinimum; - LONG SignedMaximum; - LONG SteppingDelta; - ULONG InputSteppingDelta; - ULONG ValuesCount; - PLONG Values; -}MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA; - - - -typedef struct -{ - LIST_ENTRY Entry; - ULONG PinId; - ULONG DeviceIndex; - MIXERLINEW Line; - LPMIXERCONTROLW LineControls; - PULONG NodeIds; - LIST_ENTRY LineControlsExtraData; -}MIXERLINE_EXT, *LPMIXERLINE_EXT; - - -typedef struct -{ - MIXERCAPSW MixCaps; - ULONG DeviceIndex; - LIST_ENTRY LineList; - ULONG ControlId; -}MIXER_INFO, *LPMIXER_INFO; - - -typedef struct -{ - LIST_ENTRY Entry; - ULONG FilterId; - ULONG PinId; - ULONG bInput; - union - { - WAVEOUTCAPSW OutCaps; - WAVEINCAPSW InCaps; - }u; -}WAVE_INFO, *LPWAVE_INFO; - - typedef struct { LIST_ENTRY Entry; @@ -117,18 +55,17 @@ typedef struct HANDLE hSysAudio; PFILE_OBJECT FileObject; - ULONG MixerInfoCount; - LPMIXER_INFO MixerInfo; - - ULONG WaveInDeviceCount; - LIST_ENTRY WaveInList; - - ULONG WaveOutDeviceCount; - LIST_ENTRY WaveOutList; - LIST_ENTRY WdmAudClientList; }WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION; +typedef struct +{ + PWDMAUD_CLIENT ClientInfo; + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + SOUND_DEVICE_TYPE DeviceType; +}PIN_CREATE_CONTEXT, *PPIN_CREATE_CONTEXT; + + NTSTATUS NTAPI OpenWavePin( @@ -279,7 +216,7 @@ NTAPI WdmAudWaveInitialize( IN PDEVICE_OBJECT DeviceObject); -NTSTATUS +ULONG ClosePin( IN PWDMAUD_CLIENT ClientInfo, IN ULONG FilterId, @@ -295,18 +232,51 @@ InsertPinHandle( IN HANDLE PinHandle, IN ULONG FreeIndex); - -NTSTATUS -GetWaveInfoByIndexAndType( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN SOUND_DEVICE_TYPE DeviceType, - OUT LPWAVE_INFO *OutWaveInfo); - NTSTATUS GetSysAudioDevicePnpName( IN PDEVICE_OBJECT DeviceObject, IN ULONG DeviceIndex, OUT LPWSTR * Device); +NTSTATUS +OpenSysAudioDeviceByIndex( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DeviceIndex, + IN PHANDLE DeviceHandle, + IN PFILE_OBJECT * FileObject); + +NTSTATUS +OpenDevice( + IN LPWSTR Device, + OUT PHANDLE DeviceHandle, + OUT PFILE_OBJECT * FileObject); + +ULONG +WdmAudGetMixerDeviceCount(); + +ULONG +WdmAudGetWaveInDeviceCount(); + +ULONG +WdmAudGetWaveOutDeviceCount(); + +NTSTATUS +WdmAudGetMixerPnpNameByIndex( + IN ULONG DeviceIndex, + OUT LPWSTR * Device); + +NTSTATUS +WdmAudGetPnpNameByIndexAndType( + IN ULONG DeviceIndex, + IN SOUND_DEVICE_TYPE DeviceType, + OUT LPWSTR *Device); + + +/* sup.c */ + +ULONG +GetSysAudioDeviceCount( + IN PDEVICE_OBJECT DeviceObject); + + #endif diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild index 1b3acd12e84..6c6595ca37b 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild @@ -2,17 +2,20 @@ . - + . include/reactos/libs/sound + + mmixer ntoskrnl + rtl + libcntpr ks pseh hal control.c deviface.c entry.c - mixer.c - wave.c + mmixer.c sup.c wdmaud.rc diff --git a/reactos/lib/drivers/sound/mmixer/mmixer.h b/reactos/lib/drivers/sound/mmixer/mmixer.h index fa7183da71d..7f117e36223 100644 --- a/reactos/lib/drivers/sound/mmixer/mmixer.h +++ b/reactos/lib/drivers/sound/mmixer/mmixer.h @@ -75,6 +75,15 @@ typedef PVOID (*PMIXER_ALLOC_EVENT_DATA)( typedef VOID (*PMIXER_FREE_EVENT_DATA)( IN PVOID EventData); +typedef MIXER_STATUS (*PIN_CREATE_CALLBACK)( + IN PVOID Context, + IN ULONG DeviceId, + IN ULONG PinId, + IN HANDLE hFilter, + IN PKSPIN_CONNECT PinConnect, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE PinHandle); + typedef struct { ULONG SizeOfStruct; @@ -172,6 +181,8 @@ MMixerOpenWave( IN ULONG DeviceIndex, IN ULONG bWaveIn, IN LPWAVEFORMATEX WaveFormat, + IN PIN_CREATE_CALLBACK CreateCallback, + IN PVOID Context, OUT PHANDLE PinHandle); MIXER_STATUS diff --git a/reactos/lib/drivers/sound/mmixer/sup.c b/reactos/lib/drivers/sound/mmixer/sup.c index f35d16744e5..0149df28d43 100644 --- a/reactos/lib/drivers/sound/mmixer/sup.c +++ b/reactos/lib/drivers/sound/mmixer/sup.c @@ -588,7 +588,7 @@ MMixerGetDataByDeviceName( while(Entry != &MixerList->MixerData) { MixerData = (LPMIXER_DATA)CONTAINING_RECORD(Entry, MIXER_DATA, Entry); - if (wcsicmp(DeviceName, MixerData->DeviceName) == 0) + if (wcsicmp(&DeviceName[2], &MixerData->DeviceName[2]) == 0) { // found entry return MixerData; diff --git a/reactos/lib/drivers/sound/mmixer/wave.c b/reactos/lib/drivers/sound/mmixer/wave.c index 498c61bee22..c156378f289 100644 --- a/reactos/lib/drivers/sound/mmixer/wave.c +++ b/reactos/lib/drivers/sound/mmixer/wave.c @@ -233,12 +233,15 @@ MMixerOpenWavePin( IN ULONG PinId, IN LPWAVEFORMATEX WaveFormatEx, IN ACCESS_MASK DesiredAccess, + IN PIN_CREATE_CALLBACK CreateCallback, + IN PVOID Context, OUT PHANDLE PinHandle) { PKSPIN_CONNECT PinConnect; PKSDATAFORMAT_WAVEFORMATEX DataFormat; LPMIXER_DATA MixerData; NTSTATUS Status; + MIXER_STATUS MixerStatus; MixerData = MMixerGetDataByDeviceId(MixerList, DeviceId); if (!MixerData) @@ -260,16 +263,28 @@ MMixerOpenWavePin( /* initialize with requested wave format */ MMixerInitializeDataFormat(DataFormat, WaveFormatEx); - /* now create the pin */ - Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle); + if (CreateCallback) + { + /* let the callback handle the creation */ + MixerStatus = CreateCallback(Context, DeviceId, PinId, MixerData->hDevice, PinConnect, DesiredAccess, PinHandle); + } + else + { + /* now create the pin */ + Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle); + + /* normalize status */ + if (Status == STATUS_SUCCESS) + MixerStatus = MM_STATUS_SUCCESS; + else + MixerStatus = MM_STATUS_UNSUCCESSFUL; + } /* free create info */ MixerContext->Free(PinConnect); - if (Status == STATUS_SUCCESS) - return MM_STATUS_SUCCESS; - else - return MM_STATUS_UNSUCCESSFUL; + /* done */ + return MixerStatus; } VOID @@ -415,6 +430,8 @@ MMixerOpenWave( IN ULONG DeviceIndex, IN ULONG bWaveIn, IN LPWAVEFORMATEX WaveFormat, + IN PIN_CREATE_CALLBACK CreateCallback, + IN PVOID Context, OUT PHANDLE PinHandle) { PMIXER_LIST MixerList; @@ -459,7 +476,7 @@ MMixerOpenWave( } /* now try open the pin */ - return MMixerOpenWavePin(MixerContext, MixerList, WaveInfo->DeviceId, WaveInfo->PinId, WaveFormat, DesiredAccess, PinHandle); + return MMixerOpenWavePin(MixerContext, MixerList, WaveInfo->DeviceId, WaveInfo->PinId, WaveFormat, DesiredAccess, CreateCallback, Context, PinHandle); } MIXER_STATUS From 97db4c1d1644e054eedd79a0c75a955b3457ca2d Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 11 Feb 2010 21:19:35 +0000 Subject: [PATCH 91/97] - Revert 44564 svn path=/trunk/; revision=45580 --- reactos/boot/bootdata/packages/reactos.dff | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 733aba39959..248f5f7c347 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -156,7 +156,7 @@ dll\directx\dinput8\dinput8.dll 1 dll\directx\dmusic\dmusic.dll 1 dll\directx\dplay\dplay.dll 1 dll\directx\dplayx\dplayx.dll 1 -dll\directx\dsound_new\dsound.dll 1 +dll\directx\dsound\dsound.dll 1 dll\directx\dxdiagn\dxdiagn.dll 1 dll\directx\wine\ddraw\ddraw.dll 1 dll\directx\d3d8thk\d3d8thk.dll 1 @@ -515,7 +515,7 @@ drivers\storage\ide\pciidex\pciidex.sys 2 ;drivers\usb\miniport\usbuhci\usbuhci.sys 2 ;drivers\usb\usbhub\usbhub.sys 2 ;drivers\usb\usbport\usbport.sys 2 -;drivers\usb\nt4compat\usbdriver\usbdriver.sys 2 +drivers\usb\nt4compat\usbdriver\usbdriver.sys 2 drivers\video\displays\vga\vgaddi.dll 1 drivers\video\displays\framebuf\framebuf.dll 1 @@ -528,7 +528,6 @@ drivers\wdm\audio\filters\kmixer\kmixer.sys 2 drivers\wdm\audio\sysaudio\sysaudio.sys 2 drivers\wdm\audio\legacy\wdmaud\wdmaud.sys 2 drivers\wdm\audio\backpln\portcls\portcls.sys 2 -drivers\wdm\audio\backpln\audio_test\audio_test.exe 1 drivers\wdm\audio\drm\drmk\drmk.sys 2 drivers\wmi\wmilib.sys 2 @@ -801,19 +800,3 @@ modules\rostests\winetests\ws2_32\ws2_32_winetest.exe 7 o modules\wallpaper\Angelus_02_ROSWP.bmp 4 optional -modules\windows\alcxwdm.sys 2 optional -modules\windows\dlkfet5b.sys 2 optional -modules\windows\cmaudio.sys 2 optional -modules\windows\cmaudio.inf 6 optional -;modules\windows\es1370mp.sys 2 optional -;modules\windows\es1371mp.sys 2 optional -modules\windows\alcxwdm.inf 6 optional -modules\windows\netdlfet.inf 6 optional -modules\windows\ks.inf 6 optional -;modules\windows\wdma_ens.inf 6 optional -modules\windows\b.mp3 7 optional -modules\windows\winamp.exe 7 optional -modules\windows\windows.wav 7 optional -modules\windows\D530.exe 7 optional -modules\windows\vmaudio.sys 2 optional -modules\windows\vmaudio.inf 6 optional From dd155531245f58a7cf04665511fc663265ba7aa2 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 12 Feb 2010 06:18:31 +0000 Subject: [PATCH 92/97] [MMIXER, WDMAUD_KERNEL] - Implement retrieving device path svn path=/trunk/; revision=45582 --- .../drivers/wdm/audio/legacy/wdmaud/mmixer.c | 8 ++- reactos/lib/drivers/sound/mmixer/mmixer.h | 7 +++ reactos/lib/drivers/sound/mmixer/wave.c | 58 +++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c index 1d8a806d430..cf58846decb 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -551,10 +551,12 @@ NTSTATUS WdmAudGetPnpNameByIndexAndType( IN ULONG DeviceIndex, IN SOUND_DEVICE_TYPE DeviceType, - OUT LPWSTR *Device) + OUT LPWSTR *DevicePath) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + if (MMixerGetWaveDevicePath(&MixerContext, DeviceType == WAVE_IN_DEVICE_TYPE, DeviceIndex, DevicePath) == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + else + return STATUS_UNSUCCESSFUL; } NTSTATUS diff --git a/reactos/lib/drivers/sound/mmixer/mmixer.h b/reactos/lib/drivers/sound/mmixer/mmixer.h index 7f117e36223..e14d663cd49 100644 --- a/reactos/lib/drivers/sound/mmixer/mmixer.h +++ b/reactos/lib/drivers/sound/mmixer/mmixer.h @@ -191,4 +191,11 @@ MMixerSetWaveStatus( IN HANDLE PinHandle, IN KSSTATE State); +MIXER_STATUS +MMixerGetWaveDevicePath( + IN PMIXER_CONTEXT MixerContext, + IN ULONG bWaveIn, + IN ULONG DeviceId, + OUT LPWSTR * DevicePath); + #endif diff --git a/reactos/lib/drivers/sound/mmixer/wave.c b/reactos/lib/drivers/sound/mmixer/wave.c index c156378f289..a8b2675cac9 100644 --- a/reactos/lib/drivers/sound/mmixer/wave.c +++ b/reactos/lib/drivers/sound/mmixer/wave.c @@ -611,3 +611,61 @@ MMixerSetWaveStatus( return MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &Length); } + +MIXER_STATUS +MMixerGetWaveDevicePath( + IN PMIXER_CONTEXT MixerContext, + IN ULONG bWaveIn, + IN ULONG DeviceId, + OUT LPWSTR * DevicePath) +{ + PMIXER_LIST MixerList; + LPMIXER_DATA MixerData; + LPWAVE_INFO WaveInfo; + ULONG Length; + MIXER_STATUS Status; + + // verify mixer context + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + { + // invalid context passed + return Status; + } + + // grab mixer list + MixerList = (PMIXER_LIST)MixerContext->MixerContext; + + /* find destination wave */ + Status = MMixerGetWaveInfoByIndexAndType(MixerList, DeviceId, bWaveIn, &WaveInfo); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to find wave info */ + return MM_STATUS_INVALID_PARAMETER; + } + + /* get associated device id */ + MixerData = MMixerGetDataByDeviceId(MixerList, WaveInfo->DeviceId); + if (!MixerData) + return MM_STATUS_INVALID_PARAMETER; + + /* calculate length */ + Length = wcslen(MixerData->DeviceName)+1; + + /* allocate destination buffer */ + *DevicePath = MixerContext->Alloc(Length * sizeof(WCHAR)); + + if (!*DevicePath) + { + /* no memory */ + return MM_STATUS_NO_MEMORY; + } + + /* copy device path */ + MixerContext->Copy(*DevicePath, MixerData->DeviceName, Length * sizeof(WCHAR)); + + /* done */ + return MM_STATUS_SUCCESS; +} + From 082d9c9fe7cf75b1d9ddc660b36e722cb280ac8d Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Fri, 12 Feb 2010 09:20:35 +0000 Subject: [PATCH 93/97] [MSDMO] sync msdmo with wine 1.1.38 svn path=/trunk/; revision=45583 --- reactos/dll/directx/msdmo/dmoreg.c | 12 ++-- reactos/include/dxsdk/dmo.h | 34 ++++++--- reactos/include/dxsdk/dmoreg.h | 107 ++++++++++++++--------------- reactos/include/dxsdk/dmort.h | 32 ++++++--- 4 files changed, 105 insertions(+), 80 deletions(-) diff --git a/reactos/dll/directx/msdmo/dmoreg.c b/reactos/dll/directx/msdmo/dmoreg.c index ce4ee04f824..a3dc9304687 100644 --- a/reactos/dll/directx/msdmo/dmoreg.c +++ b/reactos/dll/directx/msdmo/dmoreg.c @@ -787,11 +787,11 @@ HRESULT read_types(HKEY root, LPCWSTR key, ULONG *supplied, ULONG requested, DMO * DMOGetTypes (MSDMO.@) */ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO, - unsigned long ulInputTypesRequested, - unsigned long* pulInputTypesSupplied, + ULONG ulInputTypesRequested, + ULONG* pulInputTypesSupplied, DMO_PARTIAL_MEDIATYPE* pInputTypes, - unsigned long ulOutputTypesRequested, - unsigned long* pulOutputTypesSupplied, + ULONG ulOutputTypesRequested, + ULONG* pulOutputTypesSupplied, DMO_PARTIAL_MEDIATYPE* pOutputTypes) { HKEY root,hkey; @@ -815,7 +815,7 @@ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO, if (ulInputTypesRequested > 0) { - ret = read_types(hkey, szDMOInputType, (ULONG*)pulInputTypesSupplied, ulInputTypesRequested, pInputTypes ); + ret = read_types(hkey, szDMOInputType, pulInputTypesSupplied, ulInputTypesRequested, pInputTypes ); } else *pulInputTypesSupplied = 0; @@ -823,7 +823,7 @@ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO, if (ulOutputTypesRequested > 0) { HRESULT ret2; - ret2 = read_types(hkey, szDMOOutputType, (ULONG*)pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes ); + ret2 = read_types(hkey, szDMOOutputType, pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes ); if (ret == S_OK) ret = ret2; diff --git a/reactos/include/dxsdk/dmo.h b/reactos/include/dxsdk/dmo.h index 73bc011a3a6..adc24b0f39b 100644 --- a/reactos/include/dxsdk/dmo.h +++ b/reactos/include/dxsdk/dmo.h @@ -1,20 +1,34 @@ +/* + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ #ifndef __DMO_H__ #define __DMO_H__ -#include "mediaerr.h" +#include #ifdef FIX_LOCK_NAME - #define Lock DMOLock +#define Lock DMOLock #endif - -#include "mediaobj.h" - +#include #ifdef FIX_LOCK_NAME - #undef Lock +#undef Lock #endif +#include +#include -#include "dmoreg.h" -#include "dmort.h" - -#endif /* __DMO_H__ */ +#endif /* __DMO_H__ */ diff --git a/reactos/include/dxsdk/dmoreg.h b/reactos/include/dxsdk/dmoreg.h index 7fc7af24495..66966f9c31a 100644 --- a/reactos/include/dxsdk/dmoreg.h +++ b/reactos/include/dxsdk/dmoreg.h @@ -1,75 +1,70 @@ +/* + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + #ifndef __DMOREG_H__ #define __DMOREG_H__ #include "mediaobj.h" -DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, 0xBF963D80, 0xC559, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1); -DEFINE_GUID(DMOCATEGORY_AGC, 0xE88C9BA0, 0xC557, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1); -DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, 0xF665AAba, 0x3E09, 0x4920, 0xAA, 0x5F,0x21,0x98,0x11,0x14,0x8F,0x09); -DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER, 0x57F2db8b, 0xE6BB, 0x4513, 0x9D, 0x43,0xDC,0xD2,0xA6,0x59,0x31,0x25); -DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT, 0xF3602b3f, 0x0592, 0x48DF, 0xA4, 0xCD,0x67,0x47,0x21,0xE7,0xEB,0xEB); -DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER, 0x33D9A761, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86); -DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, 0xE07f903f, 0x62FD, 0x4e60, 0x8C, 0xDD,0xDE,0xA7,0x23,0x66,0x65,0xB5); -DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER, 0x4A69b442, 0x28BE, 0x4991, 0x96, 0x9C,0xB5,0x00,0xAD,0xF5,0xd8,0xA8); -DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT, 0xd990eE14, 0x776C, 0x4723, 0xBE, 0x46,0x3D,0xA2,0xF5,0x6F,0x10,0xB9); -DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER, 0x33D9A760, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86); - typedef struct _DMO_PARTIAL_MEDIATYPE { - GUID type; - GUID subtype; + GUID type; + GUID subtype; } DMO_PARTIAL_MEDIATYPE, *PDMO_PARTIAL_MEDIATYPE; enum DMO_REGISTER_FLAGS { - DMO_REGISTERF_IS_KEYED = 0x00000001 + DMO_REGISTERF_IS_KEYED = 1 }; enum DMO_ENUM_FLAGS { - DMO_ENUMF_INCLUDE_KEYED = 0x00000001 + DMO_ENUMF_INCLUDE_KEYED = 1 }; -STDAPI -DMOEnum( - REFGUID guidCategory, - DWORD dwFlags, - DWORD cInTypes, - const DMO_PARTIAL_MEDIATYPE *pInTypes, - DWORD cOutTypes, - const DMO_PARTIAL_MEDIATYPE *pOutTypes, - IEnumDMO **ppEnum); +HRESULT WINAPI DMORegister(LPCWSTR,REFCLSID,REFGUID,DWORD,DWORD,const DMO_PARTIAL_MEDIATYPE*, + DWORD,const DMO_PARTIAL_MEDIATYPE*); +HRESULT WINAPI DMOUnregister(REFCLSID,REFGUID); +HRESULT WINAPI DMOEnum(REFGUID,DWORD,DWORD,const DMO_PARTIAL_MEDIATYPE*,DWORD, + const DMO_PARTIAL_MEDIATYPE*,IEnumDMO**); +HRESULT WINAPI DMOGetTypes(REFCLSID,ULONG,ULONG*,DMO_PARTIAL_MEDIATYPE*, + ULONG,ULONG*,DMO_PARTIAL_MEDIATYPE*); +HRESULT WINAPI DMOGetName(REFCLSID,WCHAR[80]); -STDAPI -DMOGetName( - REFCLSID clsidDMO, - WCHAR szName[80]); - -STDAPI DMOGetTypes( - REFCLSID clsidDMO, - unsigned long ulInputTypesRequested, - unsigned long *pulInputTypesSupplied, - DMO_PARTIAL_MEDIATYPE *pInputTypes, - unsigned long ulOutputTypesRequested, - unsigned long *pulOutputTypesSupplied, - DMO_PARTIAL_MEDIATYPE *pOutputTypes -); - -STDAPI -DMORegister( - LPCWSTR szName, - REFCLSID clsidDMO, - REFGUID guidCategory, - DWORD dwFlags, - DWORD cInTypes, - const DMO_PARTIAL_MEDIATYPE *pInTypes, - DWORD cOutTypes, - const DMO_PARTIAL_MEDIATYPE *pOutTypes); - -STDAPI -DMOUnregister( - REFCLSID clsidDMO, - REFGUID guidCategory); - -#endif +DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER, + 0x57f2db8b,0xe6bb,0x4513,0x9d,0x43,0xdc,0xd2,0xa6,0x59,0x31,0x25); +DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER, + 0x33d9a761,0x90c8,0x11d0,0xbd,0x43,0x00,0xa0,0xc9,0x11,0xce,0x86); +DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER, + 0x4a69b442,0x28be,0x4991,0x96,0x9c,0xb5,0x00,0xad,0xf5,0xd8,0xa8); +DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER, + 0x33d9a760,0x90c8,0x11d0,0xbd,0x43,0x00,0xa0,0xc9,0x11,0xce,0x86); +DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT, + 0xf3602b3f,0x0592,0x48df,0xa4,0xcd,0x67,0x47,0x21,0xe7,0xeb,0xeb); +DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT, + 0xd990ee14,0x776c,0x4723,0xbe,0x46,0x3d,0xa2,0xf5,0x6f,0x10,0xb9); +DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, + 0xf665aaba,0x3e09,0x4920,0xaa,0x5f,0x21,0x98,0x11,0x14,0x8f,0x09); +DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, + 0xbf963d80,0xc559,0x11d0,0x8a,0x2b,0x00,0xa0,0xc9,0x25,0x5a,0xc1); +DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, + 0xe07f903f,0x62fd,0x4e60,0x8c,0xdd,0xde,0xa7,0x23,0x66,0x65,0xb5); +DEFINE_GUID(DMOCATEGORY_AGC, + 0xe88c9ba0,0xc557,0x11d0,0x8a,0x2b,0x00,0xa0,0xc9,0x25,0x5a,0xc1); +#endif /* __DMOREG_H__ */ diff --git a/reactos/include/dxsdk/dmort.h b/reactos/include/dxsdk/dmort.h index 6efe7053450..01b081d4701 100644 --- a/reactos/include/dxsdk/dmort.h +++ b/reactos/include/dxsdk/dmort.h @@ -1,13 +1,29 @@ +/* + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ #ifndef __DMORT_H__ #define __DMORT_H__ -STDAPI MoCopyMediaType(DMO_MEDIA_TYPE *pmtDest, const DMO_MEDIA_TYPE *pmtSrc); -STDAPI MoCreateMediaType(DMO_MEDIA_TYPE **ppmt, DWORD cbFormat); -STDAPI MoDeleteMediaType(DMO_MEDIA_TYPE *pmt); -STDAPI MoDuplicateMediaType(DMO_MEDIA_TYPE **ppmtDest, const DMO_MEDIA_TYPE *pmtSrc); -STDAPI MoFreeMediaType(DMO_MEDIA_TYPE *pmt); -STDAPI MoInitMediaType(DMO_MEDIA_TYPE *pmt, DWORD cbFormat); - -#endif +HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE*,const DMO_MEDIA_TYPE*); +HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE**,DWORD); +HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE*); +HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE**,const DMO_MEDIA_TYPE*); +HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE*); +HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE*,DWORD); +#endif /* __DMORT_H__ */ From 5974fe1781521ded599712fd5be7d9e44419317d Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 12 Feb 2010 09:54:56 +0000 Subject: [PATCH 94/97] [DSOUND_NEW] - Setup a default format for the primary sound buffer - Store last used write position and use it when checking current position - Check if the buffer has already started to play - Fill audio buffer with silence bytes when initializing the secondary sound buffer -- Partialy makes graphedit work when building a simple render graph(FileAsync->WaveParser->AudioRenderer). svn path=/trunk/; revision=45584 --- reactos/dll/directx/dsound_new/precomp.h | 2 +- reactos/dll/directx/dsound_new/primary.c | 30 +++++++++++++++++++- reactos/dll/directx/dsound_new/secondary.c | 32 +++++++++++++++++++++- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/reactos/dll/directx/dsound_new/precomp.h b/reactos/dll/directx/dsound_new/precomp.h index 5a5d0dc29b0..4d413df51b9 100644 --- a/reactos/dll/directx/dsound_new/precomp.h +++ b/reactos/dll/directx/dsound_new/precomp.h @@ -15,7 +15,7 @@ #include #include #include -#define NDEBUG +#define YDEBUG #include #include #include diff --git a/reactos/dll/directx/dsound_new/primary.c b/reactos/dll/directx/dsound_new/primary.c index ca7a285f004..2a62ccee855 100644 --- a/reactos/dll/directx/dsound_new/primary.c +++ b/reactos/dll/directx/dsound_new/primary.c @@ -100,6 +100,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCaps\n"); + if (!pDSBufferCaps) { /* invalid parameter */ @@ -130,6 +132,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition\n"); + if (This->dwLevel < DSSCL_PRIORITY) { /* needs priority level */ @@ -157,6 +161,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetFormat( DWORD FormatSize; LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFormat\n"); + FormatSize = sizeof(WAVEFORMATEX) + This->Format.cbSize; if (!pwfxFormat && !pdwSizeWritten) @@ -199,6 +205,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetVolume\n"); + if (!plVolume) { /* invalid parameter */ @@ -219,6 +227,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetPan\n"); + if (!plPan) { /* invalid parameter */ @@ -239,6 +249,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFrequency\n"); + if (!pdwFrequency) { /* invalid parameter */ @@ -259,6 +271,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetStatus\n"); + if (!pdwStatus) { /* invalid parameter */ @@ -312,6 +326,8 @@ PrimaryDirectSoundBuffer8Impl_fnPlay( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnPlay dwFlags %x\n", dwFlags); + if (dwReserved1 != 0 || !(dwFlags & DSBPLAY_LOOPING)) { /* invalid parameter */ @@ -447,6 +463,8 @@ PrimaryDirectSoundBuffer8Impl_fnStop( { LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnStop\n"); + PrimaryDirectSoundBuffer_AcquireLock(iface); if (This->State == KSSTATE_RUN) @@ -631,9 +649,10 @@ PrimaryDirectSoundBuffer_GetPosition( KSAUDIO_POSITION Position; KSPROPERTY Request; DWORD Result; - LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + //DPRINT("PrimaryDirectSoundBuffer_GetPosition\n"); + if (!This->hPin) { if (pdwCurrentPlayCursor) @@ -770,6 +789,15 @@ NewPrimarySoundBuffer( This->VolumePan = DSBPAN_CENTER; This->hPin = NULL; + /* FIXME: determine default format for audio device */ + This->Format.cbSize = sizeof(WAVEFORMATEX); + This->Format.nChannels = 2; + This->Format.nSamplesPerSec = 44100; + This->Format.wBitsPerSample = 16; + This->Format.wFormatTag = WAVE_FORMAT_PCM; + This->Format.nBlockAlign = (This->Format.nChannels * This->Format.wBitsPerSample) / 8; + This->Format.nAvgBytesPerSec = (This->Format.nChannels * This->Format.nSamplesPerSec * This->Format.wBitsPerSample) / 8; + InitializeCriticalSection(&This->Lock); *OutBuffer = (LPDIRECTSOUNDBUFFER8)&This->lpVtbl; diff --git a/reactos/dll/directx/dsound_new/secondary.c b/reactos/dll/directx/dsound_new/secondary.c index 216d76d197d..2293d34f2e9 100644 --- a/reactos/dll/directx/dsound_new/secondary.c +++ b/reactos/dll/directx/dsound_new/secondary.c @@ -19,6 +19,7 @@ typedef struct DWORD dwLevel; DWORD dwFlags; DWORD dwFrequency; + DWORD BufferPosition; LONG Volume; LONG VolumePan; LPWAVEFORMATEX Format; @@ -135,7 +136,12 @@ SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition( //DPRINT("SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition This %p Play %p Write %p\n", This, pdwCurrentPlayCursor, pdwCurrentWriteCursor); - return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, pdwCurrentWriteCursor); + if (pdwCurrentWriteCursor) + { + *pdwCurrentWriteCursor = This->BufferPosition; + } + + return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, NULL); } HRESULT @@ -322,6 +328,12 @@ SecondaryDirectSoundBuffer8Impl_fnLock( *ppvAudioPtr1 = This->Buffer + dwOffset; *pdwAudioBytes1 = dwBytes; + + This->BufferPosition = dwOffset + dwBytes; + + if (This->BufferPosition == This->BufferSize) + This->BufferPosition = 0; + if (ppvAudioPtr2) *ppvAudioPtr2 = NULL; if (pdwAudioBytes2) @@ -351,6 +363,13 @@ SecondaryDirectSoundBuffer8Impl_fnPlay( /* sanity check */ ASSERT(dwFlags & DSBPLAY_LOOPING); + + if (This->State == KSSTATE_RUN) + { + /* sound buffer is already playing */ + return DS_OK; + } + /* set dataformat */ hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format, TRUE); @@ -371,6 +390,8 @@ SecondaryDirectSoundBuffer8Impl_fnPlay( PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer); DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer); + This->State = KSSTATE_RUN; + return DS_OK; } @@ -481,6 +502,13 @@ SecondaryDirectSoundBuffer8Impl_fnStop( PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_ACQUIRE); PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_STOP); + DPRINT("SecondaryDirectSoundBuffer8Impl_fnStop\n"); + + + /* set state to stop */ + This->State = KSSTATE_STOP; + This->BufferPosition = 0; + return DS_OK; } @@ -619,6 +647,8 @@ NewSecondarySoundBuffer( return DSERR_OUTOFMEMORY; } + /* fill buffer with silence */ + FillMemory(This->Buffer, lpcDSBufferDesc->dwBufferBytes, lpcDSBufferDesc->lpwfxFormat->wBitsPerSample == 8 ? 0x80 : 0); This->ref = 1; This->lpVtbl = &vt_DirectSoundBuffer8; From ff9fdc82594375c67a2e9e63ab1d46a21469320a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 12 Feb 2010 10:12:46 +0000 Subject: [PATCH 95/97] [PORTCLS] - Reset play position when an audio stream is stopped -- Fixes playback in looped mode (DirectSound) when a buffer is played&stopped more than once svn path=/trunk/; revision=45585 --- reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index 1162b94646b..e36e9b97a0e 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -450,10 +450,14 @@ PinWaveCyclicState( // FIXME // complete with successful state Pin->m_IrpQueue->CancelBuffers(); + Pin->m_Position.PlayOffset = 0; + Pin->m_Position.WriteOffset = 0; } else if (Pin->m_State == KSSTATE_STOP) { Pin->m_IrpQueue->CancelBuffers(); + Pin->m_Position.PlayOffset = 0; + Pin->m_Position.WriteOffset = 0; } // store result Irp->IoStatus.Information = sizeof(KSSTATE); From 1ce3458da7b8f142ed0f451539783e7746083b34 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 12 Feb 2010 13:46:53 +0000 Subject: [PATCH 96/97] [PSDK] - Work on ksproxy.h, WIP svn path=/trunk/; revision=45586 --- reactos/include/psdk/ksproxy.h | 798 +++++++++++++++++++++++++++++++++ 1 file changed, 798 insertions(+) create mode 100644 reactos/include/psdk/ksproxy.h diff --git a/reactos/include/psdk/ksproxy.h b/reactos/include/psdk/ksproxy.h new file mode 100644 index 00000000000..db2f3122fec --- /dev/null +++ b/reactos/include/psdk/ksproxy.h @@ -0,0 +1,798 @@ +#ifndef __KSPROXY__ +#define __KSPROXY__ + +#ifdef __cplusplus +extern "C" { +#endif + +#undef KSDDKAPI +#ifdef _KSDDK_ +#define KSDDKAPI +#else +#define KSDDKAPI DECLSPEC_IMPORT +#endif + +#define STATIC_IID_IKsObject\ + 0x423c13a2L, 0x2070, 0x11d0, 0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 + +#define STATIC_IID_IKsPinEx\ + 0x7bb38260L, 0xd19c, 0x11d2, 0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e + +#define STATIC_IID_IKsPin\ + 0xb61178d1L, 0xa2d9, 0x11cf, 0x9e, 0x53, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 + +#define STATIC_IID_IKsPinPipe\ + 0xe539cd90L, 0xa8b4, 0x11d1, 0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + +#define STATIC_IID_IKsDataTypeHandler\ + 0x5ffbaa02L, 0x49a3, 0x11d0, 0x9f, 0x36, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 + +#define STATIC_IID_IKsDataTypeCompletion\ + 0x827D1A0EL, 0x0F73, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_IID_IKsInterfaceHandler\ + 0xD3ABC7E0L, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_IID_IKsClockPropertySet\ + 0x5C5CBD84L, 0xE755, 0x11D0, 0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_IID_IKsAllocator\ + 0x8da64899L, 0xc0d9, 0x11d0, 0x84, 0x13, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a + +#define STATIC_IID_IKsAllocatorEx\ + 0x091bb63aL, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + + +#ifndef STATIC_IID_IKsPropertySet +#define STATIC_IID_IKsPropertySet\ + 0x31EFAC30L, 0x515C, 0x11d0, 0xA9, 0xAA, 0x00, 0xAA, 0x00, 0x61, 0xBE, 0x93 +#endif + +#define STATIC_IID_IKsTopology\ + 0x28F54683L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#ifndef STATIC_IID_IKsControl +#define STATIC_IID_IKsControl\ + 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +#endif + +#define STATIC_IID_IKsAggregateControl\ + 0x7F40EAC0L, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_CLSID_Proxy \ + 0x17CCA71BL, 0xECD7, 0x11D0, 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#ifdef _KS_ + +#if !defined(__cplusplus) || _MSC_VER < 1100 + +#define IID_IKsQualityForwarder KSCATEGORY_QUALITY + +DEFINE_GUIDEX(IID_IKsObject); +DEFINE_GUIDEX(IID_IKsPin); +DEFINE_GUIDEX(IID_IKsPinEx); +DEFINE_GUIDEX(IID_IKsPinPipe); +DEFINE_GUIDEX(IID_IKsDataTypeHandler); +DEFINE_GUIDEX(IID_IKsDataTypeCompletion); +DEFINE_GUIDEX(IID_IKsInterfaceHandler); +DEFINE_GUIDEX(IID_IKsClockPropertySet); +DEFINE_GUIDEX(IID_IKsAllocator); +DEFINE_GUIDEX(IID_IKsAllocatorEx); +#endif + +#define STATIC_IID_IKsQualityForwarder STATIC_KSCATEGORY_QUALITY + +typedef enum +{ + KsAllocatorMode_User, + KsAllocatorMode_Kernel +}KSALLOCATORMODE; + + +typedef enum +{ + FramingProp_Uninitialized, + FramingProp_None, + FramingProp_Old, + FramingProp_Ex +}FRAMING_PROP; + +typedef FRAMING_PROP *PFRAMING_PROP; + + +typedef enum +{ + Framing_Cache_Update, + Framing_Cache_ReadLast, + Framing_Cache_ReadOrig, + Framing_Cache_Write +}FRAMING_CACHE_OPS; + + +typedef struct +{ + LONGLONG MinTotalNominator; + LONGLONG MaxTotalNominator; + LONGLONG TotalDenominator; +}OPTIMAL_WEIGHT_TOTALS; + +typedef struct IPin IPin; +typedef struct IKsPin IKsPin; +typedef struct IKsAllocator IKsAllocator; +typedef struct IKsAllocatorEx IKsAllocatorEx; + + +#define AllocatorStrategy_DontCare 0 +#define AllocatorStrategy_MinimizeNumberOfFrames 1 +#define AllocatorStrategy_MinimizeFrameSize 2 +#define AllocatorStrategy_MinimizeNumberOfAllocators 4 +#define AllocatorStrategy_MaximizeSpeed 8 + +#define PipeFactor_None 0x0 +#define PipeFactor_UserModeUpstream 0x1 +#define PipeFactor_UserModeDownstream 0x2 +#define PipeFactor_MemoryTypes 0x4 +#define PipeFactor_Flags 0x8 +#define PipeFactor_PhysicalRanges 0x10 +#define PipeFactor_OptimalRanges 0x20 +#define PipeFactor_FixedCompression 0x40 +#define PipeFactor_UnknownCompression 0x80 +#define PipeFactor_Buffers 0x100 +#define PipeFactor_Align 0x200 +#define PipeFactor_PhysicalEnd 0x400 +#define PipeFactor_LogicalEnd 0x800 + +typedef enum +{ + PipeState_DontCare, + PipeState_RangeNotFixed, + PipeState_RangeFixed, + PipeState_CompressionUnknown, + PipeState_Finalized +}PIPE_STATE; + + +typedef struct _PIPE_DIMENSIONS +{ + KS_COMPRESSION AllocatorPin; + KS_COMPRESSION MaxExpansionPin; + KS_COMPRESSION EndPin; +}PIPE_DIMENSIONS, *PPIPE_DIMENSIONS; + + +typedef enum +{ + Pipe_Allocator_None, + Pipe_Allocator_FirstPin, + Pipe_Allocator_LastPin, + Pipe_Allocator_MiddlePin +}PIPE_ALLOCATOR_PLACE, *PPIPE_ALLOCATOR_PLACE;; + +typedef enum +{ + KS_MemoryTypeDontCare = 0, + KS_MemoryTypeKernelPaged, + KS_MemoryTypeKernelNonPaged, + KS_MemoryTypeDeviceHostMapped, + KS_MemoryTypeDeviceSpecific, + KS_MemoryTypeUser, + KS_MemoryTypeAnyHost +}KS_LogicalMemoryType, *PKS_LogicalMemoryType;; + +typedef struct _PIPE_TERMINATION { + ULONG Flags; + ULONG OutsideFactors; + ULONG Weigth; + KS_FRAMING_RANGE PhysicalRange; + KS_FRAMING_RANGE_WEIGHTED OptimalRange; + KS_COMPRESSION Compression; +}PIPE_TERMINATION; + + +typedef struct _ALLOCATOR_PROPERTIES_EX +{ + long cBuffers; + long cbBuffer; + long cbAlign; + long cbPrefix; + + GUID MemoryType; + GUID BusType; + PIPE_STATE State; + PIPE_TERMINATION Input; + PIPE_TERMINATION Output; + ULONG Strategy; + ULONG Flags; + ULONG Weight; + KS_LogicalMemoryType LogicalMemoryType; + PIPE_ALLOCATOR_PLACE AllocatorPlace; + PIPE_DIMENSIONS Dimensions; + KS_FRAMING_RANGE PhysicalRange; + IKsAllocatorEx* PrevSegment; + ULONG CountNextSegments; + IKsAllocatorEx** NextSegments; + ULONG InsideFactors; + ULONG NumberPins; +}ALLOCATOR_PROPERTIES_EX; + +typedef ALLOCATOR_PROPERTIES_EX *PALLOCATOR_PROPERTIES_EX; + + +#ifdef __STREAMS__ + +struct DECLSPEC_UUID("5C5CBD84-E755-11D0-AC18-00A0C9223196") IKsClockPropertySet; +#undef INTERFACE +#define INTERFACE IKsClockPropertySet +DECLARE_INTERFACE_(IKsClockPropertySet, IUnknown) +{ + STDMETHOD(KsGetTime)( + THIS_ + LONGLONG* Time + ) PURE; + STDMETHOD(KsSetTime)( + THIS_ + LONGLONG Time + ) PURE; + STDMETHOD(KsGetPhysicalTime)( + THIS_ + LONGLONG* Time + ) PURE; + STDMETHOD(KsSetPhysicalTime)( + THIS_ + LONGLONG Time + ) PURE; + STDMETHOD(KsGetCorrelatedTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsSetCorrelatedTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsGetCorrelatedPhysicalTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsSetCorrelatedPhysicalTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsGetResolution)( + THIS_ + KSRESOLUTION* Resolution + ) PURE; + STDMETHOD(KsGetState)( + THIS_ + KSSTATE* State + ) PURE; +}; + + +interface DECLSPEC_UUID("8da64899-c0d9-11d0-8413-0000f822fe8a") IKsAllocator; +#undef INTERFACE +#define INTERFACE IKsAllocator +DECLARE_INTERFACE_(IKsAllocator, IUnknown) +{ + STDMETHOD_(HANDLE, KsGetAllocatorHandle)( + THIS + ) PURE; + STDMETHOD_(KSALLOCATORMODE, KsGetAllocatorMode)( + THIS + ) PURE; + STDMETHOD(KsGetAllocatorStatus)( + THIS_ + PKSSTREAMALLOCATOR_STATUS AllocatorStatus + ) PURE; + STDMETHOD_(VOID, KsSetAllocatorMode)( + THIS_ + KSALLOCATORMODE Mode + ) PURE; +}; + +interface DECLSPEC_UUID("091bb63a-603f-11d1-b067-00a0c9062802") IKsAllocatorEx; +#undef INTERFACE +#define INTERFACE IKsAllocatorEx +DECLARE_INTERFACE_(IKsAllocatorEx, IKsAllocator) +{ + STDMETHOD_(PALLOCATOR_PROPERTIES_EX, KsGetProperties)( + THIS + ) PURE; + STDMETHOD_(VOID, KsSetProperties)( + THIS_ + PALLOCATOR_PROPERTIES_EX + ) PURE; + STDMETHOD_(VOID, KsSetAllocatorHandle)( + THIS_ + HANDLE AllocatorHandle + ) PURE; + STDMETHOD_(HANDLE, KsCreateAllocatorAndGetHandle)( + THIS_ + IKsPin* KsPin + ) PURE; +}; + +typedef enum { + KsPeekOperation_PeekOnly, + KsPeekOperation_AddRef +} KSPEEKOPERATION; + +typedef struct _KSSTREAM_SEGMENT *PKSSTREAM_SEGMENT; + +interface DECLSPEC_UUID("b61178d1-a2d9-11cf-9e53-00aa00a216a1") IKsPin; + +#undef INTERFACE +#define INTERFACE IKsPin +DECLARE_INTERFACE_(IKsPin, IUnknown) +{ + STDMETHOD(KsQueryMediums)( + THIS_ + PKSMULTIPLE_ITEM* MediumList + ) PURE; + STDMETHOD(KsQueryInterfaces)( + THIS_ + PKSMULTIPLE_ITEM* InterfaceList + ) PURE; + STDMETHOD(KsCreateSinkPinHandle)( + THIS_ + KSPIN_INTERFACE& Interface, + KSPIN_MEDIUM& Medium + ) PURE; + STDMETHOD(KsGetCurrentCommunication)( + THIS_ + KSPIN_COMMUNICATION *Communication, + KSPIN_INTERFACE *Interface, + KSPIN_MEDIUM *Medium + ) PURE; + STDMETHOD(KsPropagateAcquire)( + THIS + ) PURE; + STDMETHOD(KsDeliver)( + THIS_ + IMediaSample* Sample, + ULONG Flags + ) PURE; + STDMETHOD(KsMediaSamplesCompleted)( + THIS_ + PKSSTREAM_SEGMENT StreamSegment + ) PURE; + STDMETHOD_(IMemAllocator *, KsPeekAllocator)( + THIS_ + KSPEEKOPERATION Operation + ) PURE; + STDMETHOD(KsReceiveAllocator)( + THIS_ + IMemAllocator *MemAllocator + ) PURE; + STDMETHOD(KsRenegotiateAllocator)( + THIS + ) PURE; + STDMETHOD_(LONG, KsIncrementPendingIoCount)( + THIS + ) PURE; + STDMETHOD_(LONG, KsDecrementPendingIoCount)( + THIS + ) PURE; + STDMETHOD(KsQualityNotify)( + THIS_ + ULONG Proportion, + REFERENCE_TIME TimeDelta + ) PURE; +}; + +interface DECLSPEC_UUID("7bb38260-d19c-11d2-b38a-00a0c95ec22e") IKsPinEx; +#undef INTERFACE +#define INTERFACE IKsPinEx +DECLARE_INTERFACE_(IKsPinEx, IKsPin) +{ + STDMETHOD_(VOID, KsNotifyError)( + THIS_ + IMediaSample* Sample, + HRESULT hr + ) PURE; +}; + +interface DECLSPEC_UUID("e539cd90-a8b4-11d1-8189-00a0c9062802") IKsPinPipe; +#undef INTERFACE +#define INTERFACE IKsPinPipe +DECLARE_INTERFACE_(IKsPinPipe, IUnknown) +{ + STDMETHOD(KsGetPinFramingCache)( + THIS_ + PKSALLOCATOR_FRAMING_EX *FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option + ) PURE; + STDMETHOD(KsSetPinFramingCache)( + THIS_ + PKSALLOCATOR_FRAMING_EX FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option + ) PURE; + STDMETHOD_(IPin*, KsGetConnectedPin)( + THIS + ) PURE; + STDMETHOD_(IKsAllocatorEx*, KsGetPipe)( + THIS_ + KSPEEKOPERATION Operation + ) PURE; + STDMETHOD(KsSetPipe)( + THIS_ + IKsAllocatorEx *KsAllocator + ) PURE; + STDMETHOD_(ULONG, KsGetPipeAllocatorFlag)( + THIS + ) PURE; + STDMETHOD(KsSetPipeAllocatorFlag)( + THIS_ + ULONG Flag + ) PURE; + STDMETHOD_(GUID, KsGetPinBusCache)( + THIS + ) PURE; + STDMETHOD(KsSetPinBusCache)( + THIS_ + GUID Bus + ) PURE; + + STDMETHOD_(PWCHAR, KsGetPinName)( + THIS + ) PURE; + STDMETHOD_(PWCHAR, KsGetFilterName)( + THIS + ) PURE; +}; + + +interface DECLSPEC_UUID("CD5EBE6B-8B6E-11D1-8AE0-00A0C9223196") IKsPinFactory; +#undef INTERFACE +#define INTERFACE IKsPinFactory +DECLARE_INTERFACE_(IKsPinFactory, IUnknown) +{ + STDMETHOD(KsPinFactory)( + THIS_ + ULONG* PinFactory + ) PURE; +}; + +typedef enum { + KsIoOperation_Write, + KsIoOperation_Read +} KSIOOPERATION; + +interface DECLSPEC_UUID("5ffbaa02-49a3-11d0-9f36-00aa00a216a1") IKsDataTypeHandler; +#undef INTERFACE +#define INTERFACE IKsDataTypeHandler +DECLARE_INTERFACE_(IKsDataTypeHandler, IUnknown) +{ + STDMETHOD(KsCompleteIoOperation)( + THIS_ + IMediaSample *Sample, + PVOID StreamHeader, + KSIOOPERATION IoOperation, + BOOL Cancelled + ) PURE; + STDMETHOD(KsIsMediaTypeInRanges)( + THIS_ + PVOID DataRanges + ) PURE; + STDMETHOD(KsPrepareIoOperation)( + THIS_ + IMediaSample *Sample, + PVOID StreamHeader, + KSIOOPERATION IoOperation + ) PURE; + STDMETHOD(KsQueryExtendedSize)( + THIS_ + ULONG* ExtendedSize + ) PURE; + STDMETHOD(KsSetMediaType)( + THIS_ + const AM_MEDIA_TYPE* AmMediaType + ) PURE; +}; + +interface DECLSPEC_UUID("827D1A0E-0F73-11D2-B27A-00A0C9223196") IKsDataTypeCompletion; +#undef INTERFACE +#define INTERFACE IKsDataTypeCompletion +DECLARE_INTERFACE_(IKsDataTypeCompletion, IUnknown) +{ + STDMETHOD(KsCompleteMediaType)( + THIS_ + HANDLE FilterHandle, + ULONG PinFactoryId, + AM_MEDIA_TYPE* AmMediaType + ) PURE; +}; + +interface DECLSPEC_UUID("D3ABC7E0-9A61-11d0-A40D-00A0C9223196") IKsInterfaceHandler; +#undef INTERFACE +#define INTERFACE IKsInterfaceHandler +DECLARE_INTERFACE_(IKsInterfaceHandler, IUnknown) +{ + STDMETHOD(KsSetPin)( + THIS_ + IKsPin *KsPin + ) PURE; + STDMETHOD(KsProcessMediaSamples)( + THIS_ + IKsDataTypeHandler *KsDataTypeHandler, + IMediaSample** SampleList, + PLONG SampleCount, + KSIOOPERATION IoOperation, + PKSSTREAM_SEGMENT *StreamSegment + ) PURE; + STDMETHOD(KsCompleteIo)( + THIS_ + PKSSTREAM_SEGMENT StreamSegment + ) PURE; +}; + + +typedef struct _KSSTREAM_SEGMENT +{ + IKsInterfaceHandler *KsInterfaceHandler; + IKsDataTypeHandler *KsDataTypeHandler; + KSIOOPERATION IoOperation; + HANDLE CompletionEvent; + +}KSSTREAM_SEGMENT; + +interface DECLSPEC_UUID("423c13a2-2070-11d0-9ef7-00aa00a216a1") IKsObject; +#undef INTERFACE +#define INTERFACE IKsObject +DECLARE_INTERFACE_(IKsObject, IUnknown) +{ + STDMETHOD_(HANDLE, KsGetObjectHandle)( + THIS + ) PURE; +}; + +interface DECLSPEC_UUID("97ebaacb-95bd-11d0-a3ea-00a0c9223196") IKsQualityForwarder; +#undef INTERFACE +#define INTERFACE IKsQualityForwarder +DECLARE_INTERFACE_(IKsQualityForwarder, IKsObject) +{ + STDMETHOD_(VOID, KsFlushClient)( + THIS_ + IKsPin* Pin + ) PURE; +}; + +#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1) + +interface DECLSPEC_UUID("412bd695-f84b-46c1-ac73-54196dbc8fa7") IKsNotifyEvent; +#undef INTERFACE +#define INTERFACE IKsNotifyEvent +DECLARE_INTERFACE_(IKsNotifyEvent, IUnknown) +{ + STDMETHOD(KsNotifyEvent)( + THIS_ + ULONG Event, + ULONG_PTR lParam1, + ULONG_PTR lParam2 + ) PURE; +}; + +#endif + +KSDDKAPI +HRESULT +WINAPI +KsResolveRequiredAttributes( + PKSDATARANGE DataRange, + PKSMULTIPLE_ITEM Attributes OPTIONAL); + +KSDDKAPI +HRESULT +WINAPI +KsOpenDefaultDevice( + REFGUID Category, + ACCESS_MASK Access, + PHANDLE DeviceHandle); + +KSDDKAPI +HRESULT +WINAPI +KsSynchronousDeviceControl( + HANDLE Handle, + ULONG IoControl, + PVOID InBuffer, + ULONG InLength, + PVOID OutBuffer, + ULONG OutLength, + PULONG BytesReturned); + +KSDDKAPI +HRESULT +WINAPI +KsGetMultiplePinFactoryItems( + HANDLE FilterHandle, + ULONG PinFactoryId, + ULONG PropertyId, + PVOID* Items); + +KSDDKAPI +HRESULT +WINAPI +KsGetMediaTypeCount( + HANDLE FilterHandle, + ULONG PinFactoryId, + ULONG* MediaTypeCount); + +KSDDKAPI +HRESULT +WINAPI +KsGetMediaType( + int Position, + AM_MEDIA_TYPE* AmMediaType, + HANDLE FilterHandle, + ULONG PinFactoryId); + +#endif + +#ifndef _IKsPropertySet_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsPropertySet); +#endif +#endif + +#ifndef _IKsControl_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsControl); +#endif +#endif + +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsAggregateControl); +#endif + +#ifndef _IKsTopology_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsTopology); +#endif +#endif + +DEFINE_GUIDSTRUCT("17CCA71B-ECD7-11D0-B908-00A0C9223196", CLSID_Proxy); +#define CLSID_Proxy DEFINE_GUIDNAMED(CLSID_Proxy) + +#else + +#ifndef _IKsPropertySet_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUID(IID_IKsPropertySet, STATIC_IID_IKsPropertySet); +#endif +#endif + +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUID(CLSID_Proxy, STATIC_CLSID_Proxy); +#else +DECLSPEC_UUID("17CCA71B-ECD7-11D0-B908-00A0C9223196") CLSID_Proxy; +#endif + +#endif + +#ifndef _IKsPropertySet_ +#define _IKsPropertySet_ + +#define KSPROPERTY_SUPPORT_GET 1 +#define KSPROPERTY_SUPPORT_SET 2 + +interface DECLSPEC_UUID("31EFAC30-515C-11d0-A9AA-00aa0061be93") +#undef INTERFACE +#define INTERFACE IKsPropertySet +DECLARE_INTERFACE_(IKsPropertySet, IUnknown) +{ + STDMETHOD(Set)( + THIS_ + IN REFGUID PropSet, + IN ULONG Id, + IN LPVOID InstanceData, + IN ULONG InstanceLength, + IN LPVOID PropertyData, + IN ULONG DataLength + ) PURE; + + STDMETHOD(Get)( + THIS_ + IN REFGUID PropSet, + IN ULONG Id, + IN LPVOID InstanceData, + IN ULONG InstanceLength, + OUT LPVOID PropertyData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; + + STDMETHOD(QuerySupported)( + THIS_ + IN REFGUID PropSet, + IN ULONG Id, + OUT ULONG* TypeSupport + ) PURE; +}; + +#endif + +#ifndef _IKsControl_ +#define _IKsControl_ + +DEFINE_GUID(IID_IKsControl, 28F54685, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96); + + +interface DECLSPEC_UUID("28F54685-06FD-11D2-B27A-00A0C9223196") IKsControl; +#undef INTERFACE +#define INTERFACE IKsControl +DECLARE_INTERFACE_(IKsControl, IUnknown) +{ + STDMETHOD(KsProperty)( + THIS_ + IN PKSPROPERTY Property, + IN ULONG PropertyLength, + IN OUT LPVOID PropertyData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; + STDMETHOD(KsMethod)( + THIS_ + IN PKSMETHOD Method, + IN ULONG MethodLength, + IN OUT LPVOID MethodData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; + STDMETHOD(KsEvent)( + THIS_ + IN PKSEVENT Event OPTIONAL, + IN ULONG EventLength, + IN OUT LPVOID EventData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; +}; + +#endif + + +DEFINE_GUID(IID_IKsAggregateControl, 0x7F40EAC0, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96); + +#undef INTERFACE +#define INTERFACE IKsAggregateControl +DECLARE_INTERFACE_(IKsAggregateControl, IUnknown) +{ + STDMETHOD(KsAddAggregate)( + THIS_ + IN REFGUID AggregateClass + ) PURE; + STDMETHOD(KsRemoveAggregate)( + THIS_ + IN REFGUID AggregateClass + ) PURE; +}; + +#ifndef _IKsTopology_ +#define _IKsTopology_ + +DEFINE_GUID(IID_IKsAggregateControl, 0x28F54683, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96); + +#undef INTERFACE +#define INTERFACE IKsTopology +DECLARE_INTERFACE_(IKsTopology, IUnknown) +{ + STDMETHOD(CreateNodeInstance)( + THIS_ + IN ULONG NodeId, + IN ULONG Flags, + IN ACCESS_MASK DesiredAccess, + IN IUnknown* UnkOuter OPTIONAL, + IN REFGUID InterfaceId, + OUT LPVOID* Interface + ) PURE; +}; + +#endif + +#ifdef __cplusplus +} +#endif + +#endif From a7994c98a596a4a35f49bc891e650e4f262e82c9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 13 Feb 2010 02:01:33 +0000 Subject: [PATCH 97/97] [NTOS] Push vector as error code on the stack in KiUnexpectedInterrupt* instead of putting it into eax, because we must not clobber it. Spotted by jcatena. svn path=/trunk/; revision=45590 --- reactos/ntoskrnl/ke/i386/irqobj.c | 2 +- reactos/ntoskrnl/ke/i386/trap.s | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/irqobj.c b/reactos/ntoskrnl/ke/i386/irqobj.c index 5543f939170..10170134d82 100644 --- a/reactos/ntoskrnl/ke/i386/irqobj.c +++ b/reactos/ntoskrnl/ke/i386/irqobj.c @@ -168,7 +168,7 @@ KiUnexpectedInterruptTailHandler(IN PKTRAP_FRAME TrapFrame) KeGetCurrentPrcb()->InterruptCount++; /* Start the interrupt */ - if (HalBeginSystemInterrupt(HIGH_LEVEL, TrapFrame->Eax, &OldIrql)) + if (HalBeginSystemInterrupt(HIGH_LEVEL, TrapFrame->ErrCode, &OldIrql)) { /* Warn user */ DPRINT1("\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n"); diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 07e1161d33a..5f24877eeac 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -20,7 +20,7 @@ ENDM MACRO(GENERATE_INT_HANDLER, Number) .func KiUnexpectedInterrupt&Number _KiUnexpectedInterrupt&Number: - mov eax, PRIMARY_VECTOR_BASE + Number + push PRIMARY_VECTOR_BASE + Number jmp _KiEndUnexpectedRange@0 .endfunc ENDM @@ -103,7 +103,7 @@ TRAP_ENTRY KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE TRAP_ENTRY KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE TRAP_ENTRY KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE -TRAP_ENTRY KiUnexpectedInterruptTail, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiUnexpectedInterruptTail, 0 ALIGN 4 EXTERN @KiInterruptTemplateHandler@8