From 924ee8d9ef620f593136af1b13f08e873939bf21 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 20 Jul 2010 20:48:11 +0000 Subject: [PATCH 01/82] [FORMATTING] No code changes. svn path=/trunk/; revision=48146 --- reactos/dll/win32/advapi32/sec/misc.c | 527 +++++++++++++------------- 1 file changed, 264 insertions(+), 263 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/misc.c b/reactos/dll/win32/advapi32/sec/misc.c index 229aa0b9089..03c4587a65f 100644 --- a/reactos/dll/win32/advapi32/sec/misc.c +++ b/reactos/dll/win32/advapi32/sec/misc.c @@ -791,102 +791,109 @@ GetUserNameA(LPSTR lpszName, BOOL WINAPI GetUserNameW(LPWSTR lpszName, - LPDWORD lpSize ) + LPDWORD lpSize) { - HANDLE hToken = INVALID_HANDLE_VALUE; - DWORD tu_len = 0; - char* tu_buf = NULL; - TOKEN_USER* token_user = NULL; - DWORD an_len = 0; - SID_NAME_USE snu = SidTypeUser; - WCHAR* domain_name = NULL; - DWORD dn_len = 0; + HANDLE hToken = INVALID_HANDLE_VALUE; + DWORD tu_len = 0; + char* tu_buf = NULL; + TOKEN_USER* token_user = NULL; + DWORD an_len = 0; + SID_NAME_USE snu = SidTypeUser; + WCHAR* domain_name = NULL; + DWORD dn_len = 0; - if ( !OpenThreadToken ( GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken ) ) - { - DWORD dwLastError = GetLastError(); - if ( dwLastError != ERROR_NO_TOKEN - && dwLastError != ERROR_NO_IMPERSONATION_TOKEN ) + if (!OpenThreadToken (GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken)) { - /* don't call SetLastError(), - as OpenThreadToken() ought to have set one */ - return FALSE; - } - if ( !OpenProcessToken ( GetCurrentProcess(), TOKEN_QUERY, &hToken ) ) - { - /* don't call SetLastError(), - as OpenProcessToken() ought to have set one */ - return FALSE; - } - } - tu_buf = LocalAlloc ( LMEM_FIXED, 36 ); - if ( !tu_buf ) - { - SetLastError ( ERROR_NOT_ENOUGH_MEMORY ); - CloseHandle ( hToken ); - return FALSE; - } - if ( !GetTokenInformation ( hToken, TokenUser, tu_buf, 36, &tu_len ) || tu_len > 36 ) - { - LocalFree ( tu_buf ); - tu_buf = LocalAlloc ( LMEM_FIXED, tu_len ); - if ( !tu_buf ) - { - SetLastError ( ERROR_NOT_ENOUGH_MEMORY ); - CloseHandle ( hToken ); - return FALSE; - } - if ( !GetTokenInformation ( hToken, TokenUser, tu_buf, tu_len, &tu_len ) ) - { - /* don't call SetLastError(), - as GetTokenInformation() ought to have set one */ - LocalFree ( tu_buf ); - CloseHandle ( hToken ); - return FALSE; - } - } - CloseHandle ( hToken ); - token_user = (TOKEN_USER*)tu_buf; + DWORD dwLastError = GetLastError(); + if (dwLastError != ERROR_NO_TOKEN + && dwLastError != ERROR_NO_IMPERSONATION_TOKEN) + { + /* don't call SetLastError(), + as OpenThreadToken() ought to have set one */ + return FALSE; + } - an_len = *lpSize; - dn_len = 32; - domain_name = LocalAlloc ( LMEM_FIXED, dn_len * sizeof(WCHAR) ); - if ( !domain_name ) - { - LocalFree ( tu_buf ); - SetLastError ( ERROR_NOT_ENOUGH_MEMORY ); - return FALSE; - } - if ( !LookupAccountSidW ( NULL, token_user->User.Sid, lpszName, &an_len, domain_name, &dn_len, &snu ) - || dn_len > 32 ) - { - if ( dn_len > 32 ) + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + { + /* don't call SetLastError(), + as OpenProcessToken() ought to have set one */ + return FALSE; + } + } + + tu_buf = LocalAlloc(LMEM_FIXED, 36); + if (!tu_buf) { - LocalFree ( domain_name ); - domain_name = LocalAlloc ( LMEM_FIXED, dn_len * sizeof(WCHAR) ); - if ( !domain_name ) - { - LocalFree ( tu_buf ); - SetLastError ( ERROR_NOT_ENOUGH_MEMORY ); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + CloseHandle(hToken); return FALSE; - } } - an_len = *lpSize; - if ( !LookupAccountSidW ( NULL, token_user->User.Sid, lpszName, &an_len, domain_name, &dn_len, &snu ) ) - { - /* don't call SetLastError(), - as LookupAccountSid() ought to have set one */ - LocalFree ( domain_name ); - LocalFree ( tu_buf ); - *lpSize = an_len; - return FALSE; - } - } - LocalFree ( domain_name ); - LocalFree ( tu_buf ); - *lpSize = an_len + 1; - return TRUE; + if (!GetTokenInformation(hToken, TokenUser, tu_buf, 36, &tu_len) || tu_len > 36) + { + LocalFree(tu_buf); + tu_buf = LocalAlloc(LMEM_FIXED, tu_len); + if (!tu_buf) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + CloseHandle(hToken); + return FALSE; + } + + if (!GetTokenInformation(hToken, TokenUser, tu_buf, tu_len, &tu_len)) + { + /* don't call SetLastError(), + as GetTokenInformation() ought to have set one */ + LocalFree(tu_buf); + CloseHandle(hToken); + return FALSE; + } + } + + CloseHandle(hToken); + token_user = (TOKEN_USER*)tu_buf; + + an_len = *lpSize; + dn_len = 32; + domain_name = LocalAlloc(LMEM_FIXED, dn_len * sizeof(WCHAR)); + if (!domain_name) + { + LocalFree(tu_buf); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + if (!LookupAccountSidW(NULL, token_user->User.Sid, lpszName, &an_len, domain_name, &dn_len, &snu) + || dn_len > 32) + { + if (dn_len > 32) + { + LocalFree(domain_name); + domain_name = LocalAlloc(LMEM_FIXED, dn_len * sizeof(WCHAR)); + if (!domain_name) + { + LocalFree(tu_buf); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + } + + an_len = *lpSize; + if (!LookupAccountSidW(NULL, token_user->User.Sid, lpszName, &an_len, domain_name, &dn_len, &snu)) + { + /* don't call SetLastError(), + as LookupAccountSid() ought to have set one */ + LocalFree(domain_name); + LocalFree(tu_buf); + *lpSize = an_len; + return FALSE; + } + } + + LocalFree(domain_name); + LocalFree(tu_buf); + *lpSize = an_len + 1; + return TRUE; } @@ -905,129 +912,121 @@ LookupAccountSidA(LPCSTR lpSystemName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse) { - UNICODE_STRING NameW, ReferencedDomainNameW, SystemNameW; - LPWSTR NameBuffer = NULL; - LPWSTR ReferencedDomainNameBuffer = NULL; - DWORD dwName, dwReferencedDomainName; - BOOL Ret; + UNICODE_STRING NameW, ReferencedDomainNameW, SystemNameW; + LPWSTR NameBuffer = NULL; + LPWSTR ReferencedDomainNameBuffer = NULL; + DWORD dwName, dwReferencedDomainName; + BOOL Ret; - /* - * save the buffer sizes the caller passed to us, as they may get modified and - * we require the original values when converting back to ansi - */ - dwName = *cchName; - dwReferencedDomainName = *cchReferencedDomainName; - - /* - * allocate buffers for the unicode strings to receive - */ - - if(dwName > 0) - { - NameBuffer = (PWSTR)LocalAlloc(LMEM_FIXED, dwName); - if(NameBuffer == NULL) - { - SetLastError(ERROR_OUTOFMEMORY); - return FALSE; - } - } - else - NameBuffer = NULL; - - if(dwReferencedDomainName > 0) - { - ReferencedDomainNameBuffer = (PWSTR)LocalAlloc(LMEM_FIXED, dwReferencedDomainName); - if(ReferencedDomainNameBuffer == NULL) - { - if(dwName > 0) - { - LocalFree(NameBuffer); - } - SetLastError(ERROR_OUTOFMEMORY); - return FALSE; - } - } - else - ReferencedDomainNameBuffer = NULL; - - /* - * convert the system name to unicode - if present - */ - - if(lpSystemName != NULL) - { - ANSI_STRING SystemNameA; - - RtlInitAnsiString(&SystemNameA, lpSystemName); - RtlAnsiStringToUnicodeString(&SystemNameW, &SystemNameA, TRUE); - } - else - SystemNameW.Buffer = NULL; - - /* - * it's time to call the unicode version - */ - - Ret = LookupAccountSidW(SystemNameW.Buffer, - lpSid, - NameBuffer, - cchName, - ReferencedDomainNameBuffer, - cchReferencedDomainName, - peUse); - if(Ret) - { /* - * convert unicode strings back to ansi, don't forget that we can't convert - * more than 0xFFFF (USHORT) characters! Also don't forget to explicitly - * terminate the converted string, the Rtl functions don't do that! + * save the buffer sizes the caller passed to us, as they may get modified and + * we require the original values when converting back to ansi */ - if(lpName != NULL) + dwName = *cchName; + dwReferencedDomainName = *cchReferencedDomainName; + + /* allocate buffers for the unicode strings to receive */ + if (dwName > 0) { - ANSI_STRING NameA; + NameBuffer = (PWSTR)LocalAlloc(LMEM_FIXED, dwName); + if (NameBuffer == NULL) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + } + else + NameBuffer = NULL; - NameA.Length = 0; - NameA.MaximumLength = ((dwName <= 0xFFFF) ? (USHORT)dwName : 0xFFFF); - NameA.Buffer = lpName; + if (dwReferencedDomainName > 0) + { + ReferencedDomainNameBuffer = (PWSTR)LocalAlloc(LMEM_FIXED, dwReferencedDomainName); + if (ReferencedDomainNameBuffer == NULL) + { + if (dwName > 0) + { + LocalFree(NameBuffer); + } - RtlInitUnicodeString(&NameW, NameBuffer); - RtlUnicodeStringToAnsiString(&NameA, &NameW, FALSE); - NameA.Buffer[NameA.Length] = '\0'; + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + } + else + ReferencedDomainNameBuffer = NULL; + + + /* convert the system name to unicode - if present */ + if (lpSystemName != NULL) + { + ANSI_STRING SystemNameA; + + RtlInitAnsiString(&SystemNameA, lpSystemName); + RtlAnsiStringToUnicodeString(&SystemNameW, &SystemNameA, TRUE); + } + else + SystemNameW.Buffer = NULL; + + /* it's time to call the unicode version */ + Ret = LookupAccountSidW(SystemNameW.Buffer, + lpSid, + NameBuffer, + cchName, + ReferencedDomainNameBuffer, + cchReferencedDomainName, + peUse); + if (Ret) + { + /* + * convert unicode strings back to ansi, don't forget that we can't convert + * more than 0xFFFF (USHORT) characters! Also don't forget to explicitly + * terminate the converted string, the Rtl functions don't do that! + */ + if (lpName != NULL) + { + ANSI_STRING NameA; + + NameA.Length = 0; + NameA.MaximumLength = ((dwName <= 0xFFFF) ? (USHORT)dwName : 0xFFFF); + NameA.Buffer = lpName; + + RtlInitUnicodeString(&NameW, NameBuffer); + RtlUnicodeStringToAnsiString(&NameA, &NameW, FALSE); + NameA.Buffer[NameA.Length] = '\0'; + } + + if (lpReferencedDomainName != NULL) + { + ANSI_STRING ReferencedDomainNameA; + + ReferencedDomainNameA.Length = 0; + ReferencedDomainNameA.MaximumLength = ((dwReferencedDomainName <= 0xFFFF) ? + (USHORT)dwReferencedDomainName : 0xFFFF); + ReferencedDomainNameA.Buffer = lpReferencedDomainName; + + RtlInitUnicodeString(&ReferencedDomainNameW, ReferencedDomainNameBuffer); + RtlUnicodeStringToAnsiString(&ReferencedDomainNameA, &ReferencedDomainNameW, FALSE); + ReferencedDomainNameA.Buffer[ReferencedDomainNameA.Length] = '\0'; + } } - if(lpReferencedDomainName != NULL) + /* free previously allocated buffers */ + if (SystemNameW.Buffer != NULL) { - ANSI_STRING ReferencedDomainNameA; - - ReferencedDomainNameA.Length = 0; - ReferencedDomainNameA.MaximumLength = ((dwReferencedDomainName <= 0xFFFF) ? - (USHORT)dwReferencedDomainName : 0xFFFF); - ReferencedDomainNameA.Buffer = lpReferencedDomainName; - - RtlInitUnicodeString(&ReferencedDomainNameW, ReferencedDomainNameBuffer); - RtlUnicodeStringToAnsiString(&ReferencedDomainNameA, &ReferencedDomainNameW, FALSE); - ReferencedDomainNameA.Buffer[ReferencedDomainNameA.Length] = '\0'; + RtlFreeUnicodeString(&SystemNameW); } - } - /* - * free previously allocated buffers - */ + if (NameBuffer != NULL) + { + LocalFree(NameBuffer); + } - if(SystemNameW.Buffer != NULL) - { - RtlFreeUnicodeString(&SystemNameW); - } - if(NameBuffer != NULL) - { - LocalFree(NameBuffer); - } - if(ReferencedDomainNameBuffer != NULL) - { - LocalFree(ReferencedDomainNameBuffer); - } + if (ReferencedDomainNameBuffer != NULL) + { + LocalFree(ReferencedDomainNameBuffer); + } - return Ret; + return Ret; } @@ -1045,79 +1044,81 @@ LookupAccountSidW(LPCWSTR pSystemName, LPDWORD pdwDomainName, PSID_NAME_USE peUse) { - LSA_UNICODE_STRING SystemName; - LSA_OBJECT_ATTRIBUTES ObjectAttributes = {0}; - LSA_HANDLE PolicyHandle = NULL; - NTSTATUS Status; - PLSA_REFERENCED_DOMAIN_LIST ReferencedDomain = NULL; - PLSA_TRANSLATED_NAME TranslatedName = NULL; - BOOL ret; - DWORD dwAccountName, dwDomainName; + LSA_UNICODE_STRING SystemName; + LSA_OBJECT_ATTRIBUTES ObjectAttributes = {0}; + LSA_HANDLE PolicyHandle = NULL; + NTSTATUS Status; + PLSA_REFERENCED_DOMAIN_LIST ReferencedDomain = NULL; + PLSA_TRANSLATED_NAME TranslatedName = NULL; + BOOL ret; + DWORD dwAccountName, dwDomainName; - RtlInitUnicodeString ( &SystemName, pSystemName ); - Status = LsaOpenPolicy ( &SystemName, &ObjectAttributes, POLICY_LOOKUP_NAMES, &PolicyHandle ); - if ( !NT_SUCCESS(Status) ) - { - SetLastError ( LsaNtStatusToWinError(Status) ); - return FALSE; - } - Status = LsaLookupSids ( PolicyHandle, 1, &pSid, &ReferencedDomain, &TranslatedName ); + RtlInitUnicodeString(&SystemName, pSystemName); + Status = LsaOpenPolicy(&SystemName, &ObjectAttributes, POLICY_LOOKUP_NAMES, &PolicyHandle); + if (!NT_SUCCESS(Status)) + { + SetLastError(LsaNtStatusToWinError(Status)); + return FALSE; + } - LsaClose ( PolicyHandle ); + Status = LsaLookupSids(PolicyHandle, 1, &pSid, &ReferencedDomain, &TranslatedName); - if ( !NT_SUCCESS(Status) || Status == STATUS_SOME_NOT_MAPPED ) - { - SetLastError ( LsaNtStatusToWinError(Status) ); - ret = FALSE; - } - else - { - ret = TRUE; - - dwAccountName = TranslatedName->Name.Length / sizeof(WCHAR); - if (ReferencedDomain && ReferencedDomain->Entries > 0) - dwDomainName = ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR); - else - dwDomainName = 0; - - if (*pdwAccountName <= dwAccountName || *pdwDomainName <= dwDomainName) - { - /* One or two buffers are insufficient, add up a char for NULL termination */ - *pdwAccountName = dwAccountName + 1; - *pdwDomainName = dwDomainName + 1; - ret = FALSE; - } else - { - /* Lengths are sufficient, copy the data */ - if(dwAccountName) - RtlCopyMemory(pAccountName, TranslatedName->Name.Buffer, dwAccountName * sizeof(WCHAR)); - pAccountName[dwAccountName] = L'\0'; - - if(dwDomainName) - RtlCopyMemory(pDomainName, ReferencedDomain->Domains[0].Name.Buffer, dwDomainName * sizeof(WCHAR)); - pDomainName[dwDomainName] = L'\0'; + LsaClose(PolicyHandle); - *pdwAccountName = dwAccountName; - *pdwDomainName = dwDomainName; + if (!NT_SUCCESS(Status) || Status == STATUS_SOME_NOT_MAPPED) + { + SetLastError(LsaNtStatusToWinError(Status)); + ret = FALSE; + } + else + { + ret = TRUE; - if (peUse) - *peUse = TranslatedName->Use; - } - - if ( !ret ) - SetLastError(ERROR_INSUFFICIENT_BUFFER); - } + dwAccountName = TranslatedName->Name.Length / sizeof(WCHAR); + if (ReferencedDomain && ReferencedDomain->Entries > 0) + dwDomainName = ReferencedDomain->Domains[0].Name.Length / sizeof(WCHAR); + else + dwDomainName = 0; - if ( ReferencedDomain ) - LsaFreeMemory ( ReferencedDomain ); - if ( TranslatedName ) - LsaFreeMemory ( TranslatedName ); + if (*pdwAccountName <= dwAccountName || *pdwDomainName <= dwDomainName) + { + /* One or two buffers are insufficient, add up a char for NULL termination */ + *pdwAccountName = dwAccountName + 1; + *pdwDomainName = dwDomainName + 1; + ret = FALSE; + } + else + { + /* Lengths are sufficient, copy the data */ + if (dwAccountName) + RtlCopyMemory(pAccountName, TranslatedName->Name.Buffer, dwAccountName * sizeof(WCHAR)); + pAccountName[dwAccountName] = L'\0'; - return ret; + if (dwDomainName) + RtlCopyMemory(pDomainName, ReferencedDomain->Domains[0].Name.Buffer, dwDomainName * sizeof(WCHAR)); + pDomainName[dwDomainName] = L'\0'; + + *pdwAccountName = dwAccountName; + *pdwDomainName = dwDomainName; + + if (peUse) + *peUse = TranslatedName->Use; + } + + if (!ret) + SetLastError(ERROR_INSUFFICIENT_BUFFER); + } + + if (ReferencedDomain) + LsaFreeMemory(ReferencedDomain); + + if (TranslatedName) + LsaFreeMemory(TranslatedName); + + return ret; } - /****************************************************************************** * LookupAccountNameA [ADVAPI32.@] * @@ -1301,8 +1302,8 @@ LookupPrivilegeValueA(LPCSTR lpSystemName, RtlCreateUnicodeStringFromAsciiz(&SystemName, (LPSTR)lpSystemName); } - else - SystemName.Buffer = NULL; + else + SystemName.Buffer = NULL; /* Check the privilege name is not NULL */ if (lpName == NULL) From 6e137a3c50d5ac5a6195e8c54c3941e3fd7ffff1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 20 Jul 2010 21:29:48 +0000 Subject: [PATCH 02/82] [BZIP2] - remove hal from libs - convert to spec svn path=/trunk/; revision=48148 --- reactos/lib/3rdparty/bzip2/bzip2.rbuild | 3 +-- reactos/lib/3rdparty/bzip2/unbzip2.def | 4 ---- reactos/lib/3rdparty/bzip2/unbzip2.spec | 1 + 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 reactos/lib/3rdparty/bzip2/unbzip2.def create mode 100644 reactos/lib/3rdparty/bzip2/unbzip2.spec diff --git a/reactos/lib/3rdparty/bzip2/bzip2.rbuild b/reactos/lib/3rdparty/bzip2/bzip2.rbuild index f161228aa47..f58e45dee12 100644 --- a/reactos/lib/3rdparty/bzip2/bzip2.rbuild +++ b/reactos/lib/3rdparty/bzip2/bzip2.rbuild @@ -1,11 +1,10 @@ - + ntoskrnl - hal bzlib.c randtable.c crctable.c diff --git a/reactos/lib/3rdparty/bzip2/unbzip2.def b/reactos/lib/3rdparty/bzip2/unbzip2.def deleted file mode 100644 index 181a120518a..00000000000 --- a/reactos/lib/3rdparty/bzip2/unbzip2.def +++ /dev/null @@ -1,4 +0,0 @@ -LIBRARY unbzip2.dll - -EXPORTS -BZ2_bzBuffToBuffDecompress@24 diff --git a/reactos/lib/3rdparty/bzip2/unbzip2.spec b/reactos/lib/3rdparty/bzip2/unbzip2.spec new file mode 100644 index 00000000000..68d5d870a4b --- /dev/null +++ b/reactos/lib/3rdparty/bzip2/unbzip2.spec @@ -0,0 +1 @@ + @ stdcall BZ2_bzBuffToBuffDecompress(str ptr str long long long) From d7e775596d53963b422243e0ee60db1cfb54d967 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 20 Jul 2010 21:38:58 +0000 Subject: [PATCH 03/82] [FREELDR] - Unify rbuild rule for freeldr, except for ppc, which uses elfexecutable svn path=/trunk/; revision=48149 --- reactos/boot/freeldr/freeldr.rbuild | 16 +++ reactos/boot/freeldr/freeldr/freeldr.rbuild | 116 ++++++------------- reactos/boot/freeldr/freeldr/setupldr.rbuild | 9 +- 3 files changed, 51 insertions(+), 90 deletions(-) diff --git a/reactos/boot/freeldr/freeldr.rbuild b/reactos/boot/freeldr/freeldr.rbuild index 4f4763917aa..0a8b674d38e 100644 --- a/reactos/boot/freeldr/freeldr.rbuild +++ b/reactos/boot/freeldr/freeldr.rbuild @@ -1,6 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/reactos/boot/freeldr/freeldr/freeldr.rbuild b/reactos/boot/freeldr/freeldr/freeldr.rbuild index 70974fda396..8e70ac92fd8 100644 --- a/reactos/boot/freeldr/freeldr/freeldr.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr.rbuild @@ -1,86 +1,36 @@ - - - - - - - - - freeldr_$(ARCH).lnk - - freeldr_startup - freeldr_base64k - freeldr_base - mini_hal - freeldr_arch - freeldr_main - rossym - cmlib - rtl - libcntpr - - - -nostartfiles - - - - - - - freeldr_arch - freeldr_startup - freeldr_base64k - freeldr_base - freeldr_main - rossym - cmlib - rtl - libcntpr - - -static - -lgcc - - -Wl,--image-base=0x80FFF000 - - - -Wl,--image-base=0x0001F000 - - - - - - - freeldr_startup - freeldr_base64k - freeldr_base - freeldr_arch - freeldr_main - rossym - cmlib - rtl - libcntpr - ppcmmu - - - - - - freeldr_startup - freeldr_base64k - freeldr_base - freeldr_arch - freeldr_main - rossym - cmlib - rtl - libcntpr - - -static - -lgcc - - - - + + + freeldr_startup + freeldr_base64k + freeldr_base + freeldr_arch + freeldr_main + rossym + cmlib + rtl + libcntpr + ppcmmu + + + + + + freeldr_$(ARCH).lnk + + freeldr_startup + freeldr_base64k + freeldr_base + + mini_hal + + freeldr_arch + freeldr_main + rossym + cmlib + rtl + libcntpr + + diff --git a/reactos/boot/freeldr/freeldr/setupldr.rbuild b/reactos/boot/freeldr/freeldr/setupldr.rbuild index f8c62169b29..6d1c25e550d 100644 --- a/reactos/boot/freeldr/freeldr/setupldr.rbuild +++ b/reactos/boot/freeldr/freeldr/setupldr.rbuild @@ -1,6 +1,7 @@ - + + freeldr_startup @@ -15,10 +16,4 @@ cmlib rtl libcntpr - - - - - -Tbss 0x50000 - From 0711c75539a5c65706e14c747441fd5baf833d75 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 00:26:51 +0000 Subject: [PATCH 04/82] [CRT] - Add amd64 versions of setjmp / longjmp - Add amd64 versions of chkstk_asm.s, seh.s to libcntpr svn path=/trunk/; revision=48151 --- reactos/lib/sdk/crt/crt.rbuild | 5 + reactos/lib/sdk/crt/libcntpr.rbuild | 11 ++ reactos/lib/sdk/crt/setjmp/amd64/setjmp.s | 158 ++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 reactos/lib/sdk/crt/setjmp/amd64/setjmp.s diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild index 9821329f510..51006122366 100644 --- a/reactos/lib/sdk/crt/crt.rbuild +++ b/reactos/lib/sdk/crt/crt.rbuild @@ -292,6 +292,11 @@ setjmp.s + + + setjmp.s + + signal.c diff --git a/reactos/lib/sdk/crt/libcntpr.rbuild b/reactos/lib/sdk/crt/libcntpr.rbuild index 6156fe08242..198bdf56bad 100644 --- a/reactos/lib/sdk/crt/libcntpr.rbuild +++ b/reactos/lib/sdk/crt/libcntpr.rbuild @@ -19,6 +19,12 @@ seh.s + + + chkstk_asm.s + seh.s + + chkstk_asm.s @@ -90,6 +96,11 @@ setjmp.s + + + setjmp.s + + diff --git a/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s b/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s new file mode 100644 index 00000000000..56459ae7665 --- /dev/null +++ b/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s @@ -0,0 +1,158 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Implementation of _setjmp/longjmp + * FILE: lib/sdk/crt/setjmp/amd64/setjmp.s + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +#define JUMP_BUFFER_Frame 0x00 +#define JUMP_BUFFER_Rbx 0x08 +#define JUMP_BUFFER_Rsp 0x10 +#define JUMP_BUFFER_Rbp 0x18 +#define JUMP_BUFFER_Rsi 0x20 +#define JUMP_BUFFER_Rdi 0x28 +#define JUMP_BUFFER_R12 0x30 +#define JUMP_BUFFER_R13 0x38 +#define JUMP_BUFFER_R14 0x40 +#define JUMP_BUFFER_R15 0x48 +#define JUMP_BUFFER_Rip 0x50 +#define JUMP_BUFFER_Spare 0x58 +#define JUMP_BUFFER_Xmm6 0x60 +#define JUMP_BUFFER_Xmm7 0x70 +#define JUMP_BUFFER_Xmm8 0x80 +#define JUMP_BUFFER_Xmm9 0x90 +#define JUMP_BUFFER_Xmm10 0xa0 +#define JUMP_BUFFER_Xmm11 0xb0 +#define JUMP_BUFFER_Xmm12 0xc0 +#define JUMP_BUFFER_Xmm13 0xd0 +#define JUMP_BUFFER_Xmm14 0xe0 +#define JUMP_BUFFER_Xmm15 0xf0 + + +/* FUNCTIONS ******************************************************************/ + +/* + * int _setjmp(jmp_buf env); + * + * Parameters: - jmp_buf env + * Returns: 0 + * Notes: Sets up the jmp_buf + */ +PUBLIC _setjmp +.proc _setjmp + /* Load rsp as it was before the call into rax */ + lea rax, [rsp + 8] + /* Load return address into r8 */ + mov r8, [rsp] + mov qword ptr [rcx + JUMP_BUFFER_Frame], 0 + mov [rcx + JUMP_BUFFER_Rbx], rbx + mov [rcx + JUMP_BUFFER_Rbp], rbp + mov [rcx + JUMP_BUFFER_Rsi], rsi + mov [rcx + JUMP_BUFFER_Rdi], rdi + mov [rcx + JUMP_BUFFER_R12], r12 + mov [rcx + JUMP_BUFFER_R13], r13 + mov [rcx + JUMP_BUFFER_R14], r14 + mov [rcx + JUMP_BUFFER_R15], r15 + mov [rcx + JUMP_BUFFER_Rsp], rax + mov [rcx + JUMP_BUFFER_Rip], r8 + movdqa [rcx + JUMP_BUFFER_Xmm6], xmm6 + movdqa [rcx + JUMP_BUFFER_Xmm7], xmm7 + movdqa [rcx + JUMP_BUFFER_Xmm8], xmm8 + movdqa [rcx + JUMP_BUFFER_Xmm9], xmm9 + movdqa [rcx + JUMP_BUFFER_Xmm10], xmm10 + movdqa [rcx + JUMP_BUFFER_Xmm11], xmm11 + movdqa [rcx + JUMP_BUFFER_Xmm12], xmm12 + movdqa [rcx + JUMP_BUFFER_Xmm13], xmm13 + movdqa [rcx + JUMP_BUFFER_Xmm14], xmm14 + movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 + xor rax, rax + ret +.endp setjmp + +/* + * int _setjmpex(jmp_buf _Buf,void *_Ctx); + * + * Parameters: - jmp_buf env + * - frame + * Returns: 0 + * Notes: Sets up the jmp_buf + */ +PUBLIC _setjmpex +.proc _setjmpex + /* Load rsp as it was before the call into rax */ + lea rax, [rsp + 8] + /* Load return address into r8 */ + mov r8, [rsp] + mov [rcx + JUMP_BUFFER_Frame], rdx + mov [rcx + JUMP_BUFFER_Rbx], rbx + mov [rcx + JUMP_BUFFER_Rbp], rbp + mov [rcx + JUMP_BUFFER_Rsi], rsi + mov [rcx + JUMP_BUFFER_Rdi], rdi + mov [rcx + JUMP_BUFFER_R12], r12 + mov [rcx + JUMP_BUFFER_R13], r13 + mov [rcx + JUMP_BUFFER_R14], r14 + mov [rcx + JUMP_BUFFER_R15], r15 + mov [rcx + JUMP_BUFFER_Rsp], rax + mov [rcx + JUMP_BUFFER_Rip], r8 + movdqa [rcx + JUMP_BUFFER_Xmm6], xmm6 + movdqa [rcx + JUMP_BUFFER_Xmm7], xmm7 + movdqa [rcx + JUMP_BUFFER_Xmm8], xmm8 + movdqa [rcx + JUMP_BUFFER_Xmm9], xmm9 + movdqa [rcx + JUMP_BUFFER_Xmm10], xmm10 + movdqa [rcx + JUMP_BUFFER_Xmm11], xmm11 + movdqa [rcx + JUMP_BUFFER_Xmm12], xmm12 + movdqa [rcx + JUMP_BUFFER_Xmm13], xmm13 + movdqa [rcx + JUMP_BUFFER_Xmm14], xmm14 + movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 + xor rax, rax + ret +.endp setjmpex + + +/* + * void longjmp(jmp_buf env, int value); + * + * Parameters: - jmp_buf setup by _setjmp + * - int value to return + * Returns: Doesn't return + * Notes: Non-local goto + */ +PUBLIC longjmp +.proc longjmp + + // FIXME: handle frame + + mov rbx, [rcx + JUMP_BUFFER_Rbx] + mov rbp, [rcx + JUMP_BUFFER_Rbp] + mov rsi, [rcx + JUMP_BUFFER_Rsi] + mov rdi, [rcx + JUMP_BUFFER_Rdi] + mov r12, [rcx + JUMP_BUFFER_R12] + mov r13, [rcx + JUMP_BUFFER_R13] + mov r14, [rcx + JUMP_BUFFER_R14] + mov r15, [rcx + JUMP_BUFFER_R15] + mov rsp, [rcx + JUMP_BUFFER_Rsp] + mov r8, [rcx + JUMP_BUFFER_Rip] + movdqa xmm6, [rcx + JUMP_BUFFER_Xmm6] + movdqa xmm7, [rcx + JUMP_BUFFER_Xmm7] + movdqa xmm8, [rcx + JUMP_BUFFER_Xmm8] + movdqa xmm9, [rcx + JUMP_BUFFER_Xmm9] + movdqa xmm10, [rcx + JUMP_BUFFER_Xmm10] + movdqa xmm11, [rcx + JUMP_BUFFER_Xmm11] + movdqa xmm12, [rcx + JUMP_BUFFER_Xmm12] + movdqa xmm13, [rcx + JUMP_BUFFER_Xmm13] + movdqa xmm14, [rcx + JUMP_BUFFER_Xmm14] + movdqa xmm15, [rcx + JUMP_BUFFER_Xmm15] + + /* return param2 or 1 if it was 0 */ + mov rax, rdx + test rax, rax + jnz 2f + inc rax +2: jmp r8 +.endp longjmp From d7f170a4eec53e4fb3e0a8f82992af4da644d9b9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 00:31:14 +0000 Subject: [PATCH 05/82] [setjmp.h] Add mingw_getsp as inline function svn path=/trunk/; revision=48152 --- reactos/include/crt/setjmp.h | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/reactos/include/crt/setjmp.h b/reactos/include/crt/setjmp.h index 731640b17ac..ecfeb82817a 100644 --- a/reactos/include/crt/setjmp.h +++ b/reactos/include/crt/setjmp.h @@ -32,7 +32,9 @@ extern "C" { unsigned long UnwindFunc; unsigned long UnwindData[6]; } _JUMP_BUFFER; + #elif defined(__ia64__) + typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 { __MINGW_EXTENSION __int64 LowPart; __MINGW_EXTENSION __int64 HighPart; @@ -92,7 +94,9 @@ extern "C" { __MINGW_EXTENSION __int64 Preds; } _JUMP_BUFFER; + #elif defined(__x86_64) + typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 { __MINGW_EXTENSION unsigned __int64 Part[2]; } SETJMP_FLOAT128; @@ -124,13 +128,34 @@ extern "C" { SETJMP_FLOAT128 Xmm14; SETJMP_FLOAT128 Xmm15; } _JUMP_BUFFER; + #endif + #ifndef _JMP_BUF_DEFINED typedef _JBTYPE jmp_buf[_JBLEN]; #define _JMP_BUF_DEFINED #endif - void * __cdecl __MINGW_NOTHROW mingw_getsp(void); +static inline __attribute__((always_inline)) void * mingw_getsp(void) +{ + void *value; +#if defined(__x86_64) +#ifdef _MSC_VER + __asm {mov value, rsp} +#else + __asm__ __volatile__("movq %%rsp, %[value]" : [value] "=r" (value) ); +#endif +#elif defined(_X86_) +#ifdef _MSC_VER + __asm {mov value, esp} +#else + __asm__ __volatile__("movql %%esp, %[value]" : [value] "=r" (value) ); +#endif +#else + #error mingw_getsp unimplemented +#endif + return value; +} #ifdef USE_MINGW_SETJMP_TWO_ARGS #ifndef _INC_SETJMPEX From 0bb23409ed493a497c7ca2c52d539008aadc0749 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 01:07:19 +0000 Subject: [PATCH 06/82] [ATAPI] Link to libcntpr to resolve memmove svn path=/trunk/; revision=48153 --- reactos/drivers/storage/ide/atapi/atapi.rbuild | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/drivers/storage/ide/atapi/atapi.rbuild b/reactos/drivers/storage/ide/atapi/atapi.rbuild index 2f6b428acdd..032a5b71602 100644 --- a/reactos/drivers/storage/ide/atapi/atapi.rbuild +++ b/reactos/drivers/storage/ide/atapi/atapi.rbuild @@ -4,6 +4,7 @@ . scsiport + libcntpr atapi.c atapi.rc From 0b2826db83f8cbb0937b456a22857a6a31fb52ac Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 02:04:49 +0000 Subject: [PATCH 07/82] [MINGW] link mingw_common to oldnames and ntdll svn path=/trunk/; revision=48154 --- reactos/lib/3rdparty/mingw/mingw.rbuild | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/lib/3rdparty/mingw/mingw.rbuild b/reactos/lib/3rdparty/mingw/mingw.rbuild index 5d1fb5ba32e..b85147376de 100644 --- a/reactos/lib/3rdparty/mingw/mingw.rbuild +++ b/reactos/lib/3rdparty/mingw/mingw.rbuild @@ -2,6 +2,8 @@ + oldnames + ntdll From 240c411b7d1da2961dcae1afb7c94da26bc81d50 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 02:52:37 +0000 Subject: [PATCH 08/82] [RSYM64] Silence annoying error messages svn path=/trunk/; revision=48155 --- reactos/tools/rsym/rsym64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/tools/rsym/rsym64.c b/reactos/tools/rsym/rsym64.c index e078e651bf6..aba6e2b6197 100644 --- a/reactos/tools/rsym/rsym64.c +++ b/reactos/tools/rsym/rsym64.c @@ -851,7 +851,7 @@ ParsePEHeaders(PFILE_INFO File) if (File->eh_frame.idx == -1) { - fprintf(stderr, "No .eh_frame section found\n"); + //fprintf(stderr, "No .eh_frame section found\n"); return 0; } From 398f20dacd37754f0946f690b87ef214a1dbea2c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 02:53:24 +0000 Subject: [PATCH 09/82] [NTDLL] Add _setjmp, _setjmpex and longjmp exports on amd64 svn path=/trunk/; revision=48156 --- reactos/dll/ntdll/def/ntdll.pspec | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/dll/ntdll/def/ntdll.pspec b/reactos/dll/ntdll/def/ntdll.pspec index 910f7ec8a25..e8a703cc9de 100644 --- a/reactos/dll/ntdll/def/ntdll.pspec +++ b/reactos/dll/ntdll/def/ntdll.pspec @@ -1319,6 +1319,8 @@ @ cdecl _ltow(long ptr long) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) +@ cdecl -arch=x86_64 _setjmp(ptr ptr) +@ cdecl -arch=x86_64 _setjmpex(ptr ptr) @ varargs _snprintf(ptr long str) @ varargs _snwprintf(ptr long wstr) @ cdecl _splitpath(str ptr ptr ptr ptr) @@ -1371,6 +1373,7 @@ @ cdecl isxdigit(long) @ cdecl labs(long) @ cdecl -arch=i386,x86_64 log(double) +@ cdecl -arch=x86_64 longjmp(ptr) @ cdecl mbstowcs(ptr str long) @ cdecl memchr(ptr long long) @ cdecl memcmp(ptr ptr long) From 147a7b6fc96a3e865afdd338e36432a482e8534a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 02:55:59 +0000 Subject: [PATCH 10/82] [stdlib.h] - Improve definition of __mb_cur_max and related - properly handle _M_CEE_PURE svn path=/trunk/; revision=48157 --- reactos/include/crt/stdlib.h | 194 ++++++++++++----------------------- 1 file changed, 64 insertions(+), 130 deletions(-) diff --git a/reactos/include/crt/stdlib.h b/reactos/include/crt/stdlib.h index 0efd5cc4321..cf40425ff29 100644 --- a/reactos/include/crt/stdlib.h +++ b/reactos/include/crt/stdlib.h @@ -92,22 +92,15 @@ extern "C" { #ifndef MB_CUR_MAX #define MB_CUR_MAX ___mb_cur_max_func() -#ifndef __mb_cur_max -#ifdef _MSVCRT_ - extern int __mb_cur_max; -#else -#define __mb_cur_max (*_imp____mb_cur_max) - extern int *_imp____mb_cur_max; -#endif -#endif -#ifdef _MSVCRT_ - extern int __mbcur_max; -#define ___mb_cur_max_func() (__mb_cur_max) -#else - extern int* _imp____mbcur_max; -#define ___mb_cur_max_func() (*_imp____mb_cur_max) -#endif -#endif +#ifdef _M_CEE_PURE + _CRTIMP int* __cdecl __p___mb_cur_max(); + #define __mb_cur_max (*__p___mb_cur_max()) +#else /* !_M_CEE_PURE */ + _CRTIMP extern int __mb_cur_max; +#endif /* !_M_CEE_PURE */ + _CRTIMP int __cdecl ___mb_cur_max_func(void); + _CRTIMP int __cdecl ___mb_cur_max_l_func(_locale_t); +#endif /* !MB_CUR_MAX */ #define __max(a,b) (((a) > (b)) ? (a) : (b)) #define __min(a,b) (((a) < (b)) ? (a) : (b)) @@ -152,7 +145,7 @@ extern "C" { _CRTIMP extern char *_sys_errlist[]; _CRTIMP extern int _sys_nerr; -//#if !defined(__x86_64) +#if defined(_DLL) && defined(_M_IX86) _CRTIMP int *__cdecl __p___argc(void); _CRTIMP char ***__cdecl __p___argv(void); _CRTIMP wchar_t ***__cdecl __p___wargv(void); @@ -160,133 +153,74 @@ extern "C" { _CRTIMP wchar_t ***__cdecl __p__wenviron(void); _CRTIMP char **__cdecl __p__pgmptr(void); _CRTIMP wchar_t **__cdecl __p__wpgmptr(void); -//#endif -#ifndef __argc -#ifdef _MSVCRT_ - extern int __argc; -#else -#define __argc (*_imp____argc) - extern int *_imp____argc; -#endif -#endif -#ifndef __argv -#ifdef _MSVCRT_ - extern char **__argv; -#else -#define __argv (*_imp____argv) - extern char ***_imp____argv; -#endif -#endif -#ifndef __wargv -#ifdef _MSVCRT_ - extern wchar_t **__wargv; -#else -#define __wargv (*_imp____wargv) - extern wchar_t ***_imp____wargv; -#endif #endif -#ifdef _POSIX_ - extern char **environ; -#else -#ifndef _environ -#ifdef _MSVCRT_ - extern char **_environ; -#else -#define _environ (*_imp___environ) - extern char ***_imp___environ; -#endif -#endif +// FIXME: move inside _M_CEE_PURE section + _CRTIMP int *__cdecl __p___argc(); + _CRTIMP char ***__cdecl __p___argv(); + _CRTIMP wchar_t ***__cdecl __p___wargv(); + _CRTIMP char ***__cdecl __p__environ(); + _CRTIMP wchar_t ***__cdecl __p__wenviron(); + _CRTIMP char **__cdecl __p__pgmptr(); + _CRTIMP wchar_t **__cdecl __p__wpgmptr(); -#ifndef _wenviron -#ifdef _MSVCRT_ - extern wchar_t **_wenviron; -#else -#define _wenviron (*_imp___wenviron) - extern wchar_t ***_imp___wenviron; -#endif -#endif -#endif -#ifndef _pgmptr -#ifdef _MSVCRT_ - extern char *_pgmptr; -#else -#define _pgmptr (*_imp___pgmptr) - extern char **_imp___pgmptr; -#endif -#endif +#ifdef _M_CEE_PURE + #define __argv (*__p___argv()) + #define __argc (*__p___argc()) + #define __wargv (*__p___wargv()) + #define _environ (*__p__environ()) + #define _wenviron (*__p__wenviron()) + #define _pgmptr (*__p__pgmptr()) + #define _wpgmptr (*__p__wpgmptr()) +#else /* !_M_CEE_PURE */ + _CRTIMP extern int __argc; + _CRTIMP extern char **__argv; + _CRTIMP extern wchar_t **__wargv; + _CRTIMP extern char **_environ; + _CRTIMP extern wchar_t **_wenviron; + _CRTIMP extern char *_pgmptr; + _CRTIMP extern wchar_t *_wpgmptr; +#endif /* !_M_CEE_PURE */ -#ifndef _wpgmptr -#ifdef _MSVCRT_ - extern wchar_t *_wpgmptr; + _CRTIMP errno_t __cdecl _get_environ(char***); + _CRTIMP errno_t __cdecl _get_wenviron(wchar_t***); + _CRTIMP errno_t __cdecl _get_pgmptr(char **_Value); + _CRTIMP errno_t __cdecl _get_wpgmptr(wchar_t **_Value); + +#ifdef _M_CEE_PURE + _CRTIMP int* __cdecl __p__fmode(); + #define _fmode (*__p__fmode()) #else -#define _wpgmptr (*_imp___wpgmptr) - extern wchar_t **_imp___wpgmptr; -#endif -#endif - errno_t __cdecl _get_pgmptr(char **_Value); - errno_t __cdecl _get_wpgmptr(wchar_t **_Value); -#ifndef _fmode -#ifdef _MSVCRT_ - extern int _fmode; -#else -#define _fmode (*_imp___fmode) - extern int *_imp___fmode; -#endif -#endif + _CRTIMP extern int _fmode; +#endif /* !_M_CEE_PURE */ _CRTIMP errno_t __cdecl _set_fmode(int _Mode); _CRTIMP errno_t __cdecl _get_fmode(int *_PMode); -#ifndef _osplatform -#ifdef _MSVCRT_ - extern unsigned int _osplatform; -#else -#define _osplatform (*_imp___osplatform) - extern unsigned int *_imp___osplatform; -#endif -#endif - -#ifndef _osver -#ifdef _MSVCRT_ - extern unsigned int _osver; -#else -#define _osver (*_imp___osver) - extern unsigned int *_imp___osver; -#endif -#endif - -#ifndef _winver -#ifdef _MSVCRT_ - extern unsigned int _winver; -#else -#define _winver (*_imp___winver) - extern unsigned int *_imp___winver; -#endif -#endif - -#ifndef _winmajor -#ifdef _MSVCRT_ - extern unsigned int _winmajor; -#else -#define _winmajor (*_imp___winmajor) - extern unsigned int *_imp___winmajor; -#endif -#endif - -#ifndef _winminor -#ifdef _MSVCRT_ - extern unsigned int _winminor; -#else -#define _winminor (*_imp___winminor) - extern unsigned int *_imp___winminor; -#endif -#endif +#ifdef _M_CEE_PURE + _CRTIMP unsigned int* __cdecl __p__osplatform(); + _CRTIMP unsigned int* __cdecl __p__osver(); + _CRTIMP unsigned int* __cdecl __p__winver(); + _CRTIMP unsigned int* __cdecl __p__winmajor(); + _CRTIMP unsigned int* __cdecl __p__winminor(); +#define _osplatform (*__p__osplatform()) +#define _osver (*__p__osver()) +#define _winver (*__p__winver()) +#define _winmajor (*__p__winmajor()) +#define _winminor (*__p__winminor()) +#else /* !_M_CEE_PURE */ + _CRTIMP extern unsigned int _osplatform; + _CRTIMP extern unsigned int _osver; + _CRTIMP extern unsigned int _winver; + _CRTIMP extern unsigned int _winmajor; + _CRTIMP extern unsigned int _winminor; +#endif /* !_M_CEE_PURE */ errno_t __cdecl _get_osplatform(unsigned int *_Value); errno_t __cdecl _get_osver(unsigned int *_Value); errno_t __cdecl _get_winver(unsigned int *_Value); errno_t __cdecl _get_winmajor(unsigned int *_Value); errno_t __cdecl _get_winminor(unsigned int *_Value); + #ifndef _countof #ifndef __cplusplus #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) From 8d8f8846234c68c1d1ed2cdd60a0b1e0fb241967 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 03:22:27 +0000 Subject: [PATCH 11/82] [MINGW] Remove broken _fmode declaration svn path=/trunk/; revision=48158 --- reactos/lib/3rdparty/mingw/crtexe.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/lib/3rdparty/mingw/crtexe.c b/reactos/lib/3rdparty/mingw/crtexe.c index ce76fc19321..a677301c9d8 100644 --- a/reactos/lib/3rdparty/mingw/crtexe.c +++ b/reactos/lib/3rdparty/mingw/crtexe.c @@ -46,8 +46,6 @@ __declspec(dllimport) void __setusermatherr(int (__cdecl *)(struct _exception *) extern int * __MINGW_IMP_SYMBOL(_fmode); extern int * __MINGW_IMP_SYMBOL(_commode); -#undef _fmode -extern int _fmode; extern int * __MINGW_IMP_SYMBOL(_commode); #define _commode (* __MINGW_IMP_SYMBOL(_commode)) extern int _dowildcard; From 11a32bcc42940447b78ae263f2f92b207171e06e Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Wed, 21 Jul 2010 12:20:18 +0000 Subject: [PATCH 12/82] [DESK] - Implement theme quick preview. Patch by Katayama Hirofumi. See issue #5525 for more details. svn path=/trunk/; revision=48159 --- reactos/dll/cpl/desk/appearance.c | 8 +- reactos/dll/cpl/desk/draw.c | 200 ++++++++++++++++++++++++++++-- reactos/dll/cpl/desk/preview.c | 12 +- reactos/dll/cpl/desk/theme.c | 12 +- reactos/dll/cpl/desk/theme.h | 2 +- 5 files changed, 209 insertions(+), 25 deletions(-) diff --git a/reactos/dll/cpl/desk/appearance.c b/reactos/dll/cpl/desk/appearance.c index 8e31b40fd51..b55e379577c 100644 --- a/reactos/dll/cpl/desk/appearance.c +++ b/reactos/dll/cpl/desk/appearance.c @@ -36,7 +36,7 @@ AppearancePage_OnInit(HWND hwndDlg) g->hbmpColor[0] = g->hbmpColor[1] = g->hbmpColor[2] = NULL; g->bInitializing = FALSE; - TemplateCount = LoadThemeTemplates(strSelectedStyle); + TemplateCount = LoadThemePresetEntries(strSelectedStyle); hwndCombo = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME); g->ThemeId = -1; @@ -105,7 +105,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) g->ThemeId = -1; /* Customized */ SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); - /* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); */ + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); } break; @@ -119,7 +119,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) g->ThemeId = -1; /* Customized */ SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); - /* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); */ + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); } break; @@ -134,7 +134,7 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { g->Theme = Theme; g->ThemeId = ThemeId; - /* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme); */ + SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme); } } break; diff --git a/reactos/dll/cpl/desk/draw.c b/reactos/dll/cpl/desk/draw.c index 07ff8038fea..ad84bcd42ea 100644 --- a/reactos/dll/cpl/desk/draw.c +++ b/reactos/dll/cpl/desk/draw.c @@ -7,13 +7,11 @@ * PROGRAMMERS: Katayama Hirofumi MZ */ -/* #define NTOS_MODE_USER */ -/* #define WIN32_NO_STATUS */ #include "desk.h" #include "theme.h" #include "draw.h" -/* #include */ -/* #include */ + +#define MENU_BAR_ITEMS_SPACE (12) /******************************************************************************/ @@ -45,6 +43,20 @@ static const signed char RBOuterNormal[] = { -1, COLOR_3DDKSHADOW, COLOR_BTNHIGHLIGHT, -1 }; +static const signed char LTRBOuterMono[] = { + -1, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, + COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, + COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, + COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, +}; + +static const signed char LTRBInnerMono[] = { + -1, -1, -1, -1, + -1, COLOR_WINDOW, COLOR_WINDOW, COLOR_WINDOW, + -1, COLOR_WINDOW, COLOR_WINDOW, COLOR_WINDOW, + -1, COLOR_WINDOW, COLOR_WINDOW, COLOR_WINDOW, +}; + static BOOL MyIntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags, THEME *theme) { @@ -146,6 +158,24 @@ MyIntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags, THEME *theme) LineTo(hdc, InnerRect.right-2, InnerRect.bottom-RBpenplus); } + if (uFlags & BF_ADJUST) + { + int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0) + + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0); + + if(uFlags & BF_LEFT) + InnerRect.left += add; + if(uFlags & BF_RIGHT) + InnerRect.right -= add; + if(uFlags & BF_TOP) + InnerRect.top += add; + if(uFlags & BF_BOTTOM) + InnerRect.bottom -= add; + + if(uFlags & BF_ADJUST) + *rc = InnerRect; + } + /* Cleanup */ SelectObject(hdc, SavePen); MoveToEx(hdc, SavePoint.x, SavePoint.y, NULL); @@ -409,8 +439,69 @@ MyDrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar, THEME *theme) BOOL MyDrawCaptionTemp(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags, THEME *theme) { - /* FIXME */ - return DrawCaptionTemp(hwnd, hdc, rect, hFont, hIcon, str, uFlags); + ULONG Height; + UINT VCenter, Padding; + LONG ButtonWidth; + HBRUSH hbr; + HGDIOBJ hFontOld; + RECT rc; + + Height = theme->Size[SIZE_CAPTION_Y] - 1; + VCenter = (rect->bottom - rect->top) / 2; + Padding = VCenter - (Height / 2); + + ButtonWidth = theme->Size[SIZE_SIZE_X] - 2; + + if (uFlags & DC_GRADIENT) + { + GRADIENT_RECT gcap = {0, 1}; + TRIVERTEX vert[2]; + COLORREF Colors[2]; + + Colors[0] = theme->crColor[((uFlags & DC_ACTIVE) ? + COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION)]; + Colors[1] = theme->crColor[((uFlags & DC_ACTIVE) ? + COLOR_GRADIENTACTIVECAPTION : COLOR_GRADIENTINACTIVECAPTION)]; + + vert[0].x = rect->left; + vert[0].y = rect->top; + vert[0].Red = (WORD)Colors[0]<<8; + vert[0].Green = (WORD)Colors[0] & 0xFF00; + vert[0].Blue = (WORD)(Colors[0]>>8) & 0xFF00; + vert[0].Alpha = 0; + + vert[1].x = rect->right; + vert[1].y = rect->bottom; + vert[1].Red = (WORD)Colors[1]<<8; + vert[1].Green = (WORD)Colors[1] & 0xFF00; + vert[1].Blue = (WORD)(Colors[1]>>8) & 0xFF00; + vert[1].Alpha = 0; + + GradientFill(hdc, vert, 2, &gcap, 1, GRADIENT_FILL_RECT_H); + } + else + { + if (uFlags & DC_ACTIVE) + hbr = CreateSolidBrush(theme->crColor[COLOR_ACTIVECAPTION]); + else + hbr = CreateSolidBrush(theme->crColor[COLOR_INACTIVECAPTION]); + FillRect(hdc, rect, hbr); + DeleteObject(hbr); + } + + hFontOld = SelectObject(hdc, hFont); + SetBkMode(hdc, TRANSPARENT); + if (uFlags & DC_ACTIVE) + SetTextColor(hdc, theme->crColor[COLOR_CAPTIONTEXT]); + else + SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]); + rc.left = rect->left + 2; + rc.top = rect->top; + rc.right = rect->right; + rc.bottom = rect->bottom; + DrawTextW(hdc, str, -1, &rc, DT_SINGLELINE | DT_VCENTER); + SelectObject(hdc, hFontOld); + return TRUE; } /******************************************************************************/ @@ -418,6 +509,99 @@ MyDrawCaptionTemp(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon DWORD MyDrawMenuBarTemp(HWND Wnd, HDC DC, LPRECT Rect, HMENU Menu, HFONT Font, THEME *theme) { - /* FIXME */ - return DrawMenuBarTemp(Wnd, DC, Rect, Menu, Font); + HBRUSH hbr; + HPEN hPen; + HGDIOBJ hPenOld, hFontOld; + BOOL flat_menu; + INT i, bkgnd, x; + RECT rect; + WCHAR Text[128]; + UINT uFormat = DT_CENTER | DT_VCENTER | DT_SINGLELINE; + + flat_menu = theme->bFlatMenus; + + if (flat_menu) + hbr = CreateSolidBrush(theme->crColor[COLOR_MENUBAR]); + else + hbr = CreateSolidBrush(theme->crColor[COLOR_MENU]); + FillRect(DC, Rect, hbr); + DeleteObject(hbr); + + hPen = CreatePen(PS_SOLID, 0, theme->crColor[COLOR_3DFACE]); + hPenOld = SelectObject(DC, hPen); + MoveToEx(DC, Rect->left, Rect->bottom - 1, NULL); + LineTo(DC, Rect->right, Rect->bottom - 1); + SelectObject(DC, hPenOld); + DeleteObject(hPen); + + bkgnd = (flat_menu ? COLOR_MENUBAR : COLOR_MENU); + x = Rect->left; + hFontOld = SelectObject(DC, Font); + for(i = 0; i < 3; i++) + { + GetMenuStringW(Menu, i, Text, 128, MF_BYPOSITION); + + rect.left = x; + rect.top = Rect->top; + DrawTextW(DC, Text, -1, &rect, DT_SINGLELINE | DT_CALCRECT); + + rect.bottom = Rect->bottom; + rect.right += MENU_BAR_ITEMS_SPACE; + x += rect.right - rect.left; + + if (i == 2) + { + if (flat_menu) + { + SetTextColor(DC, theme->crColor[COLOR_HIGHLIGHTTEXT]); + SetBkColor(DC, theme->crColor[COLOR_HIGHLIGHT]); + + InflateRect (&rect, -1, -1); + hbr = CreateSolidBrush(theme->crColor[COLOR_MENUHILIGHT]); + FillRect(DC, &rect, hbr); + DeleteObject(hbr); + + InflateRect (&rect, 1, 1); + hbr = CreateSolidBrush(theme->crColor[COLOR_HIGHLIGHT]); + FrameRect(DC, &rect, hbr); + DeleteObject(hbr); + } + else + { + SetTextColor(DC, theme->crColor[COLOR_MENUTEXT]); + SetBkColor(DC, theme->crColor[COLOR_MENU]); + DrawEdge(DC, &rect, BDR_SUNKENOUTER, BF_RECT); + } + } + else + { + if (i == 1) + SetTextColor(DC, theme->crColor[COLOR_GRAYTEXT]); + else + SetTextColor(DC, theme->crColor[COLOR_MENUTEXT]); + + SetBkColor(DC, theme->crColor[bkgnd]); + hbr = CreateSolidBrush(theme->crColor[bkgnd]); + FillRect(DC, &rect, hbr); + DeleteObject(hbr); + } + + SetBkMode(DC, TRANSPARENT); + + rect.left += MENU_BAR_ITEMS_SPACE / 2; + rect.right -= MENU_BAR_ITEMS_SPACE / 2; + + if (i == 1) + { + ++rect.left; ++rect.top; ++rect.right; ++rect.bottom; + SetTextColor(DC, RGB(0xff, 0xff, 0xff)); + DrawTextW(DC, Text, -1, &rect, uFormat); + --rect.left; --rect.top; --rect.right; --rect.bottom; + SetTextColor(DC, RGB(0x80, 0x80, 0x80)); + } + DrawTextW(DC, Text, -1, &rect, uFormat); + } + SelectObject(DC, hFontOld); + + return TRUE; } diff --git a/reactos/dll/cpl/desk/preview.c b/reactos/dll/cpl/desk/preview.c index 0cda3791dc3..1c35101646d 100644 --- a/reactos/dll/cpl/desk/preview.c +++ b/reactos/dll/cpl/desk/preview.c @@ -263,8 +263,8 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) /* Inactive Window */ MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme); SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]); - DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont, - NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT); + MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont, + NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT, theme); MyDrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2, theme); /* Active Window */ @@ -290,7 +290,7 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) rc.top += 2; SetTextColor(hdc, theme->crColor[COLOR_WINDOWTEXT]); hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont); /* FIXME: client text is not caption text */ - DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT); + DrawText(hdc, pPreviewData->lpWinTxt, -1, &rc, DT_LEFT); SelectObject(hdc, hOldFont); /* Draw the scroll bar */ @@ -307,9 +307,9 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) CopyRect(&rc, &pPreviewData->rcDialogClient); rc.left += 4; rc.top += 2; - SetTextColor(hdc, RGB(0,0,0)); + SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]); hOldFont = SelectObject(hdc, pPreviewData->hMessageFont); - DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT); + DrawText(hdc, pPreviewData->lpMessText, -1, &rc, DT_LEFT); SelectObject(hdc, hOldFont); /* Draw Button */ @@ -317,7 +317,7 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData) CopyRect(&rc, &pPreviewData->rcDialogButton); SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]); hOldFont = SelectObject(hdc, pPreviewData->hMessageFont); - DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE); + DrawText(hdc, pPreviewData->lpButText, -1, &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE); SelectObject(hdc, hOldFont); EndPaint(hwnd, &ps); diff --git a/reactos/dll/cpl/desk/theme.c b/reactos/dll/cpl/desk/theme.c index 0170fabb4fd..511d2f826b4 100644 --- a/reactos/dll/cpl/desk/theme.c +++ b/reactos/dll/cpl/desk/theme.c @@ -10,7 +10,7 @@ #include "desk.h" #include "theme.h" -static BOOL g_TemplateLoaded = FALSE; +static BOOL g_PresetLoaded = FALSE; static INT g_TemplateCount = 0; static INT g_ColorList[NUM_COLORS]; @@ -141,8 +141,8 @@ BOOL LoadThemeFromReg(THEME* theme, INT ThemeId) DWORD dwType, dwLength; BOOL Ret = FALSE; - if (!g_TemplateLoaded) - LoadThemeTemplates(strSelectedStyle); + if (!g_PresetLoaded) + LoadThemePresetEntries(strSelectedStyle); if (ThemeId == -1) return FALSE; @@ -342,7 +342,7 @@ BOOL SaveTheme(THEME* theme, LPCTSTR strLegacyName) return FALSE; } -INT LoadThemeTemplates(LPTSTR pszSelectedStyle) +INT LoadThemePresetEntries(LPTSTR pszSelectedStyle) { HKEY hkNewSchemes, hkScheme, hkSizes, hkSize; FILETIME ftLastWriteTime; @@ -362,7 +362,7 @@ INT LoadThemeTemplates(LPTSTR pszSelectedStyle) RegQueryValueEx(hkNewSchemes, g_SelectedStyle, NULL, &dwType, (LPBYTE)pszSelectedStyle, &dwLength); /* Check if already loaded */ - if (g_TemplateLoaded) + if (g_PresetLoaded) { RegCloseKey(hkNewSchemes); return g_TemplateCount; @@ -406,7 +406,7 @@ INT LoadThemeTemplates(LPTSTR pszSelectedStyle) dwLength = MAX_TEMPLATENAMELENTGH; } RegCloseKey(hkNewSchemes); - g_TemplateLoaded = TRUE; + g_PresetLoaded = TRUE; g_TemplateCount = iTemplateIndex; } return iTemplateIndex; diff --git a/reactos/dll/cpl/desk/theme.h b/reactos/dll/cpl/desk/theme.h index 8a5f856d1f0..3641f0794f8 100644 --- a/reactos/dll/cpl/desk/theme.h +++ b/reactos/dll/cpl/desk/theme.h @@ -86,4 +86,4 @@ VOID LoadCurrentTheme(THEME* theme); BOOL LoadThemeFromReg(THEME* theme, INT ThemeId); VOID ApplyTheme(THEME* theme, INT ThemeId); BOOL SaveTheme(THEME* theme, LPCTSTR strLegacyName); -INT LoadThemeTemplates(LPTSTR pszSelectedStyle); +INT LoadThemePresetEntries(LPTSTR pszSelectedStyle); From 6c98c1057f7f173446566444a481ff9dc7179509 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 15:55:51 +0000 Subject: [PATCH 13/82] [GDIPLUS] On amd64 builds link gdiplus to crt svn path=/trunk/; revision=48160 --- reactos/dll/win32/gdiplus/gdiplus.rbuild | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/dll/win32/gdiplus/gdiplus.rbuild b/reactos/dll/win32/gdiplus/gdiplus.rbuild index d6daa4d7b7b..cc07c8c5d35 100644 --- a/reactos/dll/win32/gdiplus/gdiplus.rbuild +++ b/reactos/dll/win32/gdiplus/gdiplus.rbuild @@ -28,5 +28,8 @@ gdi32 windowscodecs ntdll + + crt + From f0daba18dda902ce3b12ff435878a73153aeff4f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 16:03:44 +0000 Subject: [PATCH 14/82] [CRT] - Add a number of amd64 specific math functions - add generic c versions of cos and sin - Remove leading underscores from amd64 symbols svn path=/trunk/; revision=48161 --- reactos/lib/sdk/crt/crt.rbuild | 32 +++++-- reactos/lib/sdk/crt/except/amd64/chkstk_asm.s | 11 ++- reactos/lib/sdk/crt/except/amd64/seh.s | 2 +- reactos/lib/sdk/crt/libcntpr.rbuild | 21 +++++ reactos/lib/sdk/crt/math/amd64/alldiv.S | 28 ++++++ reactos/lib/sdk/crt/math/amd64/atan.S | 21 +++++ reactos/lib/sdk/crt/math/amd64/atan2.S | 21 +++++ reactos/lib/sdk/crt/math/amd64/ceil.S | 22 +++++ reactos/lib/sdk/crt/math/amd64/ceilf.S | 40 +++++++++ reactos/lib/sdk/crt/math/amd64/exp.S | 22 +++++ reactos/lib/sdk/crt/math/amd64/fabs.S | 22 +++++ reactos/lib/sdk/crt/math/amd64/floor.S | 21 +++++ reactos/lib/sdk/crt/math/amd64/floorf.S | 40 +++++++++ reactos/lib/sdk/crt/math/amd64/fmod.S | 19 ++++ reactos/lib/sdk/crt/math/amd64/fmodf.S | 19 ++++ reactos/lib/sdk/crt/math/amd64/ldexp.S | 19 ++++ reactos/lib/sdk/crt/math/amd64/log.S | 19 ++++ reactos/lib/sdk/crt/math/amd64/log10.S | 20 +++++ reactos/lib/sdk/crt/math/amd64/pow.S | 20 +++++ reactos/lib/sdk/crt/math/amd64/sqrt.S | 19 ++++ reactos/lib/sdk/crt/math/amd64/sqrtf.S | 19 ++++ reactos/lib/sdk/crt/math/amd64/tan.S | 19 ++++ reactos/lib/sdk/crt/math/cos.c | 89 +++++++++++++++++++ reactos/lib/sdk/crt/math/cosf.c | 11 +++ reactos/lib/sdk/crt/math/i386/ceilf.S | 55 ++++++++++++ reactos/lib/sdk/crt/math/i386/floorf.S | 63 +++++++++++++ reactos/lib/sdk/crt/math/i386/fmodf.c | 28 ++++++ reactos/lib/sdk/crt/math/i386/sqrtf.c | 12 +++ reactos/lib/sdk/crt/math/sin.c | 89 +++++++++++++++++++ reactos/lib/sdk/crt/math/sinf.c | 11 +++ 30 files changed, 822 insertions(+), 12 deletions(-) create mode 100644 reactos/lib/sdk/crt/math/amd64/alldiv.S create mode 100644 reactos/lib/sdk/crt/math/amd64/atan.S create mode 100644 reactos/lib/sdk/crt/math/amd64/atan2.S create mode 100644 reactos/lib/sdk/crt/math/amd64/ceil.S create mode 100644 reactos/lib/sdk/crt/math/amd64/ceilf.S create mode 100644 reactos/lib/sdk/crt/math/amd64/exp.S create mode 100644 reactos/lib/sdk/crt/math/amd64/fabs.S create mode 100644 reactos/lib/sdk/crt/math/amd64/floor.S create mode 100644 reactos/lib/sdk/crt/math/amd64/floorf.S create mode 100644 reactos/lib/sdk/crt/math/amd64/fmod.S create mode 100644 reactos/lib/sdk/crt/math/amd64/fmodf.S create mode 100644 reactos/lib/sdk/crt/math/amd64/ldexp.S create mode 100644 reactos/lib/sdk/crt/math/amd64/log.S create mode 100644 reactos/lib/sdk/crt/math/amd64/log10.S create mode 100644 reactos/lib/sdk/crt/math/amd64/pow.S create mode 100644 reactos/lib/sdk/crt/math/amd64/sqrt.S create mode 100644 reactos/lib/sdk/crt/math/amd64/sqrtf.S create mode 100644 reactos/lib/sdk/crt/math/amd64/tan.S create mode 100644 reactos/lib/sdk/crt/math/cos.c create mode 100644 reactos/lib/sdk/crt/math/cosf.c create mode 100644 reactos/lib/sdk/crt/math/i386/ceilf.S create mode 100644 reactos/lib/sdk/crt/math/i386/floorf.S create mode 100644 reactos/lib/sdk/crt/math/i386/fmodf.c create mode 100644 reactos/lib/sdk/crt/math/i386/sqrtf.c create mode 100644 reactos/lib/sdk/crt/math/sin.c create mode 100644 reactos/lib/sdk/crt/math/sinf.c diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild index 51006122366..a8cbc9020ad 100644 --- a/reactos/lib/sdk/crt/crt.rbuild +++ b/reactos/lib/sdk/crt/crt.rbuild @@ -113,6 +113,7 @@ adjust.c asin.c cabs.c + cosf.c cosh.c div.c fdivbug.c @@ -123,6 +124,7 @@ modf.c rand.c s_modf.c + sinf.c sinh.c tanh.c pow_asm.c @@ -141,9 +143,11 @@ aullrem_asm.s aullshr_asm.s ceil_asm.s + ceilf.S cos_asm.s fabs_asm.s floor_asm.s + floorf.S ftol_asm.s log_asm.s log10_asm.s @@ -156,7 +160,9 @@ ci.c exp.c fmod.c + fmodf.c ldexp.c + sqrtf.c - - atan2.c - exp.c - fmod.c - ldexp.c + cos.c + sin.c + + alldiv.S + atan.S + atan2.S + ceil.S + ceilf.S + exp.S + fabs.S + floor.S + floorf.S + fmod.S + fmodf.S + ldexp.S + log.S + log10.S + pow.S + sqrt.S + sqrtf.S + tan.S Left\n"); - DbgPrint("%s", buf); - lh = print_node(ud, node->LeftChild, indent+1); - } - if( node->RightChild != nil ) { - sprintf(buf+i, "--> Right\n"); - DbgPrint("%s", buf); - rh = print_node(ud, node->RightChild, indent+1); - } - if (indent) - { - if (rh < lh - 1 || lh < rh - 1) - { - sprintf(buf+i, "warning: tree is too unbalanced %d vs %d\n", - lh, rh); - DbgPrint("%s", buf); - } - if (rh != lh && node->Balance == BALANCED) - { - sprintf(buf+i, "warning: tree says balanced, but %d vs %d\n", - lh, rh); - DbgPrint("%s", buf); - } - else if (lh <= rh && node->Balance == LEFTHEAVY) - { - sprintf(buf+i, "warning: tree says leftheavy but %d vs %d\n", - lh, rh); - DbgPrint("%s", buf); - } - else if (lh >= rh && node->Balance == RIGHTHEAVY) - { - sprintf(buf+i, "warning: tree says rightheavy but %d vs %d\n", - lh, rh); - DbgPrint("%s", buf); - } - } - if (rh > lh) return 1+rh; - else return 1+lh; - } -} - -void print_tree(udict_t *ud) -{ - DbgPrint("TREE %x (Nil %x)\n", ud, ud->BalancedRoot.Parent); - print_node(ud, &ud->BalancedRoot, 0); -} - -void avl_init(udict_t *ud) -{ - ud->BalancedRoot.left = ud->BalancedRoot.right = - ud->BalancedRoot.parent = (udict_node_t*) - ud->AllocateRoutine(ud, sizeof(udict_node_t)); - ud->BalancedRoot.parent->left = ud->BalancedRoot.parent->right = - ud->BalancedRoot.parent->parent = ud->BalancedRoot.parent; -} - -void avl_deinit(udict_t *ud) -{ - ud->FreeRoutine(ud, ud->BalancedRoot.parent); -} - -static void RotateLeft(udict_node_t **top) -{ - udict_node_t *parent = *top; - udict_node_t *child = parent->right; - - child->parent = parent->parent; - parent->right = child->left; - parent->right->parent = parent; /* may change sentinel.parent */ - child->left = parent; - parent->parent = child; - *top = child; -}/*RotateLeft*/ - -static void RotateRight(udict_node_t **top) -{ - udict_node_t *parent = *top; - udict_node_t *child = parent->left; - - child->parent = parent->parent; - parent->left = child->right; - parent->left->parent = parent; /* may change sentinel.parent */ - child->right = parent; - parent->parent = child; - *top = child; -}/*RotateRight*/ - -static void FixBalance(udict_node_t **pnode, udict_avl_balance_t bal) -{ - udict_node_t *node = *pnode; - udict_node_t *child; - udict_node_t *grandchild; - - if (node->balance == BALANCED) { - node->balance = bal; - }/*if*/ - else if (node->balance != bal) { - node->balance = BALANCED; - }/*elsif*/ - else { - assert (node->balance == bal); - - if (bal == LEFTHEAVY) { - child = node->left; - if (child->balance == LEFTHEAVY) { - node->balance = BALANCED; - child->balance = BALANCED; - RotateRight(pnode); - }/*if*/ - else if (child->balance == BALANCED) { - /* only possible after delete */ - node->balance = LEFTHEAVY; - child->balance = RIGHTHEAVY; - RotateRight(pnode); - }/*elsif*/ - else { - assert (child->balance == RIGHTHEAVY); - - grandchild = child->right; - if (grandchild->balance == LEFTHEAVY) { - node->balance = RIGHTHEAVY; - child->balance = BALANCED; - }/*if*/ - else if (grandchild->balance == RIGHTHEAVY) { - node->balance = BALANCED; - child->balance = LEFTHEAVY; - }/*elsif*/ - else { - node->balance = BALANCED; - child->balance = BALANCED; - }/*else*/ - grandchild->balance = BALANCED; - RotateLeft(&node->left); - RotateRight(pnode); - }/*else*/ - }/*if*/ - else { - assert (bal == RIGHTHEAVY); - - child = node->right; - if (child->balance == RIGHTHEAVY) { - node->balance = BALANCED; - child->balance = BALANCED; - RotateLeft(pnode); - }/*if*/ - else if (child->balance == BALANCED) { - /* only possible after delete */ - node->balance = RIGHTHEAVY; - child->balance = LEFTHEAVY; - RotateLeft(pnode); - }/*elsif*/ - else { - assert (child->balance == LEFTHEAVY); - - grandchild = child->left; - if (grandchild->balance == RIGHTHEAVY) { - node->balance = LEFTHEAVY; - child->balance = BALANCED; - }/*if*/ - else if (grandchild->balance == LEFTHEAVY) { - node->balance = BALANCED; - child->balance = RIGHTHEAVY; - }/*elsif*/ - else { - node->balance = BALANCED; - child->balance = BALANCED; - }/*else*/ - grandchild->balance = BALANCED; - RotateRight(&node->right); - RotateLeft(pnode); - }/*else*/ - }/*else*/ - }/*else*/ -}/*FixBalance*/ - -static int Insert(udict_t *ud, udict_node_t *what, udict_node_t **where, udict_node_t *parent) -{ - udict_node_t *here = *where; - int result; - - if (here == tree_null_priv(ud)) { - *where = what; - what->parent = parent; - return 1; /* higher than before */ - }/*if*/ - else { - result = ud->compare(ud, key(what), key(here)); - - assert (result != GenericEqual); - - if (result == LESS) { - if (Insert(ud, what, &here->left, here)) { - /* - ** now left side is higher than before - */ - FixBalance(where, LEFTHEAVY); - return ((*where)->balance != BALANCED); - }/*if*/ - }/*if*/ - else { - if (Insert(ud, what, &here->right, here)) { - /* - ** now right side is higher than before - */ - FixBalance(where, RIGHTHEAVY); - return ((*where)->balance != BALANCED); - }/*if*/ - }/*else*/ - }/*else*/ - return 0; /* height not changed */ -}/*Insert*/ - -void avl_insert_node(udict_t *ud, udict_node_t *node) -{ - udict_node_t *nil = tree_null_priv(ud); - - node->left = nil; - node->right = nil; - node->balance = BALANCED; - - if (Insert(ud, node, &ud->BalancedRoot.left, nil)) { - nil->balance = LEFTHEAVY; - }/*if*/ - - if (ud->BalancedRoot.left == node) { - node->parent = &ud->BalancedRoot; - ud->BalancedRoot.balance = LEFTHEAVY; - } - - ud->nodecount++; -} - -void avl_delete_node(udict_t *ud, udict_node_t *node) -{ - udict_node_t *nil = tree_null_priv(ud); - udict_node_t *swap; - udict_node_t *child; - udict_node_t *parent; - - udict_tree_delete(ud, node, &swap, &child); - -#ifndef NDEBUG - if (swap == node) { - /* - ** node had 0 or 1 child, - ** child moved up to node's place - */ - if (child != nil) { - assert ((child->left == nil) && (child->right == nil)); - assert (child->balance == BALANCED); - }/*if*/ - }/*if*/ - else { - /* - ** node had 2 children, - ** swap was node's successor (in node's right subtree), - ** swap has been inserted in node's place, - ** child was swap->right, - ** child has been moved to swap's place - */ - if (child != nil) { - assert ((child->left == nil) && (child->right == nil)); - assert (child->balance == BALANCED); - }/*if*/ - }/*else*/ -#endif - swap->balance = node->balance; - - /* - ** In either case, child has been moved to the next higher level. - ** So the balance of its new parent has to be checked. - ** Note, that child->parent points to the node we are interested in, - ** even if child == nil. - */ - - parent = child->parent; - - if (parent == nil) { - /* root has been deleted */ - if (child == nil) { - parent->balance = BALANCED; - ud->BalancedRoot.left = nil; - }/*if*/ - }/*if*/ - - while (parent != &ud->BalancedRoot) { - if ((parent->left == nil) && (parent->right == nil)) { - assert (child == nil); - parent->balance = BALANCED; - /* propagate height reduction to upper level */ - }/*if*/ - else { - udict_node_t **pparent; - if (parent == parent->parent->left) - pparent = &parent->parent->left; - else - pparent = &parent->parent->right; - - if (child == parent->left) { - /* reduce parent's left height */ - FixBalance(pparent, RIGHTHEAVY); - }/*if*/ - else { - assert (child == parent->right); - /* reduce parent's right height */ - FixBalance(pparent, LEFTHEAVY); - }/*else*/ - - /* - ** parent and child are not valid now, - ** pparent may point to new root of subtree - */ - parent = *pparent; - }/*else*/ - - /* if subtree is balanced, then height is less than before */ - if (parent->balance == BALANCED) { - child = parent; - parent = child->parent; - }/*if*/ - else - break; - }/*while*/ -}/*avl_delete_node*/ - -void *avl_get_data(udict_node_t *here) { - return data(here); -} - -int avl_search(udict_t *ud, void *_key, udict_node_t *here, udict_node_t **where) -{ - int result; - - if (avl_is_nil(ud, here)) - return TableInsertAsLeft; - - result = ud->compare(ud, _key, key(here)); - - if (result == EQUAL) { - *where = here; - return TableFoundNode; - } - - if (result == LESS) { - if( here->left == tree_null_priv(ud) ) { - *where = here; - return TableInsertAsLeft; - } - return avl_search(ud, _key, here->left, where); - }/*if*/ - else { - if( here->right == tree_null_priv(ud) ) { - *where = here; - return TableInsertAsRight; - } - return avl_search(ud, _key, here->right, where); - }/*else*/ -} - -int avl_is_nil(udict_t *ud, udict_node_t *node) -{ - return tree_null_priv(ud) == node || - &ud->BalancedRoot == node; -} - -udict_node_t *avl_first(udict_t *ud) -{ - return udict_tree_first(ud); -} - -udict_node_t *avl_last(udict_t *ud) -{ - return udict_tree_last(ud); -} - -udict_node_t *avl_next(udict_t *ud, udict_node_t *prev) -{ - udict_node_t *node = udict_tree_next(ud, prev); - if( node == tree_null_priv(ud) || node == &ud->BalancedRoot ) - return NULL; - else - return node; -} diff --git a/reactos/lib/rtl/austin/avl.h b/reactos/lib/rtl/austin/avl.h deleted file mode 100644 index 575fb44f2e1..00000000000 --- a/reactos/lib/rtl/austin/avl.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS System Libraries - * FILE: lib/rtl/austin/avl.h - * PURPOSE: Run-Time Libary Header (interface to austin AVL tree) - * PROGRAMMER: arty - */ - -#pragma once - -#define avl_data(x) ((void*)(&(x)[1])) - -void avl_init(PRTL_AVL_TABLE table); -void avl_deinit(PRTL_AVL_TABLE table); -void avl_insert_node(PRTL_AVL_TABLE table, PRTL_BALANCED_LINKS node); -void avl_delete_node(PRTL_AVL_TABLE table, PRTL_BALANCED_LINKS node); -int avl_is_nil(PRTL_AVL_TABLE table, PRTL_BALANCED_LINKS node); -PRTL_BALANCED_LINKS avl_first(PRTL_AVL_TABLE table); -PRTL_BALANCED_LINKS avl_last(PRTL_AVL_TABLE table); -PRTL_BALANCED_LINKS avl_next(PRTL_AVL_TABLE table, PRTL_BALANCED_LINKS node); - -int avl_search -(PRTL_AVL_TABLE table, - PVOID _key, - PRTL_BALANCED_LINKS node, - PRTL_BALANCED_LINKS *where); diff --git a/reactos/lib/rtl/austin/macros.h b/reactos/lib/rtl/austin/macros.h deleted file mode 100644 index 2aaade97720..00000000000 --- a/reactos/lib/rtl/austin/macros.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Austin---Astonishing Universal Search Tree Interface Novelty - * Copyright (C) 2000 Kaz Kylheku - * - * Free Software License: - * - * All rights are reserved by the author, with the following exceptions: - * Permission is granted to freely reproduce and distribute this software, - * possibly in exchange for a fee, provided that this copyright notice appears - * intact. Permission is also granted to adapt this software to produce - * derivative works, as long as the modified versions carry this copyright - * notice and additional notices stating that the work has been modified. - * This source code may be translated into executable form and incorporated - * into proprietary software; there is no requirement for such software to - * contain a copyright notice related to this source. - * - * $Id: macros.h,v 1.1 1999/11/26 05:59:49 kaz Exp $ - * $Name: austin_0_2 $ - */ -/* - * Modified for use in ReactOS by arty - */ - -/* - * Macros which give short, convenient internal names to public structure - * members. These members have prefixed names to reduce the possiblity of - * clashes with foreign macros. - */ - -#define left LeftChild -#define right RightChild -#define parent Parent -#define next RightChild -#define prev LeftChild -#define data(x) ((void *)&((x)[1])) -#define key(x) ((void *)&((x)[1])) -#define rb_color udict_rb_color -#define algo_specific udict_algo_specific - -#define optable udict_optable -#define nodecount NumberGenericTableElements -#define maxcount udict_maxcount -#define dupes_allowed udict_dupes_allowed -#define sentinel BalancedRoot -#define compare CompareRoutine -#define nodealloc AllocateRoutine -#define nodefree FreeRoutine -#define context TableContext - -#define assert(x) { if(!(x)) { RtlAssert(#x, __FILE__, __LINE__, NULL); } } - diff --git a/reactos/lib/rtl/austin/tree.c b/reactos/lib/rtl/austin/tree.c deleted file mode 100644 index 57cc5b44f21..00000000000 --- a/reactos/lib/rtl/austin/tree.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Austin---Astonishing Universal Search Tree Interface Novelty - * Copyright (C) 2000 Kaz Kylheku - * - * Free Software License: - * - * All rights are reserved by the author, with the following exceptions: - * Permission is granted to freely reproduce and distribute this software, - * possibly in exchange for a fee, provided that this copyright notice appears - * intact. Permission is also granted to adapt this software to produce - * derivative works, as long as the modified versions carry this copyright - * notice and additional notices stating that the work has been modified. - * This source code may be translated into executable form and incorporated - * into proprietary software; there is no requirement for such software to - * contain a copyright notice related to this source. - * - * $Id: tree.c,v 1.8 1999/12/09 05:38:52 kaz Exp $ - * $Name: austin_0_2 $ - */ -/* - * Modified for use in ReactOS by arty - */ -#include "rtl.h" -#include "udict.h" -#include "tree.h" -#include "macros.h" - -void udict_tree_delete(udict_t *ud, udict_node_t *node, udict_node_t **pswap, udict_node_t **pchild) -{ - udict_node_t *nil = tree_null_priv(ud), *child, *delparent = node->parent; - udict_node_t *next = node, *nextparent; - - if( tree_root_priv(ud) == node ) - delparent = &ud->BalancedRoot; - - if (node->left != nil && node->right != nil) { - next = udict_tree_next(ud, node); - nextparent = next->parent; - - if( tree_root_priv(ud) == next ) - nextparent = &ud->BalancedRoot; - - assert (next != nil); - assert (next->parent != nil); - assert (next->left == nil); - - /* - * First, splice out the successor from the tree completely, by - * moving up its right child into its place. - */ - - child = next->right; - child->parent = nextparent; - - if (nextparent->left == next) { - nextparent->left = child; - } else { - assert (nextparent->right == next); - nextparent->right = child; - } - - /* - * Now that the successor has been extricated from the tree, install it - * in place of the node that we want deleted. - */ - - next->parent = delparent; - next->left = node->left; - next->right = node->right; - next->left->parent = next; - next->right->parent = next; - - if (delparent->left == node) { - delparent->left = next; - } else { - assert (delparent->right == node); - delparent->right = next; - } - - } else { - assert (node != nil); - assert (node->left == nil || node->right == nil); - - child = (node->left != nil) ? node->left : node->right; - child->parent = delparent = node->parent; - - if (node == delparent->left) { - delparent->left = child; - } else { - assert (node == delparent->right); - delparent->right = child; - } - } - - node->parent = nil; - node->right = nil; - node->left = nil; - - ud->nodecount--; - - *pswap = next; - *pchild = child; -} - -udict_node_t *udict_tree_lookup(udict_t *ud, const void *_key) -{ - udict_node_t *root = tree_root_priv(ud); - udict_node_t *nil = tree_null_priv(ud); - int result; - - /* simple binary search adapted for trees that contain duplicate keys */ - - while (root != nil) { - result = ud->compare(ud, (void *)_key, key(root)); - if (result < 0) - root = root->left; - else if (result > 0) - root = root->right; - else { - return root; - } - } - - return 0; -} - -udict_node_t *udict_tree_lower_bound(udict_t *ud, const void *_key) -{ - udict_node_t *root = tree_root_priv(ud); - udict_node_t *nil = tree_null_priv(ud); - udict_node_t *tentative = 0; - - while (root != nil) { - int result = ud->compare(ud, (void *)_key, key(root)); - - if (result > 0) { - root = root->right; - } else if (result < 0) { - tentative = root; - root = root->left; - } else { - return root; - } - } - - return tentative; -} - -udict_node_t *udict_tree_upper_bound(udict_t *ud, const void *_key) -{ - udict_node_t *root = tree_root_priv(ud); - udict_node_t *nil = tree_null_priv(ud); - udict_node_t *tentative = 0; - - while (root != nil) { - int result = ud->compare(ud, (void *)_key, key(root)); - - if (result < 0) { - root = root->left; - } else if (result > 0) { - tentative = root; - root = root->right; - } else { - return root; - } - } - - return tentative; -} - -udict_node_t *udict_tree_first(udict_t *ud) -{ - udict_node_t *nil = tree_null_priv(ud), *root = tree_root_priv(ud), *left; - - if (root != nil) - while ((left = root->left) != nil) - root = left; - - return (root == nil) ? 0 : root; -} - -udict_node_t *udict_tree_last(udict_t *ud) -{ - udict_node_t *nil = tree_null_priv(ud), *root = tree_root_priv(ud), *right; - - if (root != nil) - while ((right = root->right) != nil) - root = right; - - return (root == nil) ? 0 : root; -} - -udict_node_t *udict_tree_next(udict_t *ud, udict_node_t *curr) -{ - udict_node_t *nil = tree_null_priv(ud), *parent, *left; - - if (curr->right != nil) { - curr = curr->right; - while ((left = curr->left) != nil) - curr = left; - return curr; - } - - parent = curr->parent; - - while (parent != nil && curr == parent->right) { - curr = parent; - parent = curr->parent; - } - - return (parent == nil) ? 0 : parent; -} - -udict_node_t *udict_tree_prev(udict_t *ud, udict_node_t *curr) -{ - udict_node_t *nil = tree_null_priv(ud), *parent, *right; - - if (curr->left != nil) { - curr = curr->left; - while ((right = curr->right) != nil) - curr = right; - return curr; - } - - parent = curr->parent; - - while (parent != nil && curr == parent->left) { - curr = parent; - parent = curr->parent; - } - - return (parent == nil) ? 0 : parent; -} - -/* - * Perform a ``left rotation'' adjustment on the tree. The given parent node P - * and its right child C are rearranged so that the P instead becomes the left - * child of C. The left subtree of C is inherited as the new right subtree - * for P. The ordering of the keys within the tree is thus preserved. - */ - -void udict_tree_rotate_left(udict_node_t *child, udict_node_t *parent) -{ - udict_node_t *leftgrandchild, *grandpa; - - assert (parent->right == child); - - child = parent->right; - parent->right = leftgrandchild = child->left; - leftgrandchild->parent = parent; - - child->parent = grandpa = parent->parent; - - if (parent == grandpa->left) { - grandpa->left = child; - } else { - assert (parent == grandpa->right); - grandpa->right = child; - } - - child->left = parent; - parent->parent = child; -} - - -/* - * This operation is the ``mirror'' image of rotate_left. It is - * the same procedure, but with left and right interchanged. - */ - -void udict_tree_rotate_right(udict_node_t *child, udict_node_t *parent) -{ - udict_node_t *rightgrandchild, *grandpa; - - assert (parent->left == child); - - parent->left = rightgrandchild = child->right; - rightgrandchild->parent = parent; - - child->parent = grandpa = parent->parent; - - if (parent == grandpa->right) { - grandpa->right = child; - } else { - assert (parent == grandpa->left); - grandpa->left = child; - } - - child->right = parent; - parent->parent = child; -} - diff --git a/reactos/lib/rtl/austin/tree.h b/reactos/lib/rtl/austin/tree.h deleted file mode 100644 index b729d23da12..00000000000 --- a/reactos/lib/rtl/austin/tree.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Austin---Astonishing Universal Search Tree Interface Novelty - * Copyright (C) 2000 Kaz Kylheku - * - * Free Software License: - * - * All rights are reserved by the author, with the following exceptions: - * Permission is granted to freely reproduce and distribute this software, - * possibly in exchange for a fee, provided that this copyright notice appears - * intact. Permission is also granted to adapt this software to produce - * derivative works, as long as the modified versions carry this copyright - * notice and additional notices stating that the work has been modified. - * This source code may be translated into executable form and incorporated - * into proprietary software; there is no requirement for such software to - * contain a copyright notice related to this source. - * - * $Id: tree.h,v 1.5 1999/12/09 05:38:52 kaz Exp $ - * $Name: austin_0_2 $ - */ -/* - * Modified for use in ReactOS by arty - */ - -void udict_tree_init(udict_t *ud); -void udict_tree_insert(udict_t *ud, udict_node_t *node, const void *key); -void udict_tree_delete(udict_t *, udict_node_t *, udict_node_t **, udict_node_t **); -udict_node_t *udict_tree_lookup(udict_t *, const void *); -udict_node_t *udict_tree_lower_bound(udict_t *, const void *); -udict_node_t *udict_tree_upper_bound(udict_t *, const void *); -udict_node_t *udict_tree_first(udict_t *); -udict_node_t *udict_tree_last(udict_t *); -udict_node_t *udict_tree_next(udict_t *, udict_node_t *); -udict_node_t *udict_tree_prev(udict_t *, udict_node_t *); -void udict_tree_convert_to_list(udict_t *); -void udict_tree_convert_from_list(udict_t *); -void udict_tree_rotate_left(udict_node_t *, udict_node_t *); -void udict_tree_rotate_right(udict_node_t *, udict_node_t *); - -#define tree_root_priv(T) ((T)->BalancedRoot.left) -#define tree_null_priv(L) ((L)->BalancedRoot.parent) -#define TREE_DEPTH_MAX 64 diff --git a/reactos/lib/rtl/austin/udict.h b/reactos/lib/rtl/austin/udict.h deleted file mode 100644 index 47bb56fb704..00000000000 --- a/reactos/lib/rtl/austin/udict.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Austin---Astonishing Universal Search Tree Interface Novelty - * Copyright (C) 2000 Kaz Kylheku - * - * Free Software License: - * - * All rights are reserved by the author, with the following exceptions: - * Permission is granted to freely reproduce and distribute this software, - * possibly in exchange for a fee, provided that this copyright notice appears - * intact. Permission is also granted to adapt this software to produce - * derivative works, as long as the modified versions carry this copyright - * notice and additional notices stating that the work has been modified. - * This source code may be translated into executable form and incorporated - * into proprietary software; there is no requirement for such software to - * contain a copyright notice related to this source. - * - * $Id: udict.h,v 1.6 1999/12/09 07:32:48 kaz Exp $ - * $Name: austin_0_2 $ - */ -/* - * Modified for use in ReactOS by arty - */ - -#pragma once - -#include - -#define WIN32_NO_STATUS -#define _INC_SWPRINTF_INL_ - -#include -#include -#include "avl.h" - -#define UDICT_COUNT_T_MAX ULONG_MAX -typedef unsigned long udict_count_t; - -typedef unsigned int udict_alg_id_t; - -#define UDICT_LIST 0 -#define UDICT_BST 1 -#define UDICT_REDBLACK 2 -#define UDICT_SPLAY 3 -#define UDICT_AVL 4 - -typedef enum { - udict_bst, - udict_list, - udict_other -} udict_algkind_t; - -typedef enum { - udict_red, - udict_black -} udict_rb_color_t; - -typedef enum { - udict_balanced = 0, - udict_leftheavy = 1, - udict_rightheavy = 2 -} udict_avl_balance_t; - -typedef union { - int udict_dummy; - udict_rb_color_t udict_rb_color; - udict_avl_balance_t udict_avl_balance; -} udict_algdata_t; - -typedef struct _RTL_BALANCED_LINKS udict_node_t; - -typedef int (*udict_compare_t)(const void *, const void *); -typedef udict_node_t *(*udict_nodealloc_t)(void *); -typedef void (*udict_nodefree_t)(void *, udict_node_t *); - -typedef struct _RTL_AVL_TABLE udict_t; - -typedef struct udict_operations { - void (*udict_init)(udict_t *); - void (*udict_insert)(udict_t *, udict_node_t *, const void *); - void (*udict_delete)(udict_t *, udict_node_t *); - udict_node_t *(*udict_lookup)(udict_t *, const void *); - udict_node_t *(*udict_lower_bound)(udict_t *, const void *); - udict_node_t *(*udict_upper_bound)(udict_t *, const void *); - udict_node_t *(*udict_first)(udict_t *); - udict_node_t *(*udict_last)(udict_t *); - udict_node_t *(*udict_next)(udict_t *, udict_node_t *); - udict_node_t *(*udict_prev)(udict_t *, udict_node_t *); - void (*udict_convert_to_list)(udict_t *); - void (*udict_convert_from_list)(udict_t *); - udict_algkind_t udict_kind; -} udict_operations_t; - -/* non-virtual dict methods */ -void udict_init(udict_t *, int, udict_count_t, udict_compare_t); -udict_t *udict_create(int, udict_count_t, udict_compare_t); -void udict_destroy(udict_t *); -void udict_convert_to(udict_t *, int); -udict_count_t udict_count(udict_t *); -int udict_isempty(udict_t *); -int udict_isfull(udict_t *); -int udict_alloc_insert(udict_t *, const void *, void *); -void udict_delete_free(udict_t *, udict_node_t *); -void udict_set_allocator(udict_t *, udict_nodealloc_t, udict_nodefree_t, void *); -void udict_allow_dupes(udict_t *); - -/* non-virtual node methods */ -void udict_node_init(udict_node_t *, void *); -udict_node_t *udict_node_create(void *); -void udict_node_destroy(udict_node_t *); -void *udict_node_getdata(udict_node_t *); -void udict_node_setdata(udict_node_t *, void *); -const void *udict_node_getkey(udict_node_t *); - -/* virtual dict method wrappers */ -void udict_insert(udict_t *, udict_node_t *, const void *); -void udict_delete(udict_t *, udict_node_t *); -udict_node_t *udict_lookup(udict_t *, const void *); -udict_node_t *udict_lower_bound(udict_t *, const void *); -udict_node_t *udict_upper_bound(udict_t *, const void *); -udict_node_t *udict_first(udict_t *); -udict_node_t *udict_last(udict_t *); -udict_node_t *udict_next(udict_t *, udict_node_t *); -udict_node_t *udict_prev(udict_t *, udict_node_t *); diff --git a/reactos/lib/rtl/avlsupp.c b/reactos/lib/rtl/avlsupp.c new file mode 100644 index 00000000000..b5546b76cf3 --- /dev/null +++ b/reactos/lib/rtl/avlsupp.c @@ -0,0 +1,295 @@ +/* + * PROJECT: ReactOS Runtime Library + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: lib/rtl/avlsupp.c + * PURPOSE: AVL Tree Internal Support Routines/Main Algorithms + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +/* Internal header for table entries */ +typedef struct _TABLE_ENTRY_HEADER +{ + RTL_BALANCED_LINKS BalancedLinks; + LIST_ENTRY ListEntry; + LONGLONG UserData; +} TABLE_ENTRY_HEADER, *PTABLE_ENTRY_HEADER; + +typedef enum _RTL_AVL_BALANCE_FACTOR +{ + RtlUnbalancedAvlTree = -2, + RtlLeftHeavyAvlTree, + RtlBalancedAvlTree, + RtlRightHeavyAvlTree, +} RTL_AVL_BALANCE_FACTOR; + +C_ASSERT(RtlBalancedAvlTree == 0); + +/* FUNCTIONS ******************************************************************/ + +TABLE_SEARCH_RESULT +FORCEINLINE +RtlpFindAvlTableNodeOrParent(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + OUT PRTL_BALANCED_LINKS *NodeOrParent) +{ + PRTL_BALANCED_LINKS CurrentNode, ChildNode; + RTL_GENERIC_COMPARE_RESULTS Result; + + /* Quick check to see if the table is empty */ + if (!Table->NumberGenericTableElements) return TableEmptyTree; + + /* Set the current node */ + CurrentNode = RtlRightChildAvl(&Table->BalancedRoot); + + /* Start compare loop */ + while (TRUE) + { + /* Compare which side is greater */ + Result = RtlpAvlCompareRoutine(Table, + Buffer, + &((PTABLE_ENTRY_HEADER)CurrentNode)-> + UserData); + if (Result == GenericLessThan) + { + /* We're less, check if this is the left child */ + ChildNode = RtlLeftChildAvl(CurrentNode); + if (ChildNode) + { + /* Continue searching from this node */ + CurrentNode = ChildNode; + } + else + { + /* Otherwise, the element isn't in this tree */ + *NodeOrParent = CurrentNode; + return TableInsertAsLeft; + } + } + else if (Result == GenericGreaterThan) + { + /* We're more, check if this is the right child */ + ChildNode = RtlRightChildAvl(CurrentNode); + if (ChildNode) + { + /* Continue searching from this node */ + CurrentNode = ChildNode; + } + else + { + /* Otherwise, the element isn't in this tree */ + *NodeOrParent = CurrentNode; + return TableInsertAsRight; + } + } + else + { + /* We should've found the node */ + ASSERT(Result == GenericEqual); + + /* Return node found */ + *NodeOrParent = CurrentNode; + return TableFoundNode; + } + } +} + +VOID +FORCEINLINE +RtlPromoteAvlTreeNode(IN PRTL_BALANCED_LINKS Node) +{ + PRTL_BALANCED_LINKS ParentNode, SuperParentNode; + PRTL_BALANCED_LINKS *SwapNode1, *SwapNode2; + + /* Grab parents up to 2 levels high */ + ParentNode = RtlParentAvl(Node); + SuperParentNode = RtlParentAvl(ParentNode); + + /* Pick which nodes will be rotated */ + SwapNode1 = RtlIsLeftChildAvl(Node) ? &ParentNode->LeftChild : &ParentNode->RightChild; + SwapNode2 = RtlIsLeftChildAvl(Node) ? &Node->RightChild : &Node->LeftChild; + + /* Do the rotate, and update the parent and super-parent as needed */ + *SwapNode1 = *SwapNode2; + if (*SwapNode1) RtlSetParent(*SwapNode1, ParentNode); + *SwapNode2 = ParentNode; + RtlSetParent(ParentNode, Node); + + /* Now update the super-parent child link, and make it parent of the node*/ + SwapNode1 = (RtlLeftChildAvl(SuperParentNode) == ParentNode) ? + &SuperParentNode->LeftChild: &SuperParentNode->RightChild; + *SwapNode1 = Node; + RtlSetParent(Node, SuperParentNode); +} + +BOOLEAN +FORCEINLINE +RtlpRebalanceAvlTreeNode(IN PRTL_BALANCED_LINKS Node) +{ + PRTL_BALANCED_LINKS ChildNode, SubChildNode; + CHAR Balance; + ASSERT(RtlParentAvl(Node) != Node); + + /* Get the balance, and figure out which child node to go down on */ + Balance = RtlBalance(Node); + ChildNode = (Balance == RtlRightHeavyAvlTree) ? + RtlRightChildAvl(Node) : RtlLeftChildAvl(Node); + + /* The child and node have the same balance, promote the child upwards */ + if (RtlBalance(ChildNode) == Balance) + { + /* This performs the rotation described in Knuth A8-A10 for Case 1 */ + RtlPromoteAvlTreeNode(ChildNode); + + /* The nodes are now balanced */ + RtlSetBalance(ChildNode, RtlBalancedAvlTree); + RtlSetBalance(Node, RtlBalancedAvlTree); + return FALSE; + } + + /* The child has the opposite balance, a double promotion of the child's child must happen */ + if (RtlBalance(ChildNode) == -Balance) + { + /* Pick which sub-child to use based on the balance */ + SubChildNode = (Balance == RtlRightHeavyAvlTree) ? + RtlLeftChildAvl(ChildNode) : RtlRightChildAvl(ChildNode); + + /* Do the double-rotation described in Knuth A8-A10 for Case 2 */ + RtlPromoteAvlTreeNode(SubChildNode); + RtlPromoteAvlTreeNode(SubChildNode); + + /* Was the sub-child sharing the same balance as the node? */ + if (RtlBalance(SubChildNode) == Balance) + { + /* Then the subchild is now balanced, and the node's weight is inversed */ + RtlSetBalance(ChildNode, RtlBalancedAvlTree); + RtlSetBalance(Node, -Balance); + } + else if (RtlBalance(SubChildNode) == -Balance) + { + /* + * In this case, the sub-child weight was the inverse of the node, so + * the child now shares the node's balance original weight, while the + * node becomes balanced. + */ + RtlSetBalance(ChildNode, Balance); + RtlSetBalance(Node, RtlBalancedAvlTree); + } + else + { + /* + * Otherwise, the sub-child was unbalanced, so both the child and node + * now become balanced. + */ + RtlSetBalance(ChildNode, RtlBalancedAvlTree); + RtlSetBalance(Node, RtlBalancedAvlTree); + } + + /* In all cases, the sub-child is now balanced */ + RtlSetBalance(SubChildNode, RtlBalancedAvlTree); + return FALSE; + } + + /* + * The case that remains is that the child was already balanced, so this is + * This is the rotation required for Case 3 in Knuth A8-A10 + */ + RtlPromoteAvlTreeNode(ChildNode); + + /* Now the child has the opposite weight of the node */ + RtlSetBalance(ChildNode, -Balance); + + /* This only happens on deletion, so we return TRUE to terminate the delete */ + return TRUE; +} + +VOID +FORCEINLINE +RtlpInsertAvlTreeNode(IN PRTL_AVL_TABLE Table, + IN PRTL_BALANCED_LINKS NewNode, + IN OUT PVOID NodeOrParent, + IN OUT TABLE_SEARCH_RESULT SearchResult) +{ + CHAR Balance; + + /* Initialize the new inserted element */ + MI_ASSERT(SearchResult != TableFoundNode); + NewNode->LeftChild = NewNode->RightChild = NULL; + + /* Increase element count */ + Table->NumberGenericTableElements++; + + /* Check where we should insert the entry */ + if (SearchResult == TableEmptyTree) + { + /* This is the new root node */ + RtlInsertAsRightChildAvl(&Table->BalancedRoot, NewNode); + MI_ASSERT(RtlBalance(NewNode) == RtlBalancedAvlTree); + + /* On AVL trees, we also update the depth */ + ASSERT(Table->DepthOfTree == 0); + Table->DepthOfTree = 1; + return; + } + else if (SearchResult == TableInsertAsLeft) + { + /* Insert it left */ + RtlInsertAsLeftChildAvl(NodeOrParent, NewNode); + } + else + { + /* Right node */ + RtlInsertAsRightChildAvl(NodeOrParent, NewNode); + } + + /* Little cheat to save on loop processing, taken from Timo */ + MI_ASSERT(RtlBalance(NewNode) == RtlBalancedAvlTree); + RtlSetBalance(&Table->BalancedRoot, RtlLeftHeavyAvlTree); + + /* + * This implements A6-A7 from Knuth based on http://coding.derkeiler.com + * /pdf/Archive/C_CPP/comp.lang.c/2004-01/1812.pdf, however the algorithm + * is slightly modified to follow the tree based on the Parent Node such + * as the Windows algorithm does it, instead of following the nodes down. + */ + while (TRUE) + { + /* Calculate which side to balance on */ + Balance = RtlIsLeftChildAvl(NewNode) ? RtlLeftHeavyAvlTree : RtlRightHeavyAvlTree; + + /* Check if the parent node was balanced */ + if (RtlBalance(NodeOrParent) == RtlBalancedAvlTree) + { + /* It's not balanced anymore (heavy on one side) */ + RtlSetBalance(NodeOrParent, Balance); + + /* Move up */ + NewNode = NodeOrParent; + NodeOrParent = RtlParentAvl(NodeOrParent); + } + else if (RtlBalance(NodeOrParent) != Balance) + { + /* The parent's balance is opposite, so the tree is balanced now */ + RtlSetBalance(NodeOrParent, RtlBalancedAvlTree); + + /* Check if this is the root (the cheat applied earlier gets us here) */ + if (RtlBalance(&Table->BalancedRoot) == RtlBalancedAvlTree) + { + /* The depth has thus increased */ + Table->DepthOfTree++; + } + + /* We reached the root or a balanced node, so we're done */ + break; + } + else + { + /* The tree is now unbalanced, so AVL rebalancing must happen */ + RtlpRebalanceAvlTreeNode(NodeOrParent); + break; + } + } +} + +/* EOF */ diff --git a/reactos/lib/rtl/avltable.c b/reactos/lib/rtl/avltable.c new file mode 100644 index 00000000000..f85025b6d64 --- /dev/null +++ b/reactos/lib/rtl/avltable.c @@ -0,0 +1,303 @@ +/* +* PROJECT: ReactOS Runtime Library +* LICENSE: BSD - See COPYING.ARM in the top level directory +* FILE: lib/rtl/avltable.c +* PURPOSE: AVL Tree Generic Table Implementation +* PROGRAMMERS: ReactOS Portable Systems Group +*/ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* Include RTL version of AVL support */ +#include "rtlavl.h" +#include "avlsupp.c" + +/* AVL FUNCTIONS *************************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +RtlInitializeGenericTableAvl(IN OUT PRTL_AVL_TABLE Table, + IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + IN PRTL_AVL_FREE_ROUTINE FreeRoutine, + IN PVOID TableContext) +{ + /* Setup the table */ + RtlZeroMemory(Table, sizeof(RTL_AVL_TABLE)); + Table->BalancedRoot.Parent = &Table->BalancedRoot; + Table->CompareRoutine = CompareRoutine; + Table->AllocateRoutine = AllocateRoutine; + Table->FreeRoutine = FreeRoutine; + Table->TableContext = TableContext; +} + +/* + * @implemented + */ +PVOID +NTAPI +RtlInsertElementGenericTableFullAvl(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN ULONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL, + IN OUT PVOID NodeOrParent, + IN OUT TABLE_SEARCH_RESULT SearchResult) +{ + PRTL_BALANCED_LINKS NewNode; + PVOID UserData; + + /* Check if the entry wasn't already found */ + if (SearchResult != TableFoundNode) + { + /* We're doing an allocation, sanity check */ + ASSERT(Table->NumberGenericTableElements != (MAXULONG - 1)); + + /* Allocate a node */ + NewNode = Table->AllocateRoutine(Table, + BufferSize + + FIELD_OFFSET(TABLE_ENTRY_HEADER, + UserData)); + if (!NewNode) + { + /* No memory or other allocation error, fail */ + if (NewElement) *NewElement = FALSE; + return NULL; + } + + /* Data to return to user */ + UserData = &((PTABLE_ENTRY_HEADER)NewNode)->UserData; + + /* Insert the node in the tree */ + RtlpInsertAvlTreeNode(Table, NewNode, NodeOrParent, SearchResult); + + /* Copy user buffer */ + RtlCopyMemory(UserData, Buffer, BufferSize); + } + else + { + /* Return the node we already found */ + NewNode = NodeOrParent; + UserData = &((PTABLE_ENTRY_HEADER)NewNode)->UserData; + } + + /* Return status */ + if (NewElement) *NewElement = (SearchResult == TableFoundNode); + + /* Return pointer to user data */ + return UserData; +} + +/* + * @implemented + */ +PVOID +NTAPI +RtlInsertElementGenericTableAvl(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN ULONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL) +{ + PRTL_BALANCED_LINKS NodeOrParent = NULL; + TABLE_SEARCH_RESULT Result; + + /* Get the balanced links and table search result immediately */ + Result = RtlpFindAvlTableNodeOrParent(Table, Buffer, &NodeOrParent); + + /* Now call the routine to do the full insert */ + return RtlInsertElementGenericTableFullAvl(Table, + Buffer, + BufferSize, + NewElement, + NodeOrParent, + Result); +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +RtlIsGenericTableEmptyAvl(IN PRTL_AVL_TABLE Table) +{ + /* If there's no elements, the table is empty */ + return Table->NumberGenericTableElements == 0; +} + +/* + * @implemented + */ +ULONG +NTAPI +RtlNumberGenericTableElementsAvl(IN PRTL_AVL_TABLE Table) +{ + /* Return the element count */ + return Table->NumberGenericTableElements; +} + +/* + * @implemented + */ +PVOID +NTAPI +RtlLookupElementGenericTableFullAvl(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN OUT PVOID *NodeOrParent, + IN OUT TABLE_SEARCH_RESULT *SearchResult) +{ + /* Find the node */ + *SearchResult = RtlpFindAvlTableNodeOrParent(Table, + Buffer, + (PRTL_BALANCED_LINKS*)NodeOrParent); + if (*SearchResult != TableFoundNode) return NULL; + + /* Node found, return the user data */ + return &((PTABLE_ENTRY_HEADER)*NodeOrParent)->UserData; +} + +/* + * @implemented + */ +PVOID +NTAPI +RtlLookupElementGenericTableAvl(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer) +{ + PRTL_BALANCED_LINKS NodeOrParent; + TABLE_SEARCH_RESULT Lookup; + + /* Call the full function */ + return RtlLookupElementGenericTableFullAvl(Table, + Buffer, + (PVOID*)&NodeOrParent, + &Lookup); +} + +/* + * @implemented + */ +PVOID +NTAPI +RtlEnumerateGenericTableAvl(IN PRTL_AVL_TABLE Table, + IN BOOLEAN Restart) +{ + /* Reset the restart key if needed */ + if (Restart) Table->RestartKey = NULL; + + /* Call the full function */ + return RtlEnumerateGenericTableWithoutSplayingAvl(Table, + (PVOID*)&Table->RestartKey); +} + +/* +* @implemented +*/ +PVOID +NTAPI +RtlLookupFirstMatchingElementGenericTableAvl(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + OUT PVOID *RestartKey) +{ + PRTL_BALANCED_LINKS Node, PreviousNode; + TABLE_SEARCH_RESULT SearchResult; + RTL_GENERIC_COMPARE_RESULTS Result = GenericEqual; + + /* Assume failure */ + *RestartKey = NULL; + + /* Find the node */ + SearchResult = RtlpFindAvlTableNodeOrParent(Table, Buffer, &Node); + if (SearchResult != TableFoundNode) return NULL; + + /* Scan each predecessor until a match is found */ + PreviousNode = Node; + while (Result == GenericEqual) + { + /* Save the node */ + Node = PreviousNode; + + /* Get the predecessor */ + PreviousNode = RtlRealPredecessorAvl(Node); + if ((!PreviousNode) || (RtlParentAvl(PreviousNode) == PreviousNode)) break; + + /* Check if this node matches */ + Result = RtlpAvlCompareRoutine(Table, + Buffer, + &((PTABLE_ENTRY_HEADER)PreviousNode)-> + UserData); + } + + /* Save the node as the restart key, and return its data */ + *RestartKey = Node; + return &((PTABLE_ENTRY_HEADER)Node)->UserData; +} + +/* + * @unimplemented + */ +PVOID +NTAPI +RtlEnumerateGenericTableWithoutSplayingAvl(IN PRTL_AVL_TABLE Table, + IN OUT PVOID *RestartKey) +{ + PRTL_BALANCED_LINKS CurrentNode; + + /* Skip an empty tree */ + if (RtlIsGenericTableEmptyAvl(Table)) return NULL; + + /* Check if we have a starting point */ + if (!*RestartKey) + { + /* We'll have to find it, keep going until the leftmost child */ + for (CurrentNode = RtlRightChildAvl(&Table->BalancedRoot); + RtlLeftChildAvl(CurrentNode); + CurrentNode = RtlLeftChildAvl(CurrentNode)); + + /* Found it */ + *RestartKey = CurrentNode; + } + else + { + /* We already had a child, keep going by getting its successor */ + CurrentNode = RtlRealSuccessorAvl(*RestartKey); + + /* If there was one, update the restart key */ + if (CurrentNode) *RestartKey = CurrentNode; + } + + /* Return the node's data if it was found, otherwise return NULL */ + if (CurrentNode) return &((PTABLE_ENTRY_HEADER)CurrentNode)->UserData; + return NULL; +} + +/* + * @unimplemented + */ +PVOID +NTAPI +RtlGetElementGenericTableAvl(IN PRTL_AVL_TABLE Table, + IN ULONG I) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +RtlDeleteElementGenericTableAvl(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* EOF */ diff --git a/reactos/lib/rtl/generictable.c b/reactos/lib/rtl/generictable.c index 272182d0ba3..dee9cf18190 100644 --- a/reactos/lib/rtl/generictable.c +++ b/reactos/lib/rtl/generictable.c @@ -1,16 +1,14 @@ /* -* PROJECT: ReactOS Kernel +* PROJECT: ReactOS Runtime Library * LICENSE: GPL - See COPYING in the top level directory * FILE: lib/rtl/generictable.c -* PURPOSE: Splay Tree and AVL Tree Generic Table Implementation +* PURPOSE: Splay Tree Generic Table Implementation * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) -* Art Yerks (ayerkes@speakeasy.net) */ /* INCLUDES ******************************************************************/ #include -#include "austin/avl.h" #define NDEBUG #include @@ -508,261 +506,4 @@ RtlGetElementGenericTable(IN PRTL_GENERIC_TABLE Table, ListEntry))->UserData; } -/* AVL FUNCTIONS *************************************************************/ - -/* - * @implemented - */ -PVOID -NTAPI -RtlLookupElementGenericTableFullAvl(IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN OUT PVOID *NodeOrParent, - IN OUT TABLE_SEARCH_RESULT *SearchResult) -{ - PRTL_BALANCED_LINKS OurNodeOrParent; - TABLE_SEARCH_RESULT OurSearchResult; - - if( !Table->NumberGenericTableElements ) - { - *SearchResult = TableEmptyTree; - *NodeOrParent = NULL; - return NULL; - } - - OurSearchResult = avl_search - (Table, Buffer, - Table->BalancedRoot.LeftChild, &OurNodeOrParent); - - if(SearchResult) *SearchResult = OurSearchResult; - if(NodeOrParent) *NodeOrParent = OurNodeOrParent; - - if(OurSearchResult == TableFoundNode) - return avl_data(OurNodeOrParent); - else - return NULL; -} - -/* - * @implemented - */ -PVOID -NTAPI -RtlLookupElementGenericTableAvl(IN PRTL_AVL_TABLE Table, - IN PVOID Buffer) -{ - PRTL_BALANCED_LINKS OurNodeOrParent; - TABLE_SEARCH_RESULT OurSearchResult; - return RtlLookupElementGenericTableFullAvl - (Table, Buffer, (PVOID *)&OurNodeOrParent, &OurSearchResult); -} - -/* - * @implemented - */ -BOOLEAN -NTAPI -RtlDeleteElementGenericTableAvl(IN PRTL_AVL_TABLE Table, - IN PVOID Buffer) -{ - TABLE_SEARCH_RESULT Result; - PRTL_BALANCED_LINKS Node; - - RtlLookupElementGenericTableFullAvl - ( Table, Buffer, (PVOID *)&Node, &Result ); - - if( Result == TableFoundNode ) - { - avl_delete_node(Table, Node); - Table->FreeRoutine(Table, Node); - if( Table->NumberGenericTableElements == 0 ) - avl_deinit(Table); - return TRUE; - } - else - { - return FALSE; - } -} - -/* - * @implemented - */ -PVOID -NTAPI -RtlEnumerateGenericTableAvl(IN PRTL_AVL_TABLE Table, - IN BOOLEAN Restart) -{ - if( Table->NumberGenericTableElements == 0 ) - return NULL; - - if( Restart ) - { - Table->RestartKey = avl_first(Table); - } - else - { - Table->RestartKey = avl_next(Table, Table->RestartKey); - } - if( !Table->RestartKey ) - return NULL; - else - return avl_data(Table->RestartKey); -} - -/* - * @implemented - */ -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplayingAvl(IN PRTL_AVL_TABLE Table, - IN OUT PVOID *RestartKey) -{ - /* FIXME! */ - return NULL; -} - -/* - * @implemented - */ -PVOID -NTAPI -RtlGetElementGenericTableAvl(IN PRTL_AVL_TABLE Table, - IN ULONG I) -{ - PRTL_BALANCED_LINKS Node; - - if( I >= Table->NumberGenericTableElements ) return NULL; - else - { - Node = avl_first(Table); - while(I--) Node = avl_next(Table, Node); - return avl_data(Node); - } -} - -/* - * @implemented - */ -VOID -NTAPI -RtlInitializeGenericTableAvl(IN OUT PRTL_AVL_TABLE Table, - IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - IN PRTL_AVL_FREE_ROUTINE FreeRoutine, - IN PVOID TableContext) -{ - RtlZeroMemory(Table, sizeof(RTL_AVL_TABLE)); - Table->BalancedRoot.Parent = &Table->BalancedRoot; - Table->CompareRoutine = CompareRoutine; - Table->AllocateRoutine = AllocateRoutine; - Table->FreeRoutine = FreeRoutine; - Table->TableContext = TableContext; -} - -/* - * @implemented - */ -PVOID -NTAPI -RtlInsertElementGenericTableFullAvl(IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN ULONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL, - IN OUT PVOID *NodeOrParent, - IN OUT TABLE_SEARCH_RESULT *SearchResult) -{ - PRTL_BALANCED_LINKS OurNodeOrParent; - TABLE_SEARCH_RESULT OurSearchResult; - - if(Table->NumberGenericTableElements == 0) { - avl_init(Table); - } - - if(NewElement) - *NewElement = FALSE; - - OurSearchResult = avl_search - (Table, Buffer, - Table->BalancedRoot.LeftChild, &OurNodeOrParent); - - if(NodeOrParent) *NodeOrParent = OurNodeOrParent; - if(SearchResult) *SearchResult = OurSearchResult; - - if(OurSearchResult == TableFoundNode) - { - RtlDeleteElementGenericTableAvl(Table, Buffer); - return RtlInsertElementGenericTableFullAvl - (Table, Buffer, BufferSize, - NewElement, NodeOrParent, SearchResult); - } - else - { - PRTL_BALANCED_LINKS NewNode = - Table->AllocateRoutine - (Table, - BufferSize + sizeof(RTL_BALANCED_LINKS) + BufferSize); - - if( !NewNode ) return NULL; - - NewNode->Balance = 0; - RtlCopyMemory(avl_data(NewNode), Buffer, BufferSize); - - OurNodeOrParent = NewNode; - - avl_insert_node(Table, NewNode); - return avl_data(NewNode); - } -} - -/* - * @implemented - */ -PVOID -NTAPI -RtlInsertElementGenericTableAvl(IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN ULONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL) -{ - PVOID NodeOrParent; - TABLE_SEARCH_RESULT SearchResult; - - return RtlInsertElementGenericTableFullAvl - (Table, Buffer, BufferSize, NewElement, &NodeOrParent, &SearchResult); -} - -/* - * @implemented - */ -BOOLEAN -NTAPI -RtlIsGenericTableEmptyAvl(PRTL_AVL_TABLE Table) -{ - return Table->NumberGenericTableElements == 0; -} - -/* - * @implemented - */ -ULONG -NTAPI -RtlNumberGenericTableElementsAvl(IN PRTL_AVL_TABLE Table) -{ - return Table->NumberGenericTableElements; -} - -/* -* @unimplemented -*/ -PVOID -NTAPI -RtlLookupFirstMatchingElementGenericTableAvl(IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *RestartKey) -{ - UNIMPLEMENTED; - return NULL; -} - /* EOF */ diff --git a/reactos/lib/rtl/rtl.rbuild b/reactos/lib/rtl/rtl.rbuild index 5627f5f9cac..3f58ac020bd 100644 --- a/reactos/lib/rtl/rtl.rbuild +++ b/reactos/lib/rtl/rtl.rbuild @@ -46,16 +46,12 @@ mem.c memgen.c - - avl.c - tree.c - - access.c acl.c actctx.c assert.c atom.c + avltable.c bitmap.c bootdata.c compress.c diff --git a/reactos/lib/rtl/rtlavl.h b/reactos/lib/rtl/rtlavl.h new file mode 100644 index 00000000000..b320ad449f5 --- /dev/null +++ b/reactos/lib/rtl/rtlavl.h @@ -0,0 +1,62 @@ +/* + * PROJECT: ReactOS Runtime Library + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: lib/rtl/rtlavl.h + * PURPOSE: RTL AVL Glue + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +/* + * This is the glue code for the AVL package in the RTL meant for external callers. + * It's not very exciting, it just uses the RTL-defined fields without any magic, + * unlike the Mm version which has special handling for balances and parents, and + * does not implement custom comparison callbacks. + */ +#define MI_ASSERT(x) +#define RtlLeftChildAvl(x) (PRTL_BALANCED_LINKS)(RtlLeftChild(x)) +#define RtlRightChildAvl(x) (PRTL_BALANCED_LINKS)(RtlRightChild(x)) +#define RtlParentAvl(x) (PRTL_BALANCED_LINKS)(RtlParent(x)) +#define RtlRealPredecessorAvl(x) (PRTL_BALANCED_LINKS)(RtlRealPredecessor((PRTL_SPLAY_LINKS)(x))) +#define RtlRealSuccessorAvl(x) (PRTL_BALANCED_LINKS)(RtlRealSuccessor((PRTL_SPLAY_LINKS)(x))) +#define RtlInsertAsRightChildAvl RtlInsertAsRightChild +#define RtlInsertAsLeftChildAvl RtlInsertAsLeftChild +#define RtlIsLeftChildAvl RtlIsLeftChild + +RTL_GENERIC_COMPARE_RESULTS +FORCEINLINE +RtlpAvlCompareRoutine(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN PVOID UserData) +{ + /* Do the compare */ + return Table->CompareRoutine(Table, + Buffer, + UserData); +} + +VOID +FORCEINLINE +RtlSetParent(IN PRTL_BALANCED_LINKS Node, + IN PRTL_BALANCED_LINKS Parent) +{ + Node->Parent = Parent; +} + +VOID +FORCEINLINE +RtlSetBalance(IN PRTL_BALANCED_LINKS Node, + IN CHAR Balance) +{ + Node->Balance = Balance; +} + +CHAR +FORCEINLINE +RtlBalance(IN PRTL_BALANCED_LINKS Node) +{ + return Node->Balance; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/miavl.h b/reactos/ntoskrnl/mm/ARM3/miavl.h new file mode 100644 index 00000000000..e32d00ab530 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/miavl.h @@ -0,0 +1,136 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/miavl.h + * PURPOSE: ARM Memory Manager VAD Node Algorithms + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +/* + * This is the glue code for the Memory Manager version of AVL Trees that is used + * to store the MM_AVL_TABLE for Virtual Address Descriptors (VAD) in the VadRoot + * field in EPROCESS. + * + * In this version of the package, the balance and parent pointers are stored in + * the same field as a union (since we know the parent will be at least 8-byte + * aligned), saving some space, but requiring special logic to handle setting and + * querying the parent and balance. + * + * The other difference is that the AVL package for Rtl has custom callbacks for + * comparison purposes (which would access some internal, opaque, user data) while + * the Mm package stores the user-data inline as StartingVpn and EndingVpn. So + * when a compare is being made, RtlpAvlCompareRoutine is called, which will either + * perform the Mm work, or call the user-specified callback in the Rtl case. + */ +#define PRTL_AVL_TABLE PMM_AVL_TABLE +#define PRTL_BALANCED_LINKS PMMADDRESS_NODE +#define MI_ASSERT(x) ASSERT(x) + +RTL_GENERIC_COMPARE_RESULTS +FORCEINLINE +RtlpAvlCompareRoutine(IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN PVOID UserData) +{ + PRTL_BALANCED_LINKS CurrentNode = (PVOID)((ULONG_PTR)UserData - sizeof(LIST_ENTRY) - sizeof(RTL_BALANCED_LINKS)); + ULONG_PTR StartingVpn = (ULONG_PTR)Buffer; + if (StartingVpn < CurrentNode->StartingVpn) + { + return GenericLessThan; + } + else if (StartingVpn <= CurrentNode->EndingVpn) + { + return GenericEqual; + } + else + { + return GenericGreaterThan; + } +} + +VOID +FORCEINLINE +RtlSetParent(IN PRTL_BALANCED_LINKS Node, + IN PRTL_BALANCED_LINKS Parent) +{ + Node->u1.Parent = (PRTL_BALANCED_LINKS)((ULONG_PTR)Parent | (Node->u1.Balance & 0x3)); +} + +VOID +FORCEINLINE +RtlSetBalance(IN PRTL_BALANCED_LINKS Node, + IN SCHAR Balance) +{ + Node->u1.Balance = Balance; +} + +SCHAR +FORCEINLINE +RtlBalance(IN PRTL_BALANCED_LINKS Node) +{ + return Node->u1.Balance; +} + +PRTL_BALANCED_LINKS +FORCEINLINE +RtlParentAvl(IN PRTL_BALANCED_LINKS Node) +{ + return (PRTL_BALANCED_LINKS)((ULONG_PTR)Node->u1.Parent & ~3); +} + +BOOLEAN +FORCEINLINE +RtlIsRootAvl(IN PRTL_BALANCED_LINKS Node) +{ + return (RtlParentAvl(Node) == Node); +} + +PRTL_BALANCED_LINKS +FORCEINLINE +RtlRightChildAvl(IN PRTL_BALANCED_LINKS Node) +{ + return Node->RightChild; +} + +PRTL_BALANCED_LINKS +FORCEINLINE +RtlLeftChildAvl(IN PRTL_BALANCED_LINKS Node) +{ + return Node->LeftChild; +} + +BOOLEAN +FORCEINLINE +RtlIsLeftChildAvl(IN PRTL_BALANCED_LINKS Node) +{ + return (RtlLeftChildAvl(RtlParentAvl(Node)) == Node); +} + +BOOLEAN +FORCEINLINE +RtlIsRightChildAvl(IN PRTL_BALANCED_LINKS Node) +{ + return (RtlRightChildAvl(RtlParentAvl(Node)) == Node); +} + +VOID +FORCEINLINE +RtlInsertAsLeftChildAvl(IN PRTL_BALANCED_LINKS Parent, + IN PRTL_BALANCED_LINKS Node) +{ + Parent->LeftChild = Node; + RtlSetParent(Node, Parent); +} + +VOID +FORCEINLINE +RtlInsertAsRightChildAvl(IN PRTL_BALANCED_LINKS Parent, + IN PRTL_BALANCED_LINKS Node) +{ + Parent->RightChild = Node; + RtlSetParent(Node, Parent); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/vadnode.c b/reactos/ntoskrnl/mm/ARM3/vadnode.c new file mode 100644 index 00000000000..f87c58536a4 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/vadnode.c @@ -0,0 +1,268 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/vadnode.c + * PURPOSE: ARM Memory Manager VAD Node Algorithms + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::VADNODE" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* Include Mm version of AVL support */ +#include "../ARM3/miavl.h" +#include "../../../lib/rtl/avlsupp.c" + +/* FUNCTIONS ******************************************************************/ + +PMMVAD +NTAPI +MiLocateAddress(IN PVOID VirtualAddress) +{ + PMMVAD FoundVad; + ULONG_PTR Vpn; + PMM_AVL_TABLE Table = &PsGetCurrentProcess()->VadRoot; + TABLE_SEARCH_RESULT SearchResult; + + /* Start with the the hint */ + FoundVad = (PMMVAD)Table->NodeHint; + if (!FoundVad) return NULL; + + /* Check if this VPN is in the hint, if so, use it */ + Vpn = (ULONG_PTR)VirtualAddress >> PAGE_SHIFT; + if ((Vpn >= FoundVad->StartingVpn) && (Vpn <= FoundVad->EndingVpn)) return FoundVad; + + /* VAD hint didn't work, go look for it */ + SearchResult = RtlpFindAvlTableNodeOrParent(Table, + (PVOID)Vpn, + (PMMADDRESS_NODE*)&FoundVad); + if (SearchResult != TableFoundNode) return NULL; + + /* We found it, update the hint */ + ASSERT(FoundVad != NULL); + ASSERT((Vpn >= FoundVad->StartingVpn) && (Vpn <= FoundVad->EndingVpn)); + Table->NodeHint = FoundVad; + return FoundVad; +} + +PMMADDRESS_NODE +NTAPI +MiCheckForConflictingNode(IN ULONG_PTR StartVpn, + IN ULONG_PTR EndVpn, + IN PMM_AVL_TABLE Table) +{ + PMMADDRESS_NODE CurrentNode; + + /* If the tree is empty, there is no conflict */ + if (!Table->NumberGenericTableElements) return NULL; + + /* Start looping from the right */ + CurrentNode = RtlRightChildAvl(&Table->BalancedRoot); + ASSERT(CurrentNode != NULL); + while (CurrentNode) + { + /* This address comes after */ + if (StartVpn > CurrentNode->EndingVpn) + { + /* Keep searching on the right */ + CurrentNode = RtlRightChildAvl(CurrentNode); + } + else if (EndVpn < CurrentNode->StartingVpn) + { + /* This address ends before the node starts, search on the left */ + CurrentNode = RtlLeftChildAvl(CurrentNode); + } + else + { + /* This address is part of this node, return it */ + break; + } + } + + /* Return either the conflicting node, or no node at all */ + return CurrentNode; +} + +VOID +NTAPI +MiInsertNode(IN PMMADDRESS_NODE NewNode, + IN PMM_AVL_TABLE Table) +{ + PMMADDRESS_NODE NodeOrParent = NULL; + TABLE_SEARCH_RESULT Result; + + /* Find the node's parent, and where to insert this node */ + Result = RtlpFindAvlTableNodeOrParent(Table, + (PVOID)NewNode->StartingVpn, + &NodeOrParent); + + /* Insert it into the tree */ + RtlpInsertAvlTreeNode(Table, NewNode, NodeOrParent, Result); +} + +PMMADDRESS_NODE +NTAPI +MiGetPreviousNode(IN PMMADDRESS_NODE Node) +{ + PMMADDRESS_NODE Parent; + + /* Get the left child */ + if (RtlLeftChildAvl(Node)) + { + /* Get right-most child */ + Node = RtlLeftChildAvl(Node); + while (RtlRightChildAvl(Node)) Node = RtlRightChildAvl(Node); + return Node; + } + + Parent = RtlParentAvl(Node); + ASSERT(Parent != NULL); + while (Parent != Node) + { + /* The parent should be a right child, return the real predecessor */ + if (RtlIsRightChildAvl(Node)) + { + /* Return it unless it's the root */ + if (Parent == RtlParentAvl(Parent)) Parent = NULL; + return Parent; + } + + /* Keep lopping until we find our parent */ + Node = Parent; + Parent = RtlParentAvl(Node); + } + + /* Nothing found */ + return NULL; +} + +NTSTATUS +NTAPI +MiFindEmptyAddressRangeDownTree(IN SIZE_T Length, + IN ULONG_PTR BoundaryAddress, + IN ULONG_PTR Alignment, + IN PMM_AVL_TABLE Table, + OUT PULONG_PTR Base) +{ + PMMADDRESS_NODE Node, PreviousNode; + ULONG_PTR CandidateAddress, EndAddress; + ULONG AlignEndVpn, CandidateVpn, BoundaryVpn, LowestVpn, StartVpn, EndVpn; + PFN_NUMBER PageCount; + + /* Sanity checks */ + ASSERT(BoundaryAddress); + ASSERT(BoundaryAddress <= ((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); + + /* Compute page length, make sure the boundary address is valid */ + Length = PAGE_ROUND_UP(Length); + if ((BoundaryAddress + 1) < Length) return STATUS_NO_MEMORY; + + /* Compute the highest address to start at */ + CandidateAddress = ROUND_UP(BoundaryAddress + 1 - Length, Alignment); + + /* Check if the table is empty */ + if (!Table->NumberGenericTableElements) + { + /* Tree is empty, the candidate address is already the best one */ + *Base = CandidateAddress; + return STATUS_SUCCESS; + } + + /* Starting from the root, go down until the right-most child */ + Node = RtlRightChildAvl(&Table->BalancedRoot); + while (RtlRightChildAvl(Node)) Node = RtlRightChildAvl(Node); + + /* Get the aligned ending address of this VPN */ + EndAddress = ROUND_UP((Node->EndingVpn << PAGE_SHIFT) | (PAGE_SIZE - 1), + Alignment); + + /* Can we fit the address without overflowing into the node? */ + if ((EndAddress < BoundaryAddress) && + ((BoundaryAddress - EndAddress) > Length)) + { + /* There is enough space to add our address */ + *Base = ROUND_UP(BoundaryAddress - Length, Alignment); + return STATUS_SUCCESS; + } + + PageCount = Length >> PAGE_SHIFT; + CandidateVpn = CandidateAddress >> PAGE_SHIFT; + BoundaryVpn = BoundaryAddress >> PAGE_SHIFT; + LowestVpn = (ULONG_PTR)MI_LOWEST_VAD_ADDRESS >> PAGE_SHIFT; + + PreviousNode = MiGetPreviousNode(Node); + + StartVpn = Node->StartingVpn; + EndVpn = PreviousNode ? PreviousNode->EndingVpn : 0; + AlignEndVpn = ROUND_UP(EndVpn + 1, Alignment >> PAGE_SHIFT); + + /* Loop until a gap is found */ + for (PageCount = Length >> PAGE_SHIFT, + CandidateVpn = CandidateAddress >> PAGE_SHIFT, + BoundaryVpn = BoundaryAddress >> PAGE_SHIFT, + LowestVpn = (ULONG_PTR)MI_LOWEST_VAD_ADDRESS >> PAGE_SHIFT, + PreviousNode = MiGetPreviousNode(Node), + StartVpn = Node->StartingVpn, + EndVpn = PreviousNode ? PreviousNode->EndingVpn : 0, + AlignEndVpn = ROUND_UP(EndVpn + 1, Alignment >> PAGE_SHIFT); + PreviousNode; + Node = PreviousNode, + PreviousNode = MiGetPreviousNode(Node), + StartVpn = Node->StartingVpn, + EndVpn = PreviousNode ? PreviousNode->EndingVpn : 0, + AlignEndVpn = ROUND_UP(EndVpn + 1, Alignment >> PAGE_SHIFT)) + { + /* Can we fit the address without overflowing into the node? */ + if ((StartVpn < CandidateVpn) && ((StartVpn - AlignEndVpn) >= PageCount)) + { + /* Check if we can get our candidate address */ + if ((CandidateVpn > EndVpn) && (BoundaryVpn < StartVpn)) + { + /* Use it */ + *Base = CandidateAddress; + return STATUS_SUCCESS; + } + + /* Otherwise, can we fit it by changing the start address? */ + if (StartVpn > AlignEndVpn) + { + /* It'll fit, compute the new base address for that to work */ + *Base = ROUND_UP((StartVpn << PAGE_SHIFT) - Length, Alignment); + return STATUS_SUCCESS; + } + } + + PreviousNode = MiGetPreviousNode(Node); + StartVpn = Node->StartingVpn; + EndVpn = PreviousNode ? PreviousNode->EndingVpn : 0; + AlignEndVpn = ROUND_UP(EndVpn + 1, Alignment >> PAGE_SHIFT); + } + + /* See if we could squeeze into the last descriptor */ + if ((StartVpn > LowestVpn) && ((StartVpn - LowestVpn) >= PageCount)) + { + /* Check if we can try our candidate address */ + if (BoundaryVpn < StartVpn) + { + /* Use it */ + *Base = CandidateAddress; + return STATUS_SUCCESS; + } + + /* Otherwise, change the base address to what's needed to fit in */ + *Base = ROUND_UP((StartVpn << PAGE_SHIFT) - Length, Alignment); + return STATUS_SUCCESS; + } + + /* No address space left at all */ + return STATUS_NO_MEMORY; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index fb218921d4e..03ce565623a 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -408,6 +408,7 @@ procsup.c sysldr.c syspte.c + vadnode.c virtual.c anonmem.c From 7c3bc09fa1ec3b24d8f16de78852df77e0ad5617 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 02:10:43 +0000 Subject: [PATCH 26/82] [NTOS]: Add missing definitions, should fix build. svn path=/trunk/; revision=48174 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 09c4b50ecf2..fb6de0ee725 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -40,6 +40,9 @@ #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) +/* The range 0x10000->0x7FEFFFFF is reserved for the ROSMM MAREA Allocator */ +#define MI_LOWEST_VAD_ADDRESS (PVOID)0x7FF00000 + #endif /* !_M_AMD64 */ /* Make the code cleaner with some definitions for size multiples */ @@ -826,4 +829,35 @@ MiIsPfnInUse( IN PMMPFN Pfn1 ); +PMMVAD +NTAPI +MiLocateAddress( + IN PVOID VirtualAddress +); + +PMMADDRESS_NODE +NTAPI +MiCheckForConflictingNode( + IN ULONG_PTR StartVpn, + IN ULONG_PTR EndVpn, + IN PMM_AVL_TABLE Table +); + +NTSTATUS +NTAPI +MiFindEmptyAddressRangeDownTree( + IN SIZE_T Length, + IN ULONG_PTR BoundaryAddress, + IN ULONG_PTR Alignment, + IN PMM_AVL_TABLE Table, + OUT PULONG_PTR Base +); + +VOID +NTAPI +MiInsertNode( + IN PMMADDRESS_NODE NewNode, + IN PMM_AVL_TABLE Table +); + /* EOF */ From d403f0ffd466d24a6c7505e3d54964d47c0ea6d7 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 02:20:27 +0000 Subject: [PATCH 27/82] [NTOS]: Learn to build User PTEs as well, with MI_MAKE_HARDWARE_PTE_USER. [NTOS]: MI_MAKE_HARDWARE_PTE becomes MI_MAKE_HARDWARE_PTE_KERNEL, since it assumed this. MI_MAKE_HARDWARE_PTE is now a "generic" you can use when you don't know what the PTE should be. It uses MiDetermineUserGlobalMask to set the right bits. [NTOS]: Add two more helpers: MI_IS_PAGE_TABLE_ADDRESS and MI_IS_SYSTEM_PAGE_TABLE_ADDDRESS. One is in the symbols, the other I made up to make things clearer. [NTOS]: MiResolveDemandZeroFault now knnows how to resolve user-demand-zero-faults. [NTOS]: Implement MiZeroPfn to do the actual zeroing during user-demand-zero-faults (also later for VAD faults). svn path=/trunk/; revision=48175 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 82 ++++++++++++++++++++++++-- reactos/ntoskrnl/mm/ARM3/pagfault.c | 90 ++++++++++++++++++++++++++--- reactos/ntoskrnl/mm/ARM3/procsup.c | 4 +- 3 files changed, 163 insertions(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index fb6de0ee725..e3e889951e2 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -193,6 +193,12 @@ MmProtectToPteMask[32] = #define MI_IS_SESSION_PTE(Pte) \ ((((PMMPTE)Pte) >= MiSessionBasePte) && (((PMMPTE)Pte) < MiSessionLastPte)) +#define MI_IS_PAGE_TABLE_ADDRESS(Address) \ + (((PVOID)(Address) >= (PVOID)PTE_BASE) && ((PVOID)(Address) <= (PVOID)PTE_TOP)) + +#define MI_IS_SYSTEM_PAGE_TABLE_ADDRESS(Address) \ + (((Address) >= (PVOID)MiAddressToPte(MmSystemRangeStart)) && ((Address) <= (PVOID)PTE_TOP)) + // // Corresponds to MMPTE_SOFTWARE.Protection // @@ -469,15 +475,45 @@ extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT]; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) +// +// Figures out the hardware bits for a PTE +// +ULONG +FORCEINLINE +MiDetermineUserGlobalPteMask(IN PMMPTE PointerPte) +{ + MMPTE TempPte; + + /* Start fresh */ + TempPte.u.Long = 0; + + /* Make it valid and accessed */ + TempPte.u.Hard.Valid = TRUE; + TempPte.u.Hard.Accessed = TRUE; + + /* Is this for user-mode? */ + if ((PointerPte <= MiHighestUserPte) || + ((PointerPte >= MiAddressToPde(NULL)) && (PointerPte <= MiHighestUserPde))) + { + /* Set the owner bit */ + TempPte.u.Hard.Owner = TRUE; + } + + /* FIXME: We should also set the global bit */ + + /* Return the protection */ + return TempPte.u.Long; +} + // // Creates a valid kernel PTE with the given protection // FORCEINLINE VOID -MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte, - IN PMMPTE MappingPte, - IN ULONG ProtectionMask, - IN PFN_NUMBER PageFrameNumber) +MI_MAKE_HARDWARE_PTE_KERNEL(IN PMMPTE NewPte, + IN PMMPTE MappingPte, + IN ULONG ProtectionMask, + IN PFN_NUMBER PageFrameNumber) { /* Only valid for kernel, non-session PTEs */ ASSERT(MappingPte > MiHighestUserPte); @@ -492,6 +528,44 @@ MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte, NewPte->u.Long |= MmProtectToPteMask[ProtectionMask]; } +// +// Creates a valid PTE with the given protection +// +FORCEINLINE +VOID +MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte, + IN PMMPTE MappingPte, + IN ULONG ProtectionMask, + IN PFN_NUMBER PageFrameNumber) +{ + /* Set the protection and page */ + NewPte->u.Long = MiDetermineUserGlobalPteMask(MappingPte); + NewPte->u.Long |= MmProtectToPteMask[ProtectionMask]; + NewPte->u.Hard.PageFrameNumber = PageFrameNumber; +} + +// +// Creates a valid user PTE with the given protection +// +FORCEINLINE +VOID +MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte, + IN PMMPTE MappingPte, + IN ULONG ProtectionMask, + IN PFN_NUMBER PageFrameNumber) +{ + /* Only valid for kernel, non-session PTEs */ + ASSERT(MappingPte <= MiHighestUserPte); + + /* Start fresh */ + *NewPte = ValidKernelPte; + + /* Set the protection and page */ + NewPte->u.Hard.Owner = TRUE; + NewPte->u.Hard.PageFrameNumber = PageFrameNumber; + NewPte->u.Long |= MmProtectToPteMask[ProtectionMask]; +} + // // Returns if the page is physically resident (ie: a large page) // FIXFIX: CISC/x86 only? diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index ad856419f36..eeb82a7712f 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -34,8 +34,7 @@ MiCheckPdeForPagedPool(IN PVOID Address) // // Check if this is a fault while trying to access the page table itself // - if ((Address >= (PVOID)MiAddressToPte(MmSystemRangeStart)) && - (Address < (PVOID)PTE_TOP)) + if (MI_IS_SYSTEM_PAGE_TABLE_ADDRESS(Address)) { // // Send a hint to the page fault handler that this is only a valid fault @@ -84,6 +83,52 @@ MiCheckPdeForPagedPool(IN PVOID Address) return Status; } +VOID +NTAPI +MiZeroPfn(IN PFN_NUMBER PageFrameNumber) +{ + PMMPTE ZeroPte; + MMPTE TempPte; + PMMPFN Pfn1; + PVOID ZeroAddress; + + /* Get the PFN for this page */ + Pfn1 = MiGetPfnEntry(PageFrameNumber); + ASSERT(Pfn1); + + /* Grab a system PTE we can use to zero the page */ + ZeroPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(ZeroPte); + + /* Initialize the PTE for it */ + TempPte = ValidKernelPte; + TempPte.u.Hard.PageFrameNumber = PageFrameNumber; + + /* Setup caching */ + if (Pfn1->u3.e1.CacheAttribute == MiWriteCombined) + { + /* Write combining, no caching */ + MI_PAGE_DISABLE_CACHE(&TempPte); + MI_PAGE_WRITE_COMBINED(&TempPte); + } + else if (Pfn1->u3.e1.CacheAttribute == MiNonCached) + { + /* Write through, no caching */ + MI_PAGE_DISABLE_CACHE(&TempPte); + MI_PAGE_WRITE_THROUGH(&TempPte); + } + + /* Make the system PTE valid with our PFN */ + MI_WRITE_VALID_PTE(ZeroPte, TempPte); + + /* Get the address it maps to, and zero it out */ + ZeroAddress = MiPteToAddress(ZeroPte); + KeZeroPages(ZeroAddress, PAGE_SIZE); + + /* Now get rid of it */ + MiReleaseSystemPtes(ZeroPte, 1, SystemPteSpace); +} + NTSTATUS NTAPI MiResolveDemandZeroFault(IN PVOID Address, @@ -93,13 +138,24 @@ MiResolveDemandZeroFault(IN PVOID Address, { PFN_NUMBER PageFrameNumber; MMPTE TempPte; + BOOLEAN NeedZero = FALSE; DPRINT("ARM3 Demand Zero Page Fault Handler for address: %p in process: %p\n", Address, Process); - /* Must currently only be called by paging path, for system addresses only */ + /* Must currently only be called by paging path */ ASSERT(OldIrql == MM_NOIRQL); - ASSERT(Process == NULL); + if (Process) + { + /* Sanity check */ + ASSERT(MI_IS_PAGE_TABLE_ADDRESS(PointerPte)); + + /* No forking yet */ + ASSERT(Process->ForkInProgress == NULL); + + /* We'll need a zero page */ + NeedZero = TRUE; + } // // Lock the PFN database @@ -124,11 +180,31 @@ MiResolveDemandZeroFault(IN PVOID Address, // InterlockedIncrement(&KeGetCurrentPrcb()->MmDemandZeroCount); - /* Shouldn't see faults for user PTEs yet */ - ASSERT(PointerPte > MiHighestUserPte); + /* Zero the page if need be */ + if (NeedZero) MiZeroPfn(PageFrameNumber); /* Build the PTE */ - MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte, PointerPte->u.Soft.Protection, PageFrameNumber); + if (PointerPte <= MiHighestUserPte) + { + /* For user mode */ + MI_MAKE_HARDWARE_PTE_USER(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameNumber); + } + else + { + /* For kernel mode */ + MI_MAKE_HARDWARE_PTE(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameNumber); + } + + /* Set it dirty if it's a writable page */ + if (TempPte.u.Hard.Write) TempPte.u.Hard.Dirty = TRUE; + + /* Write it */ MI_WRITE_VALID_PTE(PointerPte, TempPte); // diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 4410624c387..63b0942f2e7 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -156,7 +156,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, MI_MAKE_SOFTWARE_PTE(&InvalidPte, MM_NOACCESS); /* Setup the template stack PTE */ - MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte + 1, MM_READWRITE, 0); + MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, PointerPte + 1, MM_READWRITE, 0); // // Acquire the PFN DB lock @@ -270,7 +270,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer, MiInitializePfn(PageFrameIndex, LimitPte, 1); /* Setup the template stack PTE */ - MI_MAKE_HARDWARE_PTE(&TempPte, LimitPte, MM_READWRITE, PageFrameIndex); + MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, LimitPte, MM_READWRITE, PageFrameIndex); /* Write the valid PTE */ MI_WRITE_VALID_PTE(LimitPte--, TempPte); From c30930d3ec69d40bfe94a523db1a91d82e7c68ce Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 03:22:43 +0000 Subject: [PATCH 28/82] [NTOS]: MiRosTakeOverPebTebRanges now creates a small ~1MB ARM3 memory range on top of the ReactOS per-process VA. This does a couple of things: First of all, it changes the default PEB address to another static address. Still not dynamic like it will be soon, but at least it changes it a bit so we can test if anything breaks due to that. It also likewise changes the addresses of the TEBs (Shifted down by 1MB, basically). Finally, it blocks off that part of address space, which nobody should be using now, to see if anyone does indeed touch it. [NTOS]: Knowing if this change causes issues will help later in determining regressions due to TEB/PEBs mapped as VADs by ARM3, and regressions simply due to the change in VA layout. [NTOS]: When implemented, the VAD mapping for PEB/TEB will only use that ~1MB, which yes, will limit ReactOS processes to each have only 256 threads. That is obviously a temporary limitation, one I doubt we'll even hit, but I'm putting it out here so you know. svn path=/trunk/; revision=48176 --- reactos/ntoskrnl/mm/ARM3/procsup.c | 27 +++++++++++++++++++++++++-- reactos/ntoskrnl/mm/procsup.c | 13 +++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 63b0942f2e7..d2ea798914d 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -25,6 +25,29 @@ MiCreatePebOrTeb(PEPROCESS Process, /* PRIVATE FUNCTIONS **********************************************************/ +VOID +NTAPI +MiRosTakeOverPebTebRanges(IN PEPROCESS Process) +{ + NTSTATUS Status; + PMEMORY_AREA MemoryArea; + PHYSICAL_ADDRESS BoundaryAddressMultiple; + PVOID AllocatedBase = (PVOID)MI_LOWEST_VAD_ADDRESS; + BoundaryAddressMultiple.QuadPart = 0; + + Status = MmCreateMemoryArea(&Process->Vm, + MEMORY_AREA_OWNED_BY_ARM3, + &AllocatedBase, + ((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - 1) - + (ULONG_PTR)MI_LOWEST_VAD_ADDRESS, + PAGE_READWRITE, + &MemoryArea, + TRUE, + 0, + BoundaryAddressMultiple); + ASSERT(NT_SUCCESS(Status)); +} + VOID NTAPI MmDeleteKernelStack(IN PVOID StackBase, @@ -394,8 +417,8 @@ MmCreatePeb(IN PEPROCESS Process, // Peb = MiCreatePebOrTeb(Process, (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); - ASSERT(Peb == (PVOID)0x7FFDF000); - + if (!Peb) return STATUS_INSUFFICIENT_RESOURCES; + // // Map NLS Tables // diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index ededba8ff46..1e5bd9afb2d 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -13,8 +13,10 @@ #define NDEBUG #include -/* FUNCTIONS *****************************************************************/ +VOID NTAPI MiRosTakeOverPebTebRanges(IN PEPROCESS Process); +/* FUNCTIONS *****************************************************************/ + PVOID NTAPI MiCreatePebOrTeb(PEPROCESS Process, @@ -111,6 +113,9 @@ MmInitializeHandBuiltProcess2(IN PEPROCESS Process) FALSE, 0, BoundaryAddressMultiple); + + /* Lock the VAD, ARM3-owned ranges away */ + MiRosTakeOverPebTebRanges(Process); return Status; } @@ -192,7 +197,10 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, { DPRINT1("Failed to create Shared User Data\n"); goto exit; - } + } + + /* Lock the VAD, ARM3-owned ranges away */ + MiRosTakeOverPebTebRanges(Process); /* The process now has an address space */ Process->HasAddressSpace = TRUE; @@ -319,6 +327,7 @@ MmDeleteProcessAddressSpace(PEPROCESS Process) case MEMORY_AREA_SHARED_DATA: case MEMORY_AREA_NO_ACCESS: + case MEMORY_AREA_OWNED_BY_ARM3: MmFreeMemoryArea(&Process->Vm, MemoryArea, NULL, From 5dd4d18e01f02f69f1b8394cf855e4f4bcb8ae3c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 03:29:25 +0000 Subject: [PATCH 29/82] [FREELDR] - In the fat bootsector, don't clobber ax, it contains the number of first cluster of freeldr.sys and is used by the fathelper code. - Fix jump code in the fathelper code, like in the other bootsectors. - Now booting from fat partitions (looks like that's what sysreg does) works again. It's safe under the condition that the cluster size is at least 4352 bytes, which is true for harddisks of sizes bigger than 272MB. Booting from smaller fat disks, like floppy breaks when freeldr.sys gets fragmented, which should rarely happen. svn path=/trunk/; revision=48177 --- reactos/boot/freeldr/bootsect/fat.asm | 8 ++++---- reactos/boot/freeldr/freeldr/arch/i386/fathelp.asm | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/reactos/boot/freeldr/bootsect/fat.asm b/reactos/boot/freeldr/bootsect/fat.asm index d41db93a15a..0e803a58500 100644 --- a/reactos/boot/freeldr/bootsect/fat.asm +++ b/reactos/boot/freeldr/bootsect/fat.asm @@ -208,11 +208,11 @@ FoundFreeLoader: ; to the helper code. Skip the first three bytes ; because they contain a jump instruction to skip ; over the helper code in the FreeLoader image. - ;jmp 0000:8003h + ;jmp 0000:9003h push 0 ; push segment (0x0000) - mov eax, [0x8000 + 0xA8] ; load the RVA of the EntryPoint into eax - add eax, 0x8003 ; RVA -> VA and skip 3 bytes (jump to fathelper code) - push ax ; push offset + mov bx, [0x8000 + 0xA8] ; load the RVA of the EntryPoint into eax + add bx, 0x8003 ; RVA -> VA and skip 3 bytes (jump to fathelper code) + push bx ; push offset retf ; Transfer control to FreeLoader diff --git a/reactos/boot/freeldr/freeldr/arch/i386/fathelp.asm b/reactos/boot/freeldr/freeldr/arch/i386/fathelp.asm index d3e09ee13b5..90e42a00475 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/fathelp.asm +++ b/reactos/boot/freeldr/freeldr/arch/i386/fathelp.asm @@ -125,10 +125,12 @@ LoadFile5: LoadFile_Done: mov dl,BYTE [BYTE bp+BootDrive] ; Load the boot drive into DL mov dh,[BootPartition] ; Load the boot partition into DH - push WORD 0x0000 - push WORD 0x8000 ; We will do a far return to 0000:8000h - retf ; Transfer control to ROSLDR + push 0 ; push segment (0x0000) + mov bx, [0x8000 + 0xA8] ; load the RVA of the EntryPoint into eax + add bx, 0x8000 ; RVA -> VA and skip 3 bytes (jump to fathelper code) + push bx ; push offset + retf ; Transfer control to FreeLoader ; Reads the entire FAT into memory at 7000:0000 ReadFatIntoMemory: From 541d2436cd63f5bfeac33d4518ec5b503248c17e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 04:08:57 +0000 Subject: [PATCH 30/82] [NDK] Fix MMADDRESS_NODE and MM_AVL_TABLE svn path=/trunk/; revision=48178 --- reactos/include/ndk/mmtypes.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/reactos/include/ndk/mmtypes.h b/reactos/include/ndk/mmtypes.h index bb545ad14e4..da4a63edf33 100644 --- a/reactos/include/ndk/mmtypes.h +++ b/reactos/include/ndk/mmtypes.h @@ -607,13 +607,13 @@ typedef struct _MMADDRESS_NODE { union { - LONG Balance:2; + LONG_PTR Balance:2; struct _MMADDRESS_NODE *Parent; } u1; struct _MMADDRESS_NODE *LeftChild; struct _MMADDRESS_NODE *RightChild; - ULONG StartingVpn; - ULONG EndingVpn; + ULONG_PTR StartingVpn; + ULONG_PTR EndingVpn; } MMADDRESS_NODE, *PMMADDRESS_NODE; // @@ -622,9 +622,13 @@ typedef struct _MMADDRESS_NODE typedef struct _MM_AVL_TABLE { MMADDRESS_NODE BalancedRoot; - ULONG DepthOfTree:5; - ULONG Unused:3; - ULONG NumberGenericTableElements:24; + ULONG_PTR DepthOfTree:5; + ULONG_PTR Unused:3; +#ifdef _WIN64 + ULONG_PTR NumberGenericTableElements:56; +#else + ULONG_PTR NumberGenericTableElements:24; +#endif PVOID NodeHint; PVOID NodeFreeHint; } MM_AVL_TABLE, *PMM_AVL_TABLE; From 3ea611401e2a2d9e40cbb790eba2add54827ec02 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 04:19:27 +0000 Subject: [PATCH 31/82] [NTOSKRL] Add missing MI_LOWEST_VAD_ADDRESS for amd64 svn path=/trunk/; revision=48179 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index a1aeaf22c2a..1889c64209f 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -23,6 +23,8 @@ #define MI_HIGHEST_SYSTEM_ADDRESS (PVOID)0xFFFFFFFFFFFFFFFFULL #define MI_SYSTEM_CACHE_WS_START (PVOID)0xFFFFF78000001000ULL // CHECKME +#define MI_LOWEST_VAD_ADDRESS (PVOID)0x000000007FF00000ULL + /* Memory sizes */ #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) #define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT) From ba1b8c6dad2d0e9e5c81cef06679bca590346723 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 05:22:26 +0000 Subject: [PATCH 32/82] [NTOS]: Fix "fail". Dedicated to Timo. svn path=/trunk/; revision=48180 --- reactos/ntoskrnl/mm/ARM3/sysldr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/sysldr.c b/reactos/ntoskrnl/mm/ARM3/sysldr.c index d8f7157eb21..7706a9f16e3 100644 --- a/reactos/ntoskrnl/mm/ARM3/sysldr.c +++ b/reactos/ntoskrnl/mm/ARM3/sysldr.c @@ -2211,7 +2211,7 @@ MiWriteProtectSystemImage(IN PVOID ImageBase) } /* Finally, handle the last section */ - CurrentPte = MiPteToAddress(CurrentAddress); + CurrentPte = MiAddressToPte(CurrentAddress); if ((StartPte < LastPte) && (CurrentPte >= StartPte)) { /* Handle overlap */ From ca9e196050fd9a4da51134a0c72bcf4db6d8b39d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 09:20:03 +0000 Subject: [PATCH 33/82] [MINGW] - Remove getopt from mingw lib and put it into it's own static library - change crt="dll" to crt="static" for the mingw startup libs, to avoid things like importing from itself. svn path=/trunk/; revision=48181 --- reactos/dll/3rdparty/libtiff/libtiff.rbuild | 1 + reactos/lib/3rdparty/mingw/mingw.rbuild | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/dll/3rdparty/libtiff/libtiff.rbuild b/reactos/dll/3rdparty/libtiff/libtiff.rbuild index 1f37bc479f2..ce7027cbd95 100644 --- a/reactos/dll/3rdparty/libtiff/libtiff.rbuild +++ b/reactos/dll/3rdparty/libtiff/libtiff.rbuild @@ -9,6 +9,7 @@ . include/reactos/libs/zlib include/reactos/libs/libtiff + getopt user32 zlib mkg3states.c diff --git a/reactos/lib/3rdparty/mingw/mingw.rbuild b/reactos/lib/3rdparty/mingw/mingw.rbuild index b85147376de..737810cca13 100644 --- a/reactos/lib/3rdparty/mingw/mingw.rbuild +++ b/reactos/lib/3rdparty/mingw/mingw.rbuild @@ -1,7 +1,7 @@ - + oldnames ntdll @@ -22,7 +22,6 @@ crt_handler.c dllentry.c gccmain.c - getopt.c gs_support.c merr.c mingw_helpers.c @@ -49,7 +48,7 @@ crtexe.c dllargv.c - + include/reactos/mingw-w64 @@ -58,7 +57,7 @@ crtexe.c dllargv.c - + include/reactos/mingw-w64 crtdll.c @@ -68,4 +67,7 @@ + + getopt.c + From ecc9ac8278554bcf744cca1b1203ee5fd3fefaf4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 09:20:35 +0000 Subject: [PATCH 34/82] [TLIST] link to getopt library svn path=/trunk/; revision=48182 --- rosapps/applications/sysutils/tlist/tlist.rbuild | 1 + 1 file changed, 1 insertion(+) diff --git a/rosapps/applications/sysutils/tlist/tlist.rbuild b/rosapps/applications/sysutils/tlist/tlist.rbuild index 85797f35d60..07ccd1851f5 100644 --- a/rosapps/applications/sysutils/tlist/tlist.rbuild +++ b/rosapps/applications/sysutils/tlist/tlist.rbuild @@ -1,6 +1,7 @@ epsapi + getopt user32 ntdll tlist.c From 3c4ff1e189efcd440a8019ead927b62abc68f5f5 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 10:23:52 +0000 Subject: [PATCH 35/82] [MSVCRT] - export _ftol only on i386 - fix _setjmp (2nd argument) and redirect setjmp svn path=/trunk/; revision=48183 --- reactos/dll/win32/msvcrt/msvcrt.spec | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/msvcrt/msvcrt.spec b/reactos/dll/win32/msvcrt/msvcrt.spec index c0328e1b98b..3bc0554d68e 100644 --- a/reactos/dll/win32/msvcrt/msvcrt.spec +++ b/reactos/dll/win32/msvcrt/msvcrt.spec @@ -405,9 +405,9 @@ # stub _ftime32_s @ cdecl _ftime64(ptr) # stub _ftime64_s -@ cdecl -ret64 _ftol() -@ cdecl -ret64 _ftol2() _ftol -@ cdecl -ret64 _ftol2_sse() _ftol #FIXME: SSE variant should be implemented +@ cdecl -arch=i386 -ret64 _ftol() +@ cdecl -arch=i386 -ret64 _ftol2() _ftol +@ cdecl -arch=i386 -ret64 _ftol2_sse() _ftol #FIXME: SSE variant should be implemented # stub _ftol2_sse_excpt @ cdecl _fullpath(ptr str long) # stub _fullpath_dbg @@ -814,7 +814,7 @@ # stub _set_output_format @ cdecl _set_sbh_threshold(long) @ cdecl _seterrormode(long) -@ cdecl -arch=i386,x86_64 -norelay _setjmp(ptr) +@ cdecl -arch=i386,x86_64 -norelay _setjmp(ptr ptr) @ cdecl -arch=i386 -norelay _setjmp3(ptr long) @ cdecl -arch=x86_64 -norelay _setjmpex(ptr ptr) @ cdecl _setmaxstdio(long) @@ -1293,7 +1293,7 @@ @ varargs scanf(str) # @ varargs scanf_s(str) @ cdecl setbuf(ptr ptr) -@ cdecl -arch=x86_64 -norelay -private setjmp(ptr) +@ cdecl -arch=x86_64 -norelay -private setjmp(ptr ptr) _setjmp @ cdecl setlocale(long str) @ cdecl setvbuf(ptr str long long) @ cdecl signal(long long) From 5544c14ffb46c632a641cf22c7edd5279bc6b9c6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 14:44:27 +0000 Subject: [PATCH 36/82] [NTDLL] - Comment out RtlWalkFrameChain for amd64 svn path=/trunk/; revision=48184 --- reactos/dll/ntdll/rtl/libsupp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/dll/ntdll/rtl/libsupp.c b/reactos/dll/ntdll/rtl/libsupp.c index 90c3ce322fc..47e4359e054 100644 --- a/reactos/dll/ntdll/rtl/libsupp.c +++ b/reactos/dll/ntdll/rtl/libsupp.c @@ -18,6 +18,8 @@ PTEB LdrpTopLevelDllBeingLoadedTeb = NULL; /* FUNCTIONS ***************************************************************/ +#ifndef _M_AMD64 +// FIXME: Why "Not implemented"??? /* * @implemented */ @@ -30,6 +32,7 @@ RtlWalkFrameChain(OUT PVOID *Callers, /* Not implemented for user-mode */ return 0; } +#endif BOOLEAN NTAPI From 6c1aa302b33303f1b8752b10e299e1f7dec0132a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 14:49:42 +0000 Subject: [PATCH 37/82] [NTDLL] - Add amd64 stubs for LdrInitializeThunk and KiUserApcDispatcher svn path=/trunk/; revision=48185 --- reactos/dll/ntdll/dispatch/amd64/stubs.c | 43 ++++++++++++++++++++++++ reactos/dll/ntdll/ntdll.rbuild | 5 +++ 2 files changed, 48 insertions(+) create mode 100644 reactos/dll/ntdll/dispatch/amd64/stubs.c diff --git a/reactos/dll/ntdll/dispatch/amd64/stubs.c b/reactos/dll/ntdll/dispatch/amd64/stubs.c new file mode 100644 index 00000000000..fe7b4a78656 --- /dev/null +++ b/reactos/dll/ntdll/dispatch/amd64/stubs.c @@ -0,0 +1,43 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS NT Library + * FILE: dll/ntdll/dispatch/amd64/stubs.c + * PURPOSE: AMD64 stubs + * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org) + */ + +/* INCLUDES *****************************************************************/ + +#include +#define NDEBUG +#include + +/* PUBLIC FUNCTIONS **********************************************************/ + +/* + * @unimplemented + */ +VOID +NTAPI +LdrInitializeThunk(ULONG Unknown1, // FIXME: Parameters! + ULONG Unknown2, + ULONG Unknown3, + ULONG Unknown4) +{ + UNIMPLEMENTED; + return; +} + +/* + * @unimplemented + */ +VOID +NTAPI +KiUserApcDispatcher(IN PVOID NormalRoutine, + IN PVOID NormalContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2) +{ + UNIMPLEMENTED; + return; +} diff --git a/reactos/dll/ntdll/ntdll.rbuild b/reactos/dll/ntdll/ntdll.rbuild index b8db8d02b96..0a09528d93f 100644 --- a/reactos/dll/ntdll/ntdll.rbuild +++ b/reactos/dll/ntdll/ntdll.rbuild @@ -32,6 +32,11 @@ dispatch.S + + + stubs.c + + stubs_asm.s From 4ae7219e5c2da51563645e160d46149ede3557e6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 15:18:55 +0000 Subject: [PATCH 38/82] [NDK] Include the correct mmtypes.h for amd64 svn path=/trunk/; revision=48186 --- reactos/include/ndk/arch/mmtypes.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/include/ndk/arch/mmtypes.h b/reactos/include/ndk/arch/mmtypes.h index 41df8085086..e83c9579e64 100644 --- a/reactos/include/ndk/arch/mmtypes.h +++ b/reactos/include/ndk/arch/mmtypes.h @@ -22,12 +22,14 @@ Author: // // Include the right file for this architecture. // -#if defined(_M_IX86) || defined(_M_AMD64) +#if defined(_M_IX86) #include #elif defined(_M_PPC) #include #elif defined(_M_ARM) #include +#elif defined(_M_AMD64) +#include #else #error "Unknown processor" #endif From 23c3e742d9c84e9fb1518f5fcb8b52be3cfa8731 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 18:26:04 +0000 Subject: [PATCH 39/82] [NTOS]: Fix a very stupid bug which made any machine with less than 52GB of RAM appear as a "Small memory machine" (instead of 13MB). [NTOS]: Initialize MmTotalCommitLimit, MmTotalCommitLimitMaximum for consistency. [NTOS]: Initialize and honor MmAllocationFragment value from registry, or from defaults. [NTOS]: Initialize the system cache working set pushlock. [NTOS]: Implement Mi(Un)Lock(Process)WorkingSet inlines to handle the various scenarios. Replace broken/hacky code that was in the system loader, fault handler, and VM deletion paths with the correct macros. No locking is done yet as ReactOS' MAREA implementation overloads the Vm field in EPROCESS, but the correct APC blockings and state transitions are done. [NTOS]: Add another helper from symbols, MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS, and use it instead of the math-by-hand. [NTOS]: Add MM_IS_ANY_LOCK_HELD and MI_WS_OWNER to help out the new working let locking inlines (names taken from symbols). [NTOS]: Add _1GB helper for large-memory checks. Also define _1KB as "1024u". The "u" makes GCC not complain when sizes reach >= 2GB, because GCC will interpret the integer literals as "signed", even if the final calculated value is in an unsigned variable. svn path=/trunk/; revision=48187 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 209 +++++++++++++++++++++++++--- reactos/ntoskrnl/mm/ARM3/mminit.c | 70 +++++++++- reactos/ntoskrnl/mm/ARM3/pagfault.c | 47 ++++--- reactos/ntoskrnl/mm/ARM3/sysldr.c | 16 +-- reactos/ntoskrnl/mm/ARM3/virtual.c | 24 +--- 5 files changed, 294 insertions(+), 72 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index e3e889951e2..23271256c91 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -8,35 +8,39 @@ #ifndef _M_AMD64 -#define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) -#define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT) -#define MI_MIN_PAGES_FOR_SYSPTE_BOOST ((32*1024*1024) >> PAGE_SHIFT) -#define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024) -#define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) -#define MI_MAX_FREE_PAGE_LISTS 4 +#define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255 * _1MB) >> PAGE_SHIFT) +#define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19 * _1MB) >> PAGE_SHIFT) +#define MI_MIN_PAGES_FOR_SYSPTE_BOOST ((32 * _1MB) >> PAGE_SHIFT) +#define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * _1MB) +#define MI_MAX_NONPAGED_POOL_SIZE (128 * _1MB) +#define MI_MAX_FREE_PAGE_LISTS 4 -#define MI_MIN_INIT_PAGED_POOLSIZE (32 * 1024 * 1024) +#define MI_MIN_INIT_PAGED_POOLSIZE (32 * _1MB) -#define MI_SESSION_VIEW_SIZE (20 * 1024 * 1024) -#define MI_SESSION_POOL_SIZE (16 * 1024 * 1024) -#define MI_SESSION_IMAGE_SIZE (8 * 1024 * 1024) -#define MI_SESSION_WORKING_SET_SIZE (4 * 1024 * 1024) -#define MI_SESSION_SIZE (MI_SESSION_VIEW_SIZE + \ - MI_SESSION_POOL_SIZE + \ - MI_SESSION_IMAGE_SIZE + \ - MI_SESSION_WORKING_SET_SIZE) +#define MI_SESSION_VIEW_SIZE (20 * _1MB) +#define MI_SESSION_POOL_SIZE (16 * _1MB) +#define MI_SESSION_IMAGE_SIZE (8 * _1MB) +#define MI_SESSION_WORKING_SET_SIZE (4 * _1MB) +#define MI_SESSION_SIZE (MI_SESSION_VIEW_SIZE + \ + MI_SESSION_POOL_SIZE + \ + MI_SESSION_IMAGE_SIZE + \ + MI_SESSION_WORKING_SET_SIZE) -#define MI_SYSTEM_VIEW_SIZE (16 * 1024 * 1024) +#define MI_SYSTEM_VIEW_SIZE (16 * _1MB) -#define MI_SYSTEM_CACHE_WS_START (PVOID)0xC0C00000 -#define MI_PAGED_POOL_START (PVOID)0xE1000000 -#define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 -#define MI_DEBUG_MAPPING (PVOID)0xFFBFF000 +#define MI_SYSTEM_CACHE_WS_START (PVOID)0xC0C00000 +#define MI_PAGED_POOL_START (PVOID)0xE1000000 +#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 MI_MIN_ALLOCATION_FRAGMENT (4 * _1KB) +#define MI_ALLOCATION_FRAGMENT (64 * _1KB) +#define MI_MAX_ALLOCATION_FRAGMENT (2 * _1MB) + #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) @@ -46,8 +50,9 @@ #endif /* !_M_AMD64 */ /* Make the code cleaner with some definitions for size multiples */ -#define _1KB (1024) +#define _1KB (1024u) #define _1MB (1024 * _1KB) +#define _1GB (1024 * _1MB) /* Area mapped by a PDE */ #define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) @@ -199,6 +204,9 @@ MmProtectToPteMask[32] = #define MI_IS_SYSTEM_PAGE_TABLE_ADDRESS(Address) \ (((Address) >= (PVOID)MiAddressToPte(MmSystemRangeStart)) && ((Address) <= (PVOID)PTE_TOP)) +#define MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address) \ + (((PVOID)(Address) >= (PVOID)PTE_BASE) && ((PVOID)(Address) <= (PVOID)MmHyperSpaceEnd)) + // // Corresponds to MMPTE_SOFTWARE.Protection // @@ -608,6 +616,165 @@ MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, *PointerPte = InvalidPte; } +// +// Checks if the thread already owns a working set +// +FORCEINLINE +BOOLEAN +MM_ANY_WS_LOCK_HELD(IN PETHREAD Thread) +{ + /* If any of these are held, return TRUE */ + return ((Thread->OwnsProcessWorkingSetExclusive) || + (Thread->OwnsProcessWorkingSetShared) || + (Thread->OwnsSystemWorkingSetExclusive) || + (Thread->OwnsSystemWorkingSetShared) || + (Thread->OwnsSessionWorkingSetExclusive) || + (Thread->OwnsSessionWorkingSetShared)); +} + +// +// Checks if the process owns the working set lock +// +FORCEINLINE +BOOLEAN +MI_WS_OWNER(IN PEPROCESS Process) +{ + /* Check if this process is the owner, and that the thread owns the WS */ + return ((KeGetCurrentThread()->ApcState.Process == &Process->Pcb) && + ((PsGetCurrentThread()->OwnsProcessWorkingSetExclusive) || + (PsGetCurrentThread()->OwnsProcessWorkingSetShared))); +} + +// +// Locks the working set for the given process +// +FORCEINLINE +VOID +MiLockProcessWorkingSet(IN PEPROCESS Process, + IN PETHREAD Thread) +{ + /* Shouldn't already be owning the process working set */ + ASSERT(Thread->OwnsProcessWorkingSetShared == FALSE); + ASSERT(Thread->OwnsProcessWorkingSetExclusive == FALSE); + + /* Block APCs, make sure that still nothing is already held */ + KeEnterGuardedRegion(); + ASSERT(!MM_ANY_WS_LOCK_HELD(Thread)); + + /* FIXME: Actually lock it (we can't because Vm is used by MAREAs) */ + + /* FIXME: This also can't be checked because Vm is used by MAREAs) */ + //ASSERT(Process->Vm.Flags.AcquiredUnsafe == 0); + + /* Okay, now we can own it exclusively */ + ASSERT(Thread->OwnsProcessWorkingSetExclusive == FALSE); + Thread->OwnsProcessWorkingSetExclusive = TRUE; +} + +// +// Unlocks the working set for the given process +// +FORCEINLINE +VOID +MiUnlockProcessWorkingSet(IN PEPROCESS Process, + IN PETHREAD Thread) +{ + /* Make sure this process really is owner, and it was a safe acquisition */ + ASSERT(MI_WS_OWNER(Process)); + /* This can't be checked because Vm is used by MAREAs) */ + //ASSERT(Process->Vm.Flags.AcquiredUnsafe == 0); + + /* The thread doesn't own it anymore */ + ASSERT(Thread->OwnsProcessWorkingSetExclusive == TRUE); + Thread->OwnsProcessWorkingSetExclusive = FALSE; + + /* FIXME: Actually release it (we can't because Vm is used by MAREAs) */ + + /* Unblock APCs */ + KeLeaveGuardedRegion(); +} + +// +// Locks the working set +// +FORCEINLINE +VOID +MiLockWorkingSet(IN PETHREAD Thread, + IN PMMSUPPORT WorkingSet) +{ + /* Block APCs */ + KeEnterGuardedRegion(); + + /* Working set should be in global memory */ + ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE); + + /* Thread shouldn't already be owning something */ + ASSERT(!MM_ANY_WS_LOCK_HELD(Thread)); + + /* FIXME: Actually lock it (we can't because Vm is used by MAREAs) */ + + /* Which working set is this? */ + if (WorkingSet == &MmSystemCacheWs) + { + /* Own the system working set */ + ASSERT((Thread->OwnsSystemWorkingSetExclusive == FALSE) && + (Thread->OwnsSystemWorkingSetShared == FALSE)); + Thread->OwnsSystemWorkingSetExclusive = TRUE; + } + else if (WorkingSet->Flags.SessionSpace) + { + /* We don't implement this yet */ + UNIMPLEMENTED; + while (TRUE); + } + else + { + /* Own the process working set */ + ASSERT((Thread->OwnsProcessWorkingSetExclusive == FALSE) && + (Thread->OwnsProcessWorkingSetShared == FALSE)); + Thread->OwnsProcessWorkingSetExclusive = TRUE; + } +} + +// +// Unlocks the working set +// +FORCEINLINE +VOID +MiUnlockWorkingSet(IN PETHREAD Thread, + IN PMMSUPPORT WorkingSet) +{ + /* Working set should be in global memory */ + ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE); + + /* Which working set is this? */ + if (WorkingSet == &MmSystemCacheWs) + { + /* Release the system working set */ + ASSERT((Thread->OwnsSystemWorkingSetExclusive == TRUE) || + (Thread->OwnsSystemWorkingSetShared == TRUE)); + Thread->OwnsSystemWorkingSetExclusive = FALSE; + } + else if (WorkingSet->Flags.SessionSpace) + { + /* We don't implement this yet */ + UNIMPLEMENTED; + while (TRUE); + } + else + { + /* Release the process working set */ + ASSERT((Thread->OwnsProcessWorkingSetExclusive) || + (Thread->OwnsProcessWorkingSetShared)); + Thread->OwnsProcessWorkingSetExclusive = FALSE; + } + + /* FIXME: Actually release it (we can't because Vm is used by MAREAs) */ + + /* Unblock APCs */ + KeLeaveGuardedRegion(); +} + NTSTATUS NTAPI MmArmInitSystem( diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 5b90e2e02a7..f595ece9a0f 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -328,6 +328,26 @@ PFN_NUMBER MmSystemCacheWsMaximum = 350; /* FIXME: Move to cache/working set code later */ BOOLEAN MmLargeSystemCache; +/* + * This value determines in how many fragments/chunks the subsection prototype + * PTEs should be allocated when mapping a section object. It is configurable in + * the registry through the MapAllocationFragment parameter. + * + * The default is 64KB on systems with more than 1GB of RAM, 32KB on systems with + * more than 256MB of RAM, and 16KB on systems with less than 256MB of RAM. + * + * The maximum it can be set to is 2MB, and the minimum is 4KB. + */ +SIZE_T MmAllocationFragment; + +/* + * These two values track how much virtual memory can be committed, and when + * expansion should happen. + */ + // FIXME: They should be moved elsewhere since it's not an "init" setting? +SIZE_T MmTotalCommitLimit; +SIZE_T MmTotalCommitLimitMaximum; + /* PRIVATE FUNCTIONS **********************************************************/ // @@ -1799,6 +1819,44 @@ MmArmInitSystem(IN ULONG Phase, DPRINT("System PTE count has been tuned to %d (%d bytes)\n", MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + + /* Initialize the working set lock */ + ExInitializePushLock((PULONG_PTR)&MmSystemCacheWs.WorkingSetMutex); + + /* Set commit limit */ + MmTotalCommitLimit = 2 * _1GB; + MmTotalCommitLimitMaximum = MmTotalCommitLimit; + + /* Has the allocation fragment been setup? */ + if (!MmAllocationFragment) + { + /* Use the default value */ + MmAllocationFragment = MI_ALLOCATION_FRAGMENT; + if (PageCount < ((256 * _1MB) / PAGE_SIZE)) + { + /* On memory systems with less than 256MB, divide by 4 */ + MmAllocationFragment = MI_ALLOCATION_FRAGMENT / 4; + } + else if (PageCount < (_1GB / PAGE_SIZE)) + { + /* On systems with less than 1GB, divide by 2 */ + MmAllocationFragment = MI_ALLOCATION_FRAGMENT / 2; + } + } + else + { + /* Convert from 1KB fragments to pages */ + MmAllocationFragment *= _1KB; + MmAllocationFragment = ROUND_TO_PAGES(MmAllocationFragment); + + /* Don't let it past the maximum */ + MmAllocationFragment = min(MmAllocationFragment, + MI_MAX_ALLOCATION_FRAGMENT); + + /* Don't let it too small either */ + MmAllocationFragment = max(MmAllocationFragment, + MI_MIN_ALLOCATION_FRAGMENT); + } /* Initialize the platform-specific parts */ MiInitMachineDependent(LoaderBlock); @@ -1889,12 +1947,12 @@ MmArmInitSystem(IN ULONG Phase, /* FIXME: Call out into Driver Verifier for initialization */ /* Check how many pages the system has */ - if (MmNumberOfPhysicalPages <= (13 * _1MB)) + if (MmNumberOfPhysicalPages <= ((13 * _1MB) / PAGE_SIZE)) { /* Set small system */ MmSystemSize = MmSmallSystem; } - else if (MmNumberOfPhysicalPages <= (19 * _1MB)) + else if (MmNumberOfPhysicalPages <= ((19 * _1MB) / PAGE_SIZE)) { /* Set small system and add 100 pages for the cache */ MmSystemSize = MmSmallSystem; @@ -1986,6 +2044,14 @@ MmArmInitSystem(IN ULONG Phase, return FALSE; } + /* Initialize the system cache */ + //MiInitializeSystemCache(MmSystemCacheWsMinimum, MmAvailablePages); + + /* Update the commit limit */ + MmTotalCommitLimit = MmAvailablePages; + if (MmTotalCommitLimit > 1024) MmTotalCommitLimit -= 1024; + MmTotalCommitLimitMaximum = MmTotalCommitLimit; + /* Size up paged pool and build the shadow system page directory */ MiBuildPagedPool(); diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index eeb82a7712f..f4e00396ec3 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -297,7 +297,9 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, PMMPDE PointerPde; MMPTE TempPte; PETHREAD CurrentThread; + PEPROCESS CurrentProcess; NTSTATUS Status; + PMMSUPPORT WorkingSet; DPRINT("ARM3 FAULT AT: %p\n", Address); // @@ -392,7 +394,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, // // Check for a fault on the page table or hyperspace itself // - if ((Address >= (PVOID)PTE_BASE) && (Address <= MmHyperSpaceEnd)) + if (MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address)) { // // This might happen...not sure yet @@ -415,17 +417,13 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return STATUS_ACCESS_VIOLATION; } - // - // Now we must raise to APC_LEVEL and mark the thread as owner - // We don't actually implement a working set pushlock, so this is only - // for internal consistency (and blocking APCs) - // - KeRaiseIrql(APC_LEVEL, &LockIrql); + /* In this path, we are using the system working set */ CurrentThread = PsGetCurrentThread(); - KeEnterGuardedRegion(); - ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && - (CurrentThread->OwnsSystemWorkingSetShared == 0)); - CurrentThread->OwnsSystemWorkingSetExclusive = 1; + WorkingSet = &MmSystemCacheWs; + + /* Acquire it */ + KeRaiseIrql(APC_LEVEL, &LockIrql); + MiLockWorkingSet(CurrentThread, WorkingSet); // // Re-read PTE now that the IRQL has been raised @@ -445,6 +443,10 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return STATUS_ACCESS_VIOLATION; } + /* Release the working set */ + MiUnlockWorkingSet(CurrentThread, WorkingSet); + KeLowerIrql(LockIrql); + // // Otherwise, the PDE was probably invalid, and all is good now // @@ -472,13 +474,10 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, NULL, TrapInformation, NULL); - - // - // Re-enable APCs - // + + /* Release the working set */ ASSERT(KeAreAllApcsDisabled() == TRUE); - CurrentThread->OwnsSystemWorkingSetExclusive = 0; - KeLeaveGuardedRegion(); + MiUnlockWorkingSet(CurrentThread, WorkingSet); KeLowerIrql(LockIrql); // @@ -488,9 +487,17 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return Status; } - // - // DIE DIE DIE - // + /* This is a user fault */ + CurrentThread = PsGetCurrentThread(); + CurrentProcess = PsGetCurrentProcess(); + + /* Lock the working set */ + MiLockProcessWorkingSet(CurrentProcess, CurrentThread); + + /* Do something */ + + /* Release the working set */ + MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); DPRINT1("WARNING: USER MODE FAULT IN ARM3???\n"); return STATUS_ACCESS_VIOLATION; } diff --git a/reactos/ntoskrnl/mm/ARM3/sysldr.c b/reactos/ntoskrnl/mm/ARM3/sysldr.c index 7706a9f16e3..b9fce2d56e9 100644 --- a/reactos/ntoskrnl/mm/ARM3/sysldr.c +++ b/reactos/ntoskrnl/mm/ARM3/sysldr.c @@ -2230,7 +2230,7 @@ MiSetPagingOfDriver(IN PMMPTE PointerPte, IN PMMPTE LastPte) { PVOID ImageBase; - PETHREAD CurrentThread; + PETHREAD CurrentThread = PsGetCurrentThread(); PFN_NUMBER PageCount = 0, PageFrameIndex; PMMPFN Pfn1; PAGED_CODE(); @@ -2242,12 +2242,8 @@ MiSetPagingOfDriver(IN PMMPTE PointerPte, /* If this is a large page, it's stuck in physical memory */ if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; - /* We should lock the system working set -- we don't have one yet, so just be consistent */ - CurrentThread = PsGetCurrentThread(); - KeEnterGuardedRegion(); - ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && - (CurrentThread->OwnsSystemWorkingSetShared == 0)); - CurrentThread->OwnsSystemWorkingSetExclusive = 1; + /* Lock the working set */ + MiLockWorkingSet(CurrentThread, &MmSystemCacheWs); /* Loop the PTEs */ while (PointerPte <= LastPte) @@ -2267,10 +2263,8 @@ MiSetPagingOfDriver(IN PMMPTE PointerPte, PointerPte++; } - /* Release the working set "lock" */ - ASSERT(KeAreAllApcsDisabled() == TRUE); - CurrentThread->OwnsSystemWorkingSetExclusive = 0; - KeLeaveGuardedRegion(); + /* Release the working set */ + MiUnlockWorkingSet(CurrentThread, &MmSystemCacheWs); /* Do we have any driver pages? */ if (PageCount) diff --git a/reactos/ntoskrnl/mm/ARM3/virtual.c b/reactos/ntoskrnl/mm/ARM3/virtual.c index fd7f0e176be..c878c1542d4 100644 --- a/reactos/ntoskrnl/mm/ARM3/virtual.c +++ b/reactos/ntoskrnl/mm/ARM3/virtual.c @@ -37,23 +37,14 @@ MiDeleteSystemPageableVm(IN PMMPTE PointerPte, OUT PPFN_NUMBER ValidPages) { PFN_NUMBER ActualPages = 0; - PETHREAD CurrentThread; + PETHREAD CurrentThread = PsGetCurrentThread(); PMMPFN Pfn1, Pfn2; PFN_NUMBER PageFrameIndex, PageTableIndex; - KIRQL OldIrql, LockIrql; + KIRQL OldIrql; ASSERT(KeGetCurrentIrql() <= APC_LEVEL); - /* - * Now we must raise to APC_LEVEL and mark the thread as owner - * We don't actually implement a working set pushlock, so this is only - * for internal consistency (and blocking APCs) - */ - KeRaiseIrql(APC_LEVEL, &LockIrql); - CurrentThread = PsGetCurrentThread(); - KeEnterGuardedRegion(); - ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && - (CurrentThread->OwnsSystemWorkingSetShared == 0)); - CurrentThread->OwnsSystemWorkingSetExclusive = 1; + /* Lock the system working set */ + MiLockWorkingSet(CurrentThread, &MmSystemCacheWs); /* Loop all pages */ while (PageCount) @@ -124,11 +115,8 @@ MiDeleteSystemPageableVm(IN PMMPTE PointerPte, PageCount--; } - /* Re-enable APCs */ - ASSERT(KeAreAllApcsDisabled() == TRUE); - CurrentThread->OwnsSystemWorkingSetExclusive = 0; - KeLeaveGuardedRegion(); - KeLowerIrql(LockIrql); + /* Release the working set */ + MiUnlockWorkingSet(CurrentThread, &MmSystemCacheWs); /* Flush the entire TLB */ KeFlushEntireTb(TRUE, TRUE); From 9a28440154315b84353feea65481f9ac00917331 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Jul 2010 18:29:35 +0000 Subject: [PATCH 40/82] [NETCFGX] - Start the TCP/IP driver after we install a network adapter - This fixes the major bug that blocks Live CD networking but we still have some DHCP issues (DHCP starts and fails before the NIC and TCP/IP has been installed) and some other adapter detection issues that I need to look into but this is a good first step svn path=/trunk/; revision=48188 --- reactos/dll/win32/netcfgx/netcfgx.c | 12 ++++++++++++ reactos/dll/win32/netcfgx/precomp.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/reactos/dll/win32/netcfgx/netcfgx.c b/reactos/dll/win32/netcfgx/netcfgx.c index ba89dff123a..175e208ddaf 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.c +++ b/reactos/dll/win32/netcfgx/netcfgx.c @@ -290,6 +290,7 @@ InstallAdditionalServices( IN HWND hWnd) { BOOL ret; + UNICODE_STRING TcpipServicePath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip"); /* Install TCP/IP protocol */ ret = InstallInfSection( @@ -302,6 +303,17 @@ InstallAdditionalServices( DPRINT("InstallInfSection() failed with error 0x%lx\n", GetLastError()); return GetLastError(); } + else if (ret) + { + /* Start the TCP/IP driver */ + ret = NtLoadDriver(&TcpipServicePath); + if (ret) + { + /* This isn't really fatal but we want to warn anyway */ + DPRINT1("NtLoadDriver(TCPIP) failed with NTSTATUS 0x%lx\n", (NTSTATUS)ret); + } + } + /* You can add here more clients (SMB...) and services (DHCP server...) */ diff --git a/reactos/dll/win32/netcfgx/precomp.h b/reactos/dll/win32/netcfgx/precomp.h index 3d38dd2b698..6215e39f4a8 100644 --- a/reactos/dll/win32/netcfgx/precomp.h +++ b/reactos/dll/win32/netcfgx/precomp.h @@ -5,7 +5,10 @@ #define NONAMELESSUNION #define NONAMELESSSTRUCT +#define WIN32_NO_STATUS #include +#define NTOS_MODE_USER +#include #include #include #include From 7fa909a601d3312ba4997e878a1bde306486cf2b Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 18:37:27 +0000 Subject: [PATCH 41/82] [NTOS]: Add support for handling a very specific type of user-fault on ARM3 memory: memory belonging to a VAD allocation made for a PEB/TEB (read-write) that hasn't yet been allocated. [NTOS]: Define the demand-zero PDE template. svn path=/trunk/; revision=48190 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 3 + reactos/ntoskrnl/mm/ARM3/miarm.h | 1 + reactos/ntoskrnl/mm/ARM3/pagfault.c | 126 ++++++++++++++++++++++++++- 3 files changed, 127 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 7b7f6c4e7db..a42a24e8621 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -22,6 +22,9 @@ 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}; +/* Template PDE for a demand-zero page */ +MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; + /* PRIVATE FUNCTIONS **********************************************************/ VOID diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 23271256c91..8658979bea4 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -377,6 +377,7 @@ typedef struct _MI_LARGE_PAGE_RANGES extern MMPTE HyperTemplatePte; extern MMPDE ValidKernelPde; extern MMPTE ValidKernelPte; +extern MMPDE DemandZeroPde; extern BOOLEAN MmLargeSystemCache; extern BOOLEAN MmZeroPageFile; extern BOOLEAN MmProtectFreedNonPagedPool; diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index f4e00396ec3..34fb242d87e 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -20,6 +20,34 @@ /* PRIVATE FUNCTIONS **********************************************************/ +PMMPTE +NTAPI +MiCheckVirtualAddress(IN PVOID VirtualAddress, + OUT PULONG ProtectCode, + OUT PMMVAD *ProtoVad) +{ + PMMVAD Vad; + + /* No prototype/section support for now */ + *ProtoVad = NULL; + + /* Only valid for user VADs for now */ + ASSERT(VirtualAddress <= MM_HIGHEST_USER_ADDRESS); + + /* Find the VAD, it must exist, since we only handle PEB/TEB */ + Vad = MiLocateAddress(VirtualAddress); + ASSERT(Vad); + + /* This must be a TEB/PEB VAD */ + ASSERT(Vad->u.VadFlags.PrivateMemory == TRUE); + ASSERT(Vad->u.VadFlags.MemCommit == TRUE); + ASSERT(Vad->u.VadFlags.VadType == VadNone); + + /* Return the protection on it */ + *ProtectCode = Vad->u.VadFlags.Protection; + return NULL; +} + NTSTATUS FASTCALL MiCheckPdeForPagedPool(IN PVOID Address) @@ -300,6 +328,9 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, PEPROCESS CurrentProcess; NTSTATUS Status; PMMSUPPORT WorkingSet; + ULONG ProtectionCode; + PMMVAD Vad; + PFN_NUMBER PageFrameIndex; DPRINT("ARM3 FAULT AT: %p\n", Address); // @@ -494,12 +525,101 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Lock the working set */ MiLockProcessWorkingSet(CurrentProcess, CurrentThread); - /* Do something */ + /* First things first, is the PDE valid? */ + ASSERT(PointerPde != MiAddressToPde(PTE_BASE)); + ASSERT(PointerPde->u.Hard.LargePage == 0); + if (PointerPde->u.Hard.Valid == 0) + { + /* Right now, we only handle scenarios where the PDE is totally empty */ + ASSERT(PointerPde->u.Long == 0); + + /* Check if this address range belongs to a valid allocation (VAD) */ + MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); + + /* Right now, we expect a valid protection mask on the VAD */ + ASSERT(ProtectionCode != MM_NOACCESS); + + /* Make the PDE demand-zero */ + MI_WRITE_INVALID_PTE(PointerPde, DemandZeroPde); + + /* And go dispatch the fault on the PDE. This should handle the demand-zero */ + Status = MiDispatchFault(TRUE, + PointerPte, + PointerPde, + NULL, + FALSE, + PsGetCurrentProcess(), + TrapInformation, + NULL); + + /* We should come back with APCs enabled, and with a valid PDE */ + ASSERT(KeAreAllApcsDisabled() == TRUE); + ASSERT(PointerPde->u.Hard.Valid == 1); + } + + /* Now capture the PTE. We only handle cases where it's totally empty */ + TempPte = *PointerPte; + ASSERT(TempPte.u.Long == 0); + + /* Check if this address range belongs to a valid allocation (VAD) */ + MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); + + /* Right now, we expect a valid protection mask on the VAD */ + ASSERT(ProtectionCode != MM_NOACCESS); + PointerPte->u.Soft.Protection = ProtectionCode; + + /* Lock the PFN database since we're going to grab a page */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Grab a page out of there. Later we should grab a colored zero page */ + PageFrameIndex = MiRemoveAnyPage(0); + ASSERT(PageFrameIndex); + + /* Release the lock since we need to do some zeroing */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Zero out the page, since it's for user-mode */ + MiZeroPfn(PageFrameIndex); + + /* Grab the lock again so we can initialize the PFN entry */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Initialize the PFN entry now */ + MiInitializePfn(PageFrameIndex, PointerPte, 1); + + /* And we're done with the lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* One more demand-zero fault */ + InterlockedIncrement(&KeGetCurrentPrcb()->MmDemandZeroCount); + + /* Was the fault on an actual user page, or a kernel page for the user? */ + if (PointerPte <= MiHighestUserPte) + { + /* User fault, build a user PTE */ + MI_MAKE_HARDWARE_PTE_USER(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameIndex); + } + else + { + /* Session, kernel, or user PTE, figure it out and build it */ + MI_MAKE_HARDWARE_PTE(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameIndex); + } + + /* Write the dirty bit for writeable pages */ + if (TempPte.u.Hard.Write) TempPte.u.Hard.Dirty = TRUE; + + /* And now write down the PTE, making the address valid */ + MI_WRITE_VALID_PTE(PointerPte, TempPte); /* Release the working set */ MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); - DPRINT1("WARNING: USER MODE FAULT IN ARM3???\n"); - return STATUS_ACCESS_VIOLATION; + return STATUS_PAGE_FAULT_DEMAND_ZERO; } /* EOF */ From 135986ec2ef356b3627e8bc9460e43b11cab7fbc Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 18:55:36 +0000 Subject: [PATCH 42/82] [NTOS]: To Timo, with Love (make System PTEs work on x64). svn path=/trunk/; revision=48192 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 3 +++ reactos/ntoskrnl/mm/ARM3/syspte.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 8658979bea4..a1ec45d89df 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -33,6 +33,9 @@ #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000 +// on AMD64 this would be MiAddressToPte(MM_KSEG0_BASE) +#define MI_SYSTEM_PTE_BASE (PVOID)MiAddressToPte(NULL) + #define MI_MIN_SECONDARY_COLORS 8 #define MI_SECONDARY_COLORS 64 #define MI_MAX_SECONDARY_COLORS 1024 diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c index bbb385e5702..a70ebda3c07 100644 --- a/reactos/ntoskrnl/mm/ARM3/syspte.c +++ b/reactos/ntoskrnl/mm/ARM3/syspte.c @@ -378,7 +378,7 @@ MiInitializeSystemPtes(IN PMMPTE StartingPte, // // Set the starting and ending PTE addresses for this space // - MmSystemPteBase = (PVOID)PTE_BASE; + MmSystemPteBase = MI_SYSTEM_PTE_BASE; MmSystemPtesStart[PoolType] = StartingPte; MmSystemPtesEnd[PoolType] = StartingPte + NumberOfPtes - 1; DPRINT("System PTE space for %d starting at: %p and ending at: %p\n", From 92d6d7210c9186ea0e517dc9d5c4c526b2b37df9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Jul 2010 19:01:49 +0000 Subject: [PATCH 43/82] [NDIS] - Refresh the protocol bindings after a new miniport is added - Adapters added after boot work now - One step closer to Live CD networking svn path=/trunk/; revision=48193 --- reactos/drivers/network/ndis/include/protocol.h | 4 ++++ reactos/drivers/network/ndis/ndis/miniport.c | 13 +++++++++++++ reactos/drivers/network/ndis/ndis/protocol.c | 3 +++ 3 files changed, 20 insertions(+) diff --git a/reactos/drivers/network/ndis/include/protocol.h b/reactos/drivers/network/ndis/include/protocol.h index 99f92ea244d..171ecb6a4f2 100644 --- a/reactos/drivers/network/ndis/include/protocol.h +++ b/reactos/drivers/network/ndis/include/protocol.h @@ -69,4 +69,8 @@ NdisIPnPCancelStopDevice( NDIS_STATUS proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet); +VOID +NTAPI +ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics); + /* EOF */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 4492caffe32..b1ca384cd8d 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1778,6 +1778,8 @@ NdisIPnPStartDevice( LARGE_INTEGER Timeout; UINT MaxMulticastAddresses; ULONG BytesWritten; + PLIST_ENTRY CurrentEntry; + PPROTOCOL_BINDING ProtocolBinding; /* * Prepare wrapper context used by HW and configuration routines. @@ -2056,6 +2058,17 @@ NdisIPnPStartDevice( /* Put adapter in adapter list for this miniport */ ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock); + /* Refresh bindings for all protocols */ + CurrentEntry = ProtocolListHead.Flink; + while (CurrentEntry != &ProtocolListHead) + { + ProtocolBinding = CONTAINING_RECORD(CurrentEntry, PROTOCOL_BINDING, ListEntry); + + ndisBindMiniportsToProtocol(&NdisStatus, &ProtocolBinding->Chars); + + CurrentEntry = CurrentEntry->Flink; + } + return STATUS_SUCCESS; } diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index dd56c40bf95..381739165e4 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -1002,7 +1002,10 @@ ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTER { BIND_HANDLER BindHandler = ProtocolCharacteristics->BindAdapterHandler; if(BindHandler) + { BindHandler(Status, BindContext, &DeviceName, &RegistryPath, 0); + NDIS_DbgPrint(MIN_TRACE, ("%wZ's BindAdapter handler returned 0x%x for %wZ\n", &ProtocolCharacteristics->Name, *Status, &DeviceName)); + } else NDIS_DbgPrint(MIN_TRACE, ("No protocol bind handler specified\n")); } From 128fd3ca9284e4f4fe022cf12f3fe641f4b00e86 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 19:08:45 +0000 Subject: [PATCH 44/82] [NTOS]: Allocate the PEB at a pseudo-random address just like Windows XP SP2 and later, to prevent certain kinds of exploits. [NTOS]: Allocate PEB and TEB using VADs! The user-mode fault handler seems to work fine, and I could find no regressions. This is the beginning of the end for MAREAs for VM allocations (they will remain for sections). svn path=/trunk/; revision=48194 --- reactos/ntoskrnl/mm/ARM3/procsup.c | 125 ++++++++++++++++++++++++++--- reactos/ntoskrnl/mm/procsup.c | 74 ----------------- 2 files changed, 114 insertions(+), 85 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index d2ea798914d..75c25c681cc 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -18,11 +18,6 @@ extern MM_SYSTEMSIZE MmSystemSize; -PVOID -NTAPI -MiCreatePebOrTeb(PEPROCESS Process, - PVOID BaseAddress); - /* PRIVATE FUNCTIONS **********************************************************/ VOID @@ -48,6 +43,116 @@ MiRosTakeOverPebTebRanges(IN PEPROCESS Process) ASSERT(NT_SUCCESS(Status)); } +NTSTATUS +NTAPI +MiCreatePebOrTeb(IN PEPROCESS Process, + IN ULONG Size, + OUT PULONG_PTR Base) +{ + PETHREAD Thread = PsGetCurrentThread(); + PMMVAD_LONG Vad; + NTSTATUS Status; + ULONG RandomCoeff; + ULONG_PTR StartAddress, EndAddress; + LARGE_INTEGER CurrentTime; + + /* Allocate a VAD */ + Vad = ExAllocatePoolWithTag(NonPagedPool, sizeof(MMVAD_LONG), 'ldaV'); + if (!Vad) return STATUS_NO_MEMORY; + + /* Setup the primary flags with the size, and make it commited, private, RW */ + Vad->u.LongFlags = 0; + Vad->u.VadFlags.CommitCharge = BYTES_TO_PAGES(Size); + Vad->u.VadFlags.MemCommit = TRUE; + Vad->u.VadFlags.PrivateMemory = TRUE; + Vad->u.VadFlags.Protection = MM_READWRITE; + Vad->u.VadFlags.NoChange = TRUE; + + /* Setup the secondary flags to make it a secured, writable, long VAD */ + Vad->u2.LongFlags2 = 0; + Vad->u2.VadFlags2.OneSecured = TRUE; + Vad->u2.VadFlags2.LongVad = TRUE; + Vad->u2.VadFlags2.ReadOnly = FALSE; + + /* Lock the process address space */ + KeAcquireGuardedMutex(&Process->AddressCreationLock); + + /* Check if this is a PEB creation */ + if (Size == sizeof(PEB)) + { + /* Start at the highest valid address */ + StartAddress = (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1; + + /* Select the random coefficient */ + KeQueryTickCount(&CurrentTime); + CurrentTime.LowPart &= ((64 * _1KB) >> PAGE_SHIFT) - 1; + if (CurrentTime.LowPart <= 1) CurrentTime.LowPart = 2; + RandomCoeff = CurrentTime.LowPart << PAGE_SHIFT; + + /* Select the highest valid address minus the random coefficient */ + StartAddress -= RandomCoeff; + EndAddress = StartAddress + ROUND_TO_PAGES(Size) - 1; + + /* See if this VA range can be obtained */ + if (!MiCheckForConflictingNode(StartAddress >> PAGE_SHIFT, + EndAddress >> PAGE_SHIFT, + &Process->VadRoot)) + { + /* No conflict, use this address */ + *Base = StartAddress; + goto AfterFound; + } + } + + /* For TEBs, or if a PEB location couldn't be found, scan the VAD root */ + Status = MiFindEmptyAddressRangeDownTree(ROUND_TO_PAGES(Size), + (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1, + PAGE_SIZE, + &Process->VadRoot, + Base); + ASSERT(NT_SUCCESS(Status)); + +AfterFound: + /* Validate that it came from the VAD ranges */ + ASSERT(*Base >= (ULONG_PTR)MI_LOWEST_VAD_ADDRESS); + + /* Build the rest of the VAD now */ + Vad->StartingVpn = (*Base) >> PAGE_SHIFT; + Vad->EndingVpn = ((*Base) + Size - 1) >> PAGE_SHIFT; + Vad->u3.Secured.StartVpn = *Base; + Vad->u3.Secured.EndVpn = (Vad->EndingVpn << PAGE_SHIFT) | (PAGE_SIZE - 1); + + /* FIXME: Should setup VAD bitmap */ + Status = STATUS_SUCCESS; + + /* Pretend as if we own the working set */ + MiLockProcessWorkingSet(Process, Thread); + + /* Insert the VAD */ + ASSERT(Vad->EndingVpn >= Vad->StartingVpn); + Process->VadRoot.NodeHint = Vad; + MiInsertNode((PVOID)Vad, &Process->VadRoot); + + /* Release the working set */ + MiUnlockProcessWorkingSet(Process, Thread); + + /* Release the address space lock */ + KeReleaseGuardedMutex(&Process->AddressCreationLock); + + /* Return the status */ + DPRINT("Allocated PEB/TEB at: 0x%p for %16s\n", *Base, Process->ImageFileName); + return Status; +} + +VOID +NTAPI +MmDeleteTeb(IN PEPROCESS Process, + IN PTEB Teb) +{ + /* Oops J */ + DPRINT("Leaking 4KB at thread exit, this will be fixed later\n"); +} + VOID NTAPI MmDeleteKernelStack(IN PVOID StackBase, @@ -415,9 +520,8 @@ MmCreatePeb(IN PEPROCESS Process, // // Allocate the PEB // - Peb = MiCreatePebOrTeb(Process, - (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); - if (!Peb) return STATUS_INSUFFICIENT_RESOURCES; + Status = MiCreatePebOrTeb(Process, sizeof(PEB), (PULONG_PTR)&Peb); + ASSERT(NT_SUCCESS(Status)); // // Map NLS Tables @@ -651,9 +755,8 @@ MmCreateTeb(IN PEPROCESS Process, // // Allocate the TEB // - Teb = MiCreatePebOrTeb(Process, - (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); - if (!Teb) return STATUS_INSUFFICIENT_RESOURCES; + Status = MiCreatePebOrTeb(Process, sizeof(TEB), (PULONG_PTR)&Teb); + ASSERT(NT_SUCCESS(Status)); // // Use SEH in case we can't load the TEB diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index 1e5bd9afb2d..fce21f5bd6f 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -17,80 +17,6 @@ VOID NTAPI MiRosTakeOverPebTebRanges(IN PEPROCESS Process); /* FUNCTIONS *****************************************************************/ -PVOID -NTAPI -MiCreatePebOrTeb(PEPROCESS Process, - PVOID BaseAddress) -{ - NTSTATUS Status; - PMMSUPPORT ProcessAddressSpace = &Process->Vm; - PMEMORY_AREA MemoryArea; - PHYSICAL_ADDRESS BoundaryAddressMultiple; - PVOID AllocatedBase = BaseAddress; - BoundaryAddressMultiple.QuadPart = 0; - - /* Acquire the Lock */ - MmLockAddressSpace(ProcessAddressSpace); - - /* - * Create a Peb or Teb. - * Loop until it works, decreasing by PAGE_SIZE each time. The logic here - * is that a PEB allocation should never fail since the address is free, - * while TEB allocation can fail, and we should simply try the address - * below. Is there a nicer way of doing this automagically? (ie: findning) - * a gap region? -- Alex - */ - do { - DPRINT("Trying to allocate: %x\n", AllocatedBase); - Status = MmCreateMemoryArea(ProcessAddressSpace, - MEMORY_AREA_PEB_OR_TEB, - &AllocatedBase, - PAGE_SIZE, - PAGE_READWRITE, - &MemoryArea, - TRUE, - 0, - BoundaryAddressMultiple); - AllocatedBase = RVA(AllocatedBase, -PAGE_SIZE); - } while (Status != STATUS_SUCCESS); - - /* Initialize the Region */ - MmInitializeRegion(&MemoryArea->Data.VirtualMemoryData.RegionListHead, - PAGE_SIZE, - MEM_COMMIT, - PAGE_READWRITE); - - /* Reserve the pages */ - MmReserveSwapPages(PAGE_SIZE); - - /* Unlock Address Space */ - DPRINT("Returning\n"); - MmUnlockAddressSpace(ProcessAddressSpace); - return RVA(AllocatedBase, PAGE_SIZE); -} - -VOID -NTAPI -MmDeleteTeb(PEPROCESS Process, - PTEB Teb) -{ - PMMSUPPORT ProcessAddressSpace = &Process->Vm; - PMEMORY_AREA MemoryArea; - - /* Lock the Address Space */ - MmLockAddressSpace(ProcessAddressSpace); - - MemoryArea = MmLocateMemoryAreaByAddress(ProcessAddressSpace, (PVOID)Teb); - if (MemoryArea) - { - /* Delete the Teb */ - MmFreeVirtualMemory(Process, MemoryArea); - } - - /* Unlock the Address Space */ - MmUnlockAddressSpace(ProcessAddressSpace); -} - NTSTATUS NTAPI MmInitializeHandBuiltProcess2(IN PEPROCESS Process) From cee7a2a71e0b613250ac9a0b1b80173ba2843318 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Jul 2010 19:37:33 +0000 Subject: [PATCH 45/82] [DHCPCSVC] - Add a hack so we wait for TCP/IP to get ready and bind to adapters instead of failing immediately after the first probe - Live CD and 2nd stage setup now have fully functional networking :) svn path=/trunk/; revision=48195 --- reactos/dll/win32/dhcpcsvc/dhcp/adapter.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c index b6801e5b221..075e080026a 100644 --- a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c +++ b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c @@ -233,7 +233,7 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) { PDHCP_ADAPTER Adapter = NULL; HANDLE AdapterStateChangedEvent = (HANDLE)Context; struct interface_info *ifi = NULL; - int i; + int i, AdapterCount = 0; /* FIXME: Kill this thread when the service is stopped */ @@ -248,7 +248,11 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) { } if( Error != NO_ERROR ) - break; + { + /* HACK: We are waiting until TCP/IP starts */ + Sleep(2000); + continue; + } DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries)); @@ -347,6 +351,7 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) { ApiLock(); InsertTailList( &AdapterList, &Adapter->ListEntry ); DbgPrint("DHCPCSVC: Discovered new adapter [%s]\n", Adapter->DhclientInfo.name); + AdapterCount++; SetEvent(AdapterStateChangedEvent); ApiUnlock(); } else { free( Adapter ); Adapter = 0; } @@ -356,7 +361,17 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) { DH_DbgPrint(MID_TRACE,("Adapter %d was rejected\n", Table->table[i].dwIndex)); } - } while ((Error = NotifyAddrChange(NULL, NULL)) == NO_ERROR); + Error = NotifyAddrChange(NULL, NULL); +#if 0 + if (Error != NO_ERROR) + break; +#else + if (AdapterCount) + break; + else + Sleep(3000); +#endif + } while (TRUE); DbgPrint("DHCPCSVC: Adapter discovery thread is terminating! (Error: %d)\n", Error); From f907eeb4f97226e91b3178a451ab10c6f342b388 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 20:46:19 +0000 Subject: [PATCH 46/82] [NTOS]: Antique leftover, initialize the shared user data page with MI_MAKE_HARDWARE_PTE_KERNEL svn path=/trunk/; revision=48197 --- reactos/ntoskrnl/mm/mminit.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 993c8fa4390..669870dcb2b 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -413,11 +413,11 @@ MmInitSystem(IN ULONG Phase, ASSERT(PointerPte->u.Hard.Valid == 1); PageFrameNumber = PFN_FROM_PTE(PointerPte); - // - // Now write a copy of it - // - MI_MAKE_OWNER_PAGE(&TempPte); - TempPte.u.Hard.PageFrameNumber = PageFrameNumber; + /* Build the PTE and write it */ + MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, + PointerPte, + MM_READONLY, + PageFrameNumber); *MmSharedUserDataPte = TempPte; /* Setup the memory threshold events */ From 155c1e701b7f88969cc6ded1feaa0c4eebbd278e Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 20:46:49 +0000 Subject: [PATCH 47/82] [NTOS]: Stop handling a bunch of MEMORY_AREA_TYPEs that aren't used anymore. svn path=/trunk/; revision=48198 --- reactos/ntoskrnl/mm/virtual.c | 66 ----------------------------------- 1 file changed, 66 deletions(-) diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 8e6e845290b..0016133b807 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -75,7 +75,6 @@ MiQueryVirtualMemory(IN HANDLE ProcessHandle, switch(MemoryArea->Type) { case MEMORY_AREA_VIRTUAL_MEMORY: - case MEMORY_AREA_PEB_OR_TEB: Status = MmQueryAnonMem(MemoryArea, Address, Info, ResultLength); break; @@ -85,71 +84,6 @@ MiQueryVirtualMemory(IN HANDLE ProcessHandle, ResultLength); break; - case MEMORY_AREA_NO_ACCESS: - Info->Type = MEM_PRIVATE; - Info->State = MEM_RESERVE; - Info->Protect = MemoryArea->Protect; - Info->AllocationProtect = MemoryArea->Protect; - Info->BaseAddress = MemoryArea->StartingAddress; - Info->AllocationBase = MemoryArea->StartingAddress; - Info->RegionSize = (ULONG_PTR)MemoryArea->EndingAddress - - (ULONG_PTR)MemoryArea->StartingAddress; - Status = STATUS_SUCCESS; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - break; - - case MEMORY_AREA_SHARED_DATA: - Info->Type = MEM_PRIVATE; - Info->State = MEM_COMMIT; - Info->Protect = MemoryArea->Protect; - Info->AllocationProtect = MemoryArea->Protect; - Info->BaseAddress = MemoryArea->StartingAddress; - Info->AllocationBase = MemoryArea->StartingAddress; - Info->RegionSize = (ULONG_PTR)MemoryArea->EndingAddress - - (ULONG_PTR)MemoryArea->StartingAddress; - Status = STATUS_SUCCESS; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - break; - - case MEMORY_AREA_SYSTEM: - Info->Type = 0; - Info->State = MEM_COMMIT; - Info->Protect = MemoryArea->Protect; - Info->AllocationProtect = MemoryArea->Protect; - Info->BaseAddress = MemoryArea->StartingAddress; - Info->AllocationBase = MemoryArea->StartingAddress; - Info->RegionSize = (ULONG_PTR)MemoryArea->EndingAddress - - (ULONG_PTR)MemoryArea->StartingAddress; - Status = STATUS_SUCCESS; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - break; - - case MEMORY_AREA_KERNEL_STACK: - Info->Type = 0; - Info->State = MEM_COMMIT; - Info->Protect = MemoryArea->Protect; - Info->AllocationProtect = MemoryArea->Protect; - Info->BaseAddress = MemoryArea->StartingAddress; - Info->AllocationBase = MemoryArea->StartingAddress; - Info->RegionSize = (ULONG_PTR)MemoryArea->EndingAddress - - (ULONG_PTR)MemoryArea->StartingAddress; - Status = STATUS_SUCCESS; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - break; - - case MEMORY_AREA_PAGED_POOL: - Info->Type = 0; - Info->State = MEM_COMMIT; - Info->Protect = MemoryArea->Protect; - Info->AllocationProtect = MemoryArea->Protect; - Info->BaseAddress = MemoryArea->StartingAddress; - Info->AllocationBase = MemoryArea->StartingAddress; - Info->RegionSize = (ULONG_PTR)MemoryArea->EndingAddress - - (ULONG_PTR)MemoryArea->StartingAddress; - Status = STATUS_SUCCESS; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - break; - default: DPRINT1("unhandled memory area type: 0x%x\n", MemoryArea->Type); Status = STATUS_UNSUCCESSFUL; From 9e489a9b8e6872560496f8bb2093b3cf303a5d66 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 20:47:28 +0000 Subject: [PATCH 48/82] [NTOS]: Define the template prototype PTE. svn path=/trunk/; revision=48199 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 3 +++ reactos/ntoskrnl/mm/ARM3/miarm.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index a42a24e8621..06afaf20598 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -25,6 +25,9 @@ MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, /* Template PDE for a demand-zero page */ MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; +/* Template PTE for prototype page */ +MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | 0xFFFFF000}; + /* PRIVATE FUNCTIONS **********************************************************/ VOID diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index a1ec45d89df..e7b22e2d1d7 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -129,6 +129,7 @@ #define PTE_WRITECOPY 0x200 #define PTE_EXECUTE_READWRITE 0x0 #define PTE_EXECUTE_WRITECOPY 0x200 +#define PTE_PROTOTYPE 0x400 // // Cache flags // @@ -381,6 +382,7 @@ extern MMPTE HyperTemplatePte; extern MMPDE ValidKernelPde; extern MMPTE ValidKernelPte; extern MMPDE DemandZeroPde; +extern MMPTE PrototypePte; extern BOOLEAN MmLargeSystemCache; extern BOOLEAN MmZeroPageFile; extern BOOLEAN MmProtectFreedNonPagedPool; @@ -483,6 +485,7 @@ extern PVOID MiSessionImageEnd; extern PMMPTE MiHighestUserPte; extern PMMPDE MiHighestUserPde; extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT]; +extern PMMPTE MmSharedUserDataPte; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) From dd68882cd0582611f54c96f65ad2372fdf35fabc Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 20:48:04 +0000 Subject: [PATCH 49/82] [NTOS]: Stop handling PEB/TEB MAREAs since they're not used anymore. svn path=/trunk/; revision=48200 --- reactos/ntoskrnl/mm/rmap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/rmap.c b/reactos/ntoskrnl/mm/rmap.c index d389ab4cef8..35b4b576342 100644 --- a/reactos/ntoskrnl/mm/rmap.c +++ b/reactos/ntoskrnl/mm/rmap.c @@ -149,7 +149,7 @@ MmWritePagePhysicalAddress(PFN_NUMBER Page) Status = MmWritePageSectionView(AddressSpace, MemoryArea, Address, PageOp); } - else if ((Type == MEMORY_AREA_VIRTUAL_MEMORY) || (Type == MEMORY_AREA_PEB_OR_TEB)) + else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) { PageOp = MmGetPageOp(MemoryArea, Address < MmSystemRangeStart ? Process->UniqueProcessId : NULL, Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); @@ -274,7 +274,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) Status = MmPageOutSectionView(AddressSpace, MemoryArea, Address, PageOp); } - else if ((Type == MEMORY_AREA_VIRTUAL_MEMORY) || (Type == MEMORY_AREA_PEB_OR_TEB)) + else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) { PageOp = MmGetPageOp(MemoryArea, Address < MmSystemRangeStart ? Process->UniqueProcessId : NULL, Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); From da305551a9329fabd20a93f6b2f18b3501d1e8a5 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 20:52:23 +0000 Subject: [PATCH 50/82] Note: this patch only implements the code paths, they are not excercised yet. [NTOS]: Implement handling a very special case of "prototype PTE", the one used to map the shared user data for user-mode applications. [NTOS]: MiCheckVirtualAddress detects this (Windows behavior) and returns a prototype PTE that's marked MM_READONLY. This is our MmSharedUserDataPte from before. This gets sent to MiDispatchFault which calls MiResolveProtoPteFault to handle it. In turn, this calls MiCompleteProtoPteFault. All these code paths have heavy ASSERTions to only allow them to be hit for the shared user data page, however, in the far distant future when prototype PTEs are used for section objects, we'll at least have the right checks and code flow (many of these ASSERTions will then have to be removed). [NTOS]: The end result is that we also now have STATUS_PAGE_FAULT_TRANSITION, not just STATUS_PAGE_FAULT_DEMAND_ZERO, and that prototype PTEs are somewhat understood and some assumptions have been removed. svn path=/trunk/; revision=48201 --- reactos/ntoskrnl/mm/ARM3/pagfault.c | 265 ++++++++++++++++++++++------ 1 file changed, 210 insertions(+), 55 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 34fb242d87e..ac56738feb0 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -34,6 +34,14 @@ MiCheckVirtualAddress(IN PVOID VirtualAddress, /* Only valid for user VADs for now */ ASSERT(VirtualAddress <= MM_HIGHEST_USER_ADDRESS); + /* Special case for shared data */ + if (PAGE_ALIGN(VirtualAddress) == (PVOID)USER_SHARED_DATA) + { + /* It's a read-only page */ + *ProtectCode = MM_READONLY; + return MmSharedUserDataPte; + } + /* Find the VAD, it must exist, since we only handle PEB/TEB */ Vad = MiLocateAddress(VirtualAddress); ASSERT(Vad); @@ -242,20 +250,100 @@ MiResolveDemandZeroFault(IN PVOID Address, return STATUS_PAGE_FAULT_DEMAND_ZERO; } +NTSTATUS +NTAPI +MiCompleteProtoPteFault(IN BOOLEAN StoreInstruction, + IN PVOID Address, + IN PMMPTE PointerPte, + IN PMMPTE PointerProtoPte, + IN KIRQL OldIrql, + IN PMMPFN Pfn1) +{ + MMPTE TempPte; + PFN_NUMBER PageFrameIndex; + + /* Must be called with an valid prototype PTE, with the PFN lock held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(PointerProtoPte->u.Hard.Valid == 1); + + /* Quick-n-dirty */ + ASSERT(PointerPte->u.Soft.PageFileHigh == 0xFFFFF); + + /* Get the page */ + PageFrameIndex = PFN_FROM_PTE(PointerProtoPte); + + /* Release the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Build the user PTE */ + ASSERT(Address < MmSystemRangeStart); + MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, MM_READONLY, PageFrameIndex); + + /* Write the PTE */ + MI_WRITE_VALID_PTE(PointerPte, TempPte); + + /* Return success */ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MiResolveProtoPteFault(IN BOOLEAN StoreInstruction, + IN PVOID Address, + IN PMMPTE PointerPte, + IN PMMPTE PointerProtoPte, + IN OUT PMMPFN *OutPfn, + OUT PVOID *PageFileData, + OUT PMMPTE PteValue, + IN PEPROCESS Process, + IN KIRQL OldIrql, + IN PVOID TrapInformation) +{ + MMPTE TempPte; + PMMPFN Pfn1; + PFN_NUMBER PageFrameIndex; + + /* Must be called with an invalid, prototype PTE, with the PFN lock held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(PointerPte->u.Soft.Prototype == 1); + + /* Read the prototype PTE -- it must be valid since we only handle shared data */ + TempPte = *PointerProtoPte; + ASSERT(TempPte.u.Hard.Valid == 1); + + /* One more user of this mapped page */ + PageFrameIndex = PFN_FROM_PTE(&TempPte); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + Pfn1->u2.ShareCount++; + + /* Call it a transition */ + InterlockedIncrement(&KeGetCurrentPrcb()->MmTransitionCount); + + /* Complete the prototype PTE fault -- this will release the PFN lock */ + return MiCompleteProtoPteFault(StoreInstruction, + Address, + PointerPte, + PointerProtoPte, + OldIrql, + NULL); +} + NTSTATUS NTAPI MiDispatchFault(IN BOOLEAN StoreInstruction, IN PVOID Address, IN PMMPTE PointerPte, - IN PMMPTE PrototypePte, + IN PMMPTE PointerProtoPte, IN BOOLEAN Recursive, IN PEPROCESS Process, IN PVOID TrapInformation, IN PVOID Vad) { MMPTE TempPte; - KIRQL OldIrql; + KIRQL OldIrql, LockIrql; NTSTATUS Status; + PMMPTE SuperProtoPte; DPRINT("ARM3 Page Fault Dispatcher for address: %p in process: %p\n", Address, Process); @@ -263,17 +351,54 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, // // Make sure APCs are off and we're not at dispatch // - OldIrql = KeGetCurrentIrql (); + OldIrql = KeGetCurrentIrql(); ASSERT(OldIrql <= APC_LEVEL); - ASSERT(KeAreAllApcsDisabled () == TRUE); + ASSERT(KeAreAllApcsDisabled() == TRUE); // // Grab a copy of the PTE // TempPte = *PointerPte; - /* No prototype */ - ASSERT(PrototypePte == NULL); + /* Do we have a prototype PTE? */ + if (PointerProtoPte) + { + /* This should never happen */ + ASSERT(!MI_IS_PHYSICAL_ADDRESS(PointerProtoPte)); + + /* We currently only handle the shared user data PTE path */ + ASSERT(Address < MmSystemRangeStart); + ASSERT(PointerPte->u.Soft.Prototype == 1); + ASSERT(PointerPte->u.Soft.PageFileHigh == 0xFFFFF); + ASSERT(Vad == NULL); + + /* Lock the PFN database */ + LockIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* For the shared data page, this should be true */ + SuperProtoPte = MiAddressToPte(PointerProtoPte); + ASSERT(SuperProtoPte->u.Hard.Valid == 1); + ASSERT(TempPte.u.Hard.Valid == 0); + + /* Resolve the fault -- this will release the PFN lock */ + Status = MiResolveProtoPteFault(StoreInstruction, + Address, + PointerPte, + PointerProtoPte, + NULL, + NULL, + NULL, + Process, + LockIrql, + TrapInformation); + ASSERT(Status == STATUS_SUCCESS); + + /* Complete this as a transition fault */ + ASSERT(OldIrql == KeGetCurrentIrql()); + ASSERT(OldIrql <= APC_LEVEL); + ASSERT(KeAreAllApcsDisabled() == TRUE); + return STATUS_PAGE_FAULT_TRANSITION; + } // // The PTE must be invalid, but not totally blank @@ -321,7 +446,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, IN PVOID TrapInformation) { KIRQL OldIrql = KeGetCurrentIrql(), LockIrql; - PMMPTE PointerPte; + PMMPTE PointerPte, ProtoPte; PMMPDE PointerPde; MMPTE TempPte; PETHREAD CurrentThread; @@ -562,64 +687,94 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, ASSERT(TempPte.u.Long == 0); /* Check if this address range belongs to a valid allocation (VAD) */ - MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); - - /* Right now, we expect a valid protection mask on the VAD */ + ProtoPte = MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); ASSERT(ProtectionCode != MM_NOACCESS); - PointerPte->u.Soft.Protection = ProtectionCode; - /* Lock the PFN database since we're going to grab a page */ - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - /* Grab a page out of there. Later we should grab a colored zero page */ - PageFrameIndex = MiRemoveAnyPage(0); - ASSERT(PageFrameIndex); - - /* Release the lock since we need to do some zeroing */ - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - - /* Zero out the page, since it's for user-mode */ - MiZeroPfn(PageFrameIndex); - - /* Grab the lock again so we can initialize the PFN entry */ - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - /* Initialize the PFN entry now */ - MiInitializePfn(PageFrameIndex, PointerPte, 1); - - /* And we're done with the lock */ - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - - /* One more demand-zero fault */ - InterlockedIncrement(&KeGetCurrentPrcb()->MmDemandZeroCount); - - /* Was the fault on an actual user page, or a kernel page for the user? */ - if (PointerPte <= MiHighestUserPte) + /* Did we get a prototype PTE back? */ + if (!ProtoPte) { - /* User fault, build a user PTE */ - MI_MAKE_HARDWARE_PTE_USER(&TempPte, - PointerPte, - PointerPte->u.Soft.Protection, - PageFrameIndex); + /* No, create a new PTE. First, write the protection */ + PointerPte->u.Soft.Protection = ProtectionCode; + + /* Lock the PFN database since we're going to grab a page */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Grab a page out of there. Later we should grab a colored zero page */ + PageFrameIndex = MiRemoveAnyPage(0); + ASSERT(PageFrameIndex); + + /* Release the lock since we need to do some zeroing */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Zero out the page, since it's for user-mode */ + MiZeroPfn(PageFrameIndex); + + /* Grab the lock again so we can initialize the PFN entry */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Initialize the PFN entry now */ + MiInitializePfn(PageFrameIndex, PointerPte, 1); + + /* And we're done with the lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* One more demand-zero fault */ + InterlockedIncrement(&KeGetCurrentPrcb()->MmDemandZeroCount); + + /* Was the fault on an actual user page, or a kernel page for the user? */ + if (PointerPte <= MiHighestUserPte) + { + /* User fault, build a user PTE */ + MI_MAKE_HARDWARE_PTE_USER(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameIndex); + } + else + { + /* Session, kernel, or user PTE, figure it out and build it */ + MI_MAKE_HARDWARE_PTE(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameIndex); + } + + /* Write the dirty bit for writeable pages */ + if (TempPte.u.Hard.Write) TempPte.u.Hard.Dirty = TRUE; + + /* And now write down the PTE, making the address valid */ + MI_WRITE_VALID_PTE(PointerPte, TempPte); + + /* Demand zero */ + Status = STATUS_PAGE_FAULT_DEMAND_ZERO; } else { - /* Session, kernel, or user PTE, figure it out and build it */ - MI_MAKE_HARDWARE_PTE(&TempPte, - PointerPte, - PointerPte->u.Soft.Protection, - PageFrameIndex); + /* The only "prototype PTE" we support is the shared user data path */ + ASSERT(ProtectionCode == MM_READONLY); + + /* Write the prototype PTE */ + TempPte = PrototypePte; + TempPte.u.Soft.Protection = ProtectionCode; + MI_WRITE_INVALID_PTE(PointerPte, TempPte); + + /* Handle the fault */ + Status = MiDispatchFault(StoreInstruction, + Address, + PointerPte, + ProtoPte, + FALSE, + CurrentProcess, + TrapInformation, + Vad); + ASSERT(Status == STATUS_PAGE_FAULT_TRANSITION); + ASSERT(PointerPte->u.Hard.Valid == 1); + ASSERT(PointerPte->u.Hard.PageFrameNumber == MmSharedUserDataPte->u.Hard.PageFrameNumber); } - - /* Write the dirty bit for writeable pages */ - if (TempPte.u.Hard.Write) TempPte.u.Hard.Dirty = TRUE; - - /* And now write down the PTE, making the address valid */ - MI_WRITE_VALID_PTE(PointerPte, TempPte); /* Release the working set */ MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); - return STATUS_PAGE_FAULT_DEMAND_ZERO; + return Status; } /* EOF */ From 89acc3113ac881985931d3ef3c57faa1ca7246db Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Jul 2010 20:54:37 +0000 Subject: [PATCH 51/82] [NTOS]: Stop creating a memory area for the shared user data page. [NTOS]: Also stop creating a memory area for the illegal user-mode parts of address space. [NTOS]: Instead, mark the area between MM_HIGHEST_VAD_ADDRESS and MM_HIGHEST_USER_ADDRESS as being ARM3 as well: this way, ARM3 will get the illegal access (and fault), and it will also get the shared user data page access. [NTOS]: With the previous commit, ARM3 knows how to handle the shared user data page access, and does so succesfully. End result: two more MAREA types have been removed, and the address space setup code is now much simpler. svn path=/trunk/; revision=48202 --- reactos/ntoskrnl/mm/ARM3/procsup.c | 2 +- reactos/ntoskrnl/mm/mmfault.c | 21 +------ reactos/ntoskrnl/mm/procsup.c | 92 ++---------------------------- 3 files changed, 7 insertions(+), 108 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 75c25c681cc..00020a44338 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -33,7 +33,7 @@ MiRosTakeOverPebTebRanges(IN PEPROCESS Process) Status = MmCreateMemoryArea(&Process->Vm, MEMORY_AREA_OWNED_BY_ARM3, &AllocatedBase, - ((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - 1) - + ((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - 1) - (ULONG_PTR)MI_LOWEST_VAD_ADDRESS, PAGE_READWRITE, &MemoryArea, diff --git a/reactos/ntoskrnl/mm/mmfault.c b/reactos/ntoskrnl/mm/mmfault.c index 50b5611e7f4..308686df707 100644 --- a/reactos/ntoskrnl/mm/mmfault.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -105,10 +105,6 @@ MmpAccessFault(KPROCESSOR_MODE Mode, switch (MemoryArea->Type) { - case MEMORY_AREA_SYSTEM: - Status = STATUS_ACCESS_VIOLATION; - break; - case MEMORY_AREA_PAGED_POOL: Status = STATUS_SUCCESS; break; @@ -124,10 +120,6 @@ MmpAccessFault(KPROCESSOR_MODE Mode, Status = STATUS_ACCESS_VIOLATION; break; - case MEMORY_AREA_SHARED_DATA: - Status = STATUS_ACCESS_VIOLATION; - break; - default: Status = STATUS_ACCESS_VIOLATION; break; @@ -153,7 +145,6 @@ MmNotPresentFault(KPROCESSOR_MODE Mode, MEMORY_AREA* MemoryArea; NTSTATUS Status; BOOLEAN Locked = FromMdl; - extern PMMPTE MmSharedUserDataPte; DPRINT("MmNotPresentFault(Mode %d, Address %x)\n", Mode, Address); @@ -211,10 +202,6 @@ MmNotPresentFault(KPROCESSOR_MODE Mode, break; } - case MEMORY_AREA_SYSTEM: - Status = STATUS_ACCESS_VIOLATION; - break; - case MEMORY_AREA_SECTION_VIEW: Status = MmNotPresentFaultSectionView(AddressSpace, MemoryArea, @@ -223,18 +210,12 @@ MmNotPresentFault(KPROCESSOR_MODE Mode, break; case MEMORY_AREA_VIRTUAL_MEMORY: - case MEMORY_AREA_PEB_OR_TEB: Status = MmNotPresentFaultVirtualMemory(AddressSpace, MemoryArea, (PVOID)Address, Locked); break; - case MEMORY_AREA_SHARED_DATA: - *MiAddressToPte(USER_SHARED_DATA) = *MmSharedUserDataPte; - Status = STATUS_SUCCESS; - break; - default: Status = STATUS_ACCESS_VIOLATION; break; @@ -284,7 +265,7 @@ MmAccessFault(IN BOOLEAN StoreInstruction, * can go away. */ MemoryArea = MmLocateMemoryAreaByAddress(MmGetKernelAddressSpace(), Address); - if (!(MemoryArea) && (Address <= MM_HIGHEST_VAD_ADDRESS)) + if (!(MemoryArea) && (Address <= MM_HIGHEST_USER_ADDRESS)) { /* Could this be a VAD fault from user-mode? */ MemoryArea = MmLocateMemoryAreaByAddress(MmGetCurrentAddressSpace(), Address); diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index fce21f5bd6f..8694acf0376 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -14,35 +14,16 @@ #include VOID NTAPI MiRosTakeOverPebTebRanges(IN PEPROCESS Process); - + /* FUNCTIONS *****************************************************************/ - + NTSTATUS NTAPI MmInitializeHandBuiltProcess2(IN PEPROCESS Process) { - PVOID BaseAddress; - PMEMORY_AREA MemoryArea; - PHYSICAL_ADDRESS BoundaryAddressMultiple; - NTSTATUS Status; - PMMSUPPORT ProcessAddressSpace = &Process->Vm; - BoundaryAddressMultiple.QuadPart = 0; - - /* Create the shared data page */ - BaseAddress = (PVOID)USER_SHARED_DATA; - Status = MmCreateMemoryArea(ProcessAddressSpace, - MEMORY_AREA_SHARED_DATA, - &BaseAddress, - PAGE_SIZE, - PAGE_EXECUTE_READ, - &MemoryArea, - FALSE, - 0, - BoundaryAddressMultiple); - /* Lock the VAD, ARM3-owned ranges away */ MiRosTakeOverPebTebRanges(Process); - return Status; + return STATUS_SUCCESS; } NTSTATUS @@ -53,15 +34,11 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, IN OUT PULONG Flags, IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL) { - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; PMMSUPPORT ProcessAddressSpace = &Process->Vm; - PVOID BaseAddress; - PMEMORY_AREA MemoryArea; - PHYSICAL_ADDRESS BoundaryAddressMultiple; SIZE_T ViewSize = 0; PVOID ImageBase = 0; PROS_SECTION_OBJECT SectionObject = Section; - BoundaryAddressMultiple.QuadPart = 0; /* Initialize the Addresss Space lock */ KeInitializeGuardedMutex(&Process->AddressCreationLock); @@ -73,59 +50,8 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, /* Acquire the Lock */ MmLockAddressSpace(ProcessAddressSpace); - - /* Protect the highest 64KB of the process address space */ - BaseAddress = (PVOID)MmUserProbeAddress; - Status = MmCreateMemoryArea(ProcessAddressSpace, - MEMORY_AREA_NO_ACCESS, - &BaseAddress, - 0x10000, - PAGE_NOACCESS, - &MemoryArea, - FALSE, - 0, - BoundaryAddressMultiple); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect last 64KB\n"); - goto exit; - } - - /* Protect the 60KB above the shared user page */ - BaseAddress = (char*)USER_SHARED_DATA + PAGE_SIZE; - Status = MmCreateMemoryArea(ProcessAddressSpace, - MEMORY_AREA_NO_ACCESS, - &BaseAddress, - 0x10000 - PAGE_SIZE, - PAGE_NOACCESS, - &MemoryArea, - FALSE, - 0, - BoundaryAddressMultiple); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to protect the memory above the shared user page\n"); - goto exit; - } - - /* Create the shared data page */ - BaseAddress = (PVOID)USER_SHARED_DATA; - Status = MmCreateMemoryArea(ProcessAddressSpace, - MEMORY_AREA_SHARED_DATA, - &BaseAddress, - PAGE_SIZE, - PAGE_EXECUTE_READ, - &MemoryArea, - FALSE, - 0, - BoundaryAddressMultiple); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create Shared User Data\n"); - goto exit; - } - /* Lock the VAD, ARM3-owned ranges away */ + /* Lock the VAD, ARM3-owned ranges away */ MiRosTakeOverPebTebRanges(Process); /* The process now has an address space */ @@ -207,7 +133,6 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, return Status; } -exit: /* Unlock the Address Space */ DPRINT("Unlocking\n"); MmUnlockAddressSpace(ProcessAddressSpace); @@ -247,12 +172,9 @@ MmDeleteProcessAddressSpace(PEPROCESS Process) break; case MEMORY_AREA_VIRTUAL_MEMORY: - case MEMORY_AREA_PEB_OR_TEB: MmFreeVirtualMemory(Process, MemoryArea); break; - case MEMORY_AREA_SHARED_DATA: - case MEMORY_AREA_NO_ACCESS: case MEMORY_AREA_OWNED_BY_ARM3: MmFreeMemoryArea(&Process->Vm, MemoryArea, @@ -260,10 +182,6 @@ MmDeleteProcessAddressSpace(PEPROCESS Process) NULL); break; - case MEMORY_AREA_MDL_MAPPING: - KeBugCheck(PROCESS_HAS_LOCKED_PAGES); - break; - default: KeBugCheck(MEMORY_MANAGEMENT); } From 60082fb24383f8bea02cd0b82aca4398d0a71df4 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Thu, 22 Jul 2010 22:01:58 +0000 Subject: [PATCH 52/82] Update FireFox, KDE, MirandaIM, Mono, Opera, RosBE64, SeaMonkey, ThunderBird, uTorrent, VLC in rapps. svn path=/trunk/; revision=48203 --- .../base/applications/rapps/rapps/firefox36.txt | 16 ++++++++-------- reactos/base/applications/rapps/rapps/kdewin.txt | 4 ++-- .../base/applications/rapps/rapps/mirandaim.txt | 4 ++-- reactos/base/applications/rapps/rapps/mono2.txt | 6 +++--- reactos/base/applications/rapps/rapps/opera.txt | 6 +++--- .../base/applications/rapps/rapps/rosbeamd64.txt | 6 +++--- .../base/applications/rapps/rapps/seamonkey.txt | 14 +++++++------- .../applications/rapps/rapps/thunderbird.txt | 14 +++++++------- .../base/applications/rapps/rapps/utorrent.txt | 6 +++--- reactos/base/applications/rapps/rapps/vlc.txt | 4 ++-- 10 files changed, 40 insertions(+), 40 deletions(-) diff --git a/reactos/base/applications/rapps/rapps/firefox36.txt b/reactos/base/applications/rapps/rapps/firefox36.txt index 382c3cfd31f..52168fc91b8 100644 --- a/reactos/base/applications/rapps/rapps/firefox36.txt +++ b/reactos/base/applications/rapps/rapps/firefox36.txt @@ -2,47 +2,47 @@ [Section] Name = Mozilla Firefox 3.6 -Version = 3.6.6 +Version = 3.6.7 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. Size = 8.2M Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/en-US/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/en-US/Firefox%20Setup%203.6.7.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. Size = 8.0M URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/de/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/de/Firefox%20Setup%203.6.7.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. Size = 8.0M URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/es-ES/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/es-ES/Firefox%20Setup%203.6.7.exe [Section.0414] Description = Mest populære og best ogsÃ¥ gratis nettleserene der ute. Size = 8.0M URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/nb-NO/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/nb-NO/Firefox%20Setup%203.6.7.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych. Size = 8.9M URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/pl/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/pl/Firefox%20Setup%203.6.7.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных браузеров. Size = 8.4M URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/ru/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/ru/Firefox%20Setup%203.6.7.exe [Section.0422] Description = ÐайпопулÑрніший та один з кращих безплатних веб-браузерів. Size = 8.4M URLSite = http://www.mozilla-europe.org/uk/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.6/win32/uk/Firefox%20Setup%203.6.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/uk/Firefox%20Setup%203.6.7.exe diff --git a/reactos/base/applications/rapps/rapps/kdewin.txt b/reactos/base/applications/rapps/rapps/kdewin.txt index b12ebedb53f..f0bd4ecd08c 100644 --- a/reactos/base/applications/rapps/rapps/kdewin.txt +++ b/reactos/base/applications/rapps/rapps/kdewin.txt @@ -2,13 +2,13 @@ [Section] Name = K Desktop Environment -Version = 0.9.6-5 +Version = 0.9.7-0 Licence = GPL Description = KDE for Windows. Size = 2.0MB Category = 15 URLSite = http://www.winkde.org/ -URLDownload = http://www.winkde.org/pub/kde/ports/win32/installer/kdewin-installer-gui-0.9.6-5.exe +URLDownload = http://www.winkde.org/pub/kde/ports/win32/installer/kdewin-installer-gui-0.9.7-0.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index 1c9f24de097..b387bb9ba2f 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.26 +Version = 0.8.27 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.8MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.26-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.27-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/mono2.txt b/reactos/base/applications/rapps/rapps/mono2.txt index 8a3427b4be9..6de2539031c 100644 --- a/reactos/base/applications/rapps/rapps/mono2.txt +++ b/reactos/base/applications/rapps/rapps/mono2.txt @@ -2,13 +2,13 @@ [Section] Name = Mono .net Development Framework -Version = 2.6.4 +Version = 2.6.7 Licence = Unknown Description = Open Source .net Framework. -Size = 71MB +Size = 72MB Category = 14 URLSite = http://www.mono-project.com/Main_Page -URLDownload = http://ftp.novell.com/pub/mono/archive/2.6.4/windows-installer/3/mono-2.6.4-gtksharp-2.12.10-win32-3.exe +URLDownload = http://ftp.novell.com/pub/mono/archive/2.6.7/windows-installer/2/mono-2.6.7-gtksharp-2.12.10-win32-2.exe CDPath = none [Section.0422] diff --git a/reactos/base/applications/rapps/rapps/opera.txt b/reactos/base/applications/rapps/rapps/opera.txt index 94ab020b263..0701b776196 100644 --- a/reactos/base/applications/rapps/rapps/opera.txt +++ b/reactos/base/applications/rapps/rapps/opera.txt @@ -2,13 +2,13 @@ [Section] Name = Opera -Version = 10.54 +Version = 10.60 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. -Size = 12.5M +Size = 12.7M Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://get4.opera.com/pub/opera/win/1054/int/Opera_1054_int_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1060/int/Opera_1060_int_Setup.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/rosbeamd64.txt b/reactos/base/applications/rapps/rapps/rosbeamd64.txt index 1c84f548256..88b8d6b9707 100644 --- a/reactos/base/applications/rapps/rapps/rosbeamd64.txt +++ b/reactos/base/applications/rapps/rapps/rosbeamd64.txt @@ -2,13 +2,13 @@ [Section] Name = ReactOS Build Environment AMD64 Addon -Version = 1.3 +Version = 1.4b Licence = GPL Description = Allows you to build the ReactOS AMD64 Source. For more instructions see ReactOS wiki. -Size = 15.8MB +Size = 15.4MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE64-1.3.exe +URLDownload = http://dreimer.bplaced.net/rosbe/RosBE64-1.4b.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/seamonkey.txt b/reactos/base/applications/rapps/rapps/seamonkey.txt index 1c2951b9ce3..e73790a437e 100644 --- a/reactos/base/applications/rapps/rapps/seamonkey.txt +++ b/reactos/base/applications/rapps/rapps/seamonkey.txt @@ -2,36 +2,36 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.0.4 +Version = 2.0.6 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. Size = 10.1MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.4/win32/en-US/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/en-US/SeaMonkey%20Setup%202.0.6.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. Size = 10.0MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.4/win32/de/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/de/SeaMonkey%20Setup%202.0.6.exe [Section.040a] Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás. Size = 10.0MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.4/win32/es-ES/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/es-ES/SeaMonkey%20Setup%202.0.6.exe [Section.0415] Description = Pakiet Mozilla żyje. W zestawie: przeglÄ…darka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Size = 10.8MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.4/win32/pl/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/pl/SeaMonkey%20Setup%202.0.6.exe [Section.0419] Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. Size = 10.4MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.4/win32/ru/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/ru/SeaMonkey%20Setup%202.0.6.exe [Section.0422] Description = Mozilla Suite повернувÑÑ. Пакет міÑтить в Ñобі браузер, поштовий клієнт, IRC-клієнт та HTML-редактор. Size = 10.4MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.4/win32/ru/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/ru/SeaMonkey%20Setup%202.0.6.exe diff --git a/reactos/base/applications/rapps/rapps/thunderbird.txt b/reactos/base/applications/rapps/rapps/thunderbird.txt index d68d140c174..86fefbf871a 100644 --- a/reactos/base/applications/rapps/rapps/thunderbird.txt +++ b/reactos/base/applications/rapps/rapps/thunderbird.txt @@ -2,41 +2,41 @@ [Section] Name = Mozilla Thunderbird -Version = 3.1 +Version = 3.1.1 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 9.0M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1/win32/en-US/Thunderbird%20Setup%203.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/en-US/Thunderbird%20Setup%203.1.1.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. Size = 8.9M URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1/win32/de/Thunderbird%20Setup%203.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/de/Thunderbird%20Setup%203.1.1.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. Size = 8.8M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1/win32/es-ES/Thunderbird%20Setup%203.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/es-ES/Thunderbird%20Setup%203.1.1.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. Size = 9.7M URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1/win32/pl/Thunderbird%20Setup%203.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/pl/Thunderbird%20Setup%203.1.1.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных почтовых клиентов. Size = 9.2M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1/win32/ru/Thunderbird%20Setup%203.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/ru/Thunderbird%20Setup%203.1.1.exe [Section.0422] Description = ÐайпопулÑрніший та один з кращих поштових клієнтів. Size = 9.2M URLSite = http://www.mozillamessaging.com/uk/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1/win32/uk/Thunderbird%20Setup%203.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/uk/Thunderbird%20Setup%203.1.1.exe diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt index 8e721644c5e..80a4bd52bb9 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 = 2.0.2 +Version = 2.0.3 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 315K +Size = 320K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/2.0.2/utorrent.exe +URLDownload = http://download.utorrent.com/2.0.3/utorrent.exe CDPath = none diff --git a/reactos/base/applications/rapps/rapps/vlc.txt b/reactos/base/applications/rapps/rapps/vlc.txt index 4f155e6f0cf..514f36a601d 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.1.0 +Version = 1.1.1 Licence = GPL Description = A media player. Size = 18.6MB Category = 1 URLSite = http://www.videolan.org/vlc/ -URLDownload = http://ignum.dl.sourceforge.net/project/vlc/1.1.0/win32/vlc-1.1.0-win32.exe +URLDownload = http://ignum.dl.sourceforge.net/project/vlc/1.1.1/win32/vlc-1.1.1-win32.exe CDPath = none [Section.0407] From 7feaf99fb1f99940d3863502b28c31839b188413 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Jul 2010 23:22:57 +0000 Subject: [PATCH 53/82] [NTOSKRNL] - Add some missing constants for amd64 - Fix compilation of kd64 - Make MmAllocationFragment a SIZE_T svn path=/trunk/; revision=48204 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 6 ++++++ reactos/ntoskrnl/kd64/kddata.c | 2 +- reactos/ntoskrnl/mm/ARM3/miarm.h | 3 +-- reactos/ntoskrnl/mm/section.c | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index 1889c64209f..f0d43426b98 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -25,6 +25,8 @@ #define MI_LOWEST_VAD_ADDRESS (PVOID)0x000000007FF00000ULL +#define MI_SYSTEM_PTE_BASE (PVOID)MiAddressToPte(KSEG0_BASE) + /* Memory sizes */ #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) #define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT) @@ -48,6 +50,10 @@ #define MI_SECONDARY_COLORS 64 #define MI_MAX_SECONDARY_COLORS 1024 +#define MI_MIN_ALLOCATION_FRAGMENT (4 * _1KB) +#define MI_ALLOCATION_FRAGMENT (64 * _1KB) +#define MI_MAX_ALLOCATION_FRAGMENT (2 * _1MB) + #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) diff --git a/reactos/ntoskrnl/kd64/kddata.c b/reactos/ntoskrnl/kd64/kddata.c index edce7d7983f..895753a98d2 100644 --- a/reactos/ntoskrnl/kd64/kddata.c +++ b/reactos/ntoskrnl/kd64/kddata.c @@ -9,9 +9,9 @@ /* INCLUDES ******************************************************************/ #include -#include "../mm/ARM3/miarm.h" #define NDEBUG #include +#include "../mm/ARM3/miarm.h" VOID NTAPI RtlpBreakWithStatusInstruction(VOID); diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index e7b22e2d1d7..417544c0913 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -33,7 +33,6 @@ #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000 -// on AMD64 this would be MiAddressToPte(MM_KSEG0_BASE) #define MI_SYSTEM_PTE_BASE (PVOID)MiAddressToPte(NULL) #define MI_MIN_SECONDARY_COLORS 8 @@ -392,7 +391,7 @@ extern BOOLEAN MmDynamicPfn; extern BOOLEAN MmMirroring; extern BOOLEAN MmMakeLowMemory; extern BOOLEAN MmEnforceWriteProtection; -extern ULONG MmAllocationFragment; +extern SIZE_T MmAllocationFragment; extern ULONG MmConsumedPoolPercentage; extern ULONG MmVerifyDriverBufferType; extern ULONG MmVerifyDriverLevel; diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 8761620434d..a09a0a3d7ad 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -71,7 +71,7 @@ MM_SECTION_PAGEOUT_CONTEXT; POBJECT_TYPE MmSectionObjectType = NULL; -BOOLEAN MmAllocationFragment; +SIZE_T MmAllocationFragment; ULONG_PTR MmSubsectionBase; From 2aa6e09c17779c740957fc61e5ed42dc02deb5d6 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 23 Jul 2010 00:20:13 +0000 Subject: [PATCH 54/82] [NDIS] - Convert NDIS_ERROR_CODE from a typedef to a define. - Add some missing NDIS_STATUS_* definitions. - Some _ANONYMOUS_UNION/_ANONYMOUS_STRUCT/__GNU_EXTENSION -> __MINGW_EXTENSION conversions. - Update NDIS_REQUEST_TYPE and NDIS_PER_PACKET_INFO. - Guard several definitions against NDIS_LEGACY_DRIVER. - Improve NDIS_REQUEST. - Add missing CO_ADDRESS_FAMILY_INFINIBAND, Ndis{Set,Get}PacketCancelId, NDIS_PACKET_{FIRST,LAST}_NDIS_BUFFER and NDIS_PACKET_VALID_COUNTS. - Group related definitions. - Update several Ndis* function declarations. - Add missing NdisInterlocked{Push,Pop}EntryList and NdisGetCurrentSystemTime macros. svn path=/trunk/; revision=48205 --- reactos/drivers/network/ndis/ndis/buffer.c | 2 + reactos/include/ddk/ndis.h | 770 ++++++++++++--------- 2 files changed, 464 insertions(+), 308 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/buffer.c b/reactos/drivers/network/ndis/ndis/buffer.c index 2aa821e23df..dc6f1ca62ee 100644 --- a/reactos/drivers/network/ndis/ndis/buffer.c +++ b/reactos/drivers/network/ndis/ndis/buffer.c @@ -1171,6 +1171,7 @@ NdisPacketSize( /* * @implemented */ +#undef NdisGetPacketCancelId PVOID EXPORT NdisGetPacketCancelId( @@ -1182,6 +1183,7 @@ NdisGetPacketCancelId( /* * @implemented */ +#undef NdisSetPacketCancelId VOID EXPORT NdisSetPacketCancelId( diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index d7277d8d37c..e58e5dbdead 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -324,11 +324,10 @@ typedef struct _X_FILTER TR_FILTER, *PTR_FILTER; typedef struct _X_FILTER NULL_FILTER, *PNULL_FILTER; typedef struct _REFERENCE { - KSPIN_LOCK SpinLock; - USHORT ReferenceCount; - BOOLEAN Closing; -} REFERENCE, * PREFERENCE; - + KSPIN_LOCK SpinLock; + USHORT ReferenceCount; + BOOLEAN Closing; +} REFERENCE, *PREFERENCE; /* NDIS base types */ @@ -347,8 +346,6 @@ typedef ANSI_STRING NDIS_ANSI_STRING, *PNDIS_ANSI_STRING; typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING; typedef MDL NDIS_BUFFER, *PNDIS_BUFFER; -typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; - /* NDIS_STATUS constants */ #define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) @@ -357,6 +354,7 @@ typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; #define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) #define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) #define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) +#define NDIS_STATUS_INDICATION_REQUIRED ((NDIS_STATUS)STATUS_NDIS_INDICATION_REQUIRED) #define NDIS_STATUS_ONLINE ((NDIS_STATUS)0x40010003L) #define NDIS_STATUS_RESET_START ((NDIS_STATUS)0x40010004L) #define NDIS_STATUS_RESET_END ((NDIS_STATUS)0x40010005L) @@ -365,8 +363,8 @@ typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; #define NDIS_STATUS_WAN_LINE_UP ((NDIS_STATUS)0x40010008L) #define NDIS_STATUS_WAN_LINE_DOWN ((NDIS_STATUS)0x40010009L) #define NDIS_STATUS_WAN_FRAGMENT ((NDIS_STATUS)0x4001000AL) -#define NDIS_STATUS_MEDIA_CONNECT ((NDIS_STATUS)0x4001000BL) -#define NDIS_STATUS_MEDIA_DISCONNECT ((NDIS_STATUS)0x4001000CL) +#define NDIS_STATUS_MEDIA_CONNECT ((NDIS_STATUS)0x4001000BL) +#define NDIS_STATUS_MEDIA_DISCONNECT ((NDIS_STATUS)0x4001000CL) #define NDIS_STATUS_HARDWARE_LINE_UP ((NDIS_STATUS)0x4001000DL) #define NDIS_STATUS_HARDWARE_LINE_DOWN ((NDIS_STATUS)0x4001000EL) #define NDIS_STATUS_INTERFACE_UP ((NDIS_STATUS)0x4001000FL) @@ -378,24 +376,109 @@ typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; #define NDIS_STATUS_WAN_GET_STATS ((NDIS_STATUS)0x40010014L) #define NDIS_STATUS_WAN_CO_FRAGMENT ((NDIS_STATUS)0x40010015L) #define NDIS_STATUS_WAN_CO_LINKPARAMS ((NDIS_STATUS)0x40010016L) +#if NDIS_SUPPORT_NDIS6 +#define NDIS_STATUS_LINK_STATE ((NDIS_STATUS)0x40010017L) +#define NDIS_STATUS_NETWORK_CHANGE ((NDIS_STATUS)0x40010018L) +#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION_EX ((NDIS_STATUS)0x40010019L) +#define NDIS_STATUS_PORT_STATE ((NDIS_STATUS)0x40010022L) +#define NDIS_STATUS_OPER_STATUS ((NDIS_STATUS)0x40010023L) +#define NDIS_STATUS_PACKET_FILTER ((NDIS_STATUS)0x40010024L) +#endif /* NDIS_SUPPORT_NDIS6 */ +#define NDIS_STATUS_WAN_CO_MTULINKPARAMS ((NDIS_STATUS)0x40010025L) + +#if NDIS_SUPPORT_NDIS6 + +#define NDIS_STATUS_IP_OPER_STATUS ((NDIS_STATUS)0x40010026L) + +#define NDIS_STATUS_OFFLOAD_PAUSE ((NDIS_STATUS)0x40020001L) +#define NDIS_STATUS_UPLOAD_ALL ((NDIS_STATUS)0x40020002L) +#define NDIS_STATUS_OFFLOAD_RESUME ((NDIS_STATUS)0x40020003L) +#define NDIS_STATUS_OFFLOAD_PARTIAL_SUCCESS ((NDIS_STATUS)0x40020004L) +#define NDIS_STATUS_OFFLOAD_STATE_INVALID ((NDIS_STATUS)0x40020005L) +#define NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG ((NDIS_STATUS)0x40020006L) +#define NDIS_STATUS_TASK_OFFLOAD_HARDWARE_CAPABILITIES ((NDIS_STATUS)0x40020007L) +#define NDIS_STATUS_OFFLOAD_ENCASPULATION_CHANGE ((NDIS_STATUS)0x40020008L) +#define NDIS_STATUS_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES ((NDIS_STATUS)0x4002000BL) + +#if (NDIS_SUPPORT_NDIS61) +#define NDIS_STATUS_HD_SPLIT_CURRENT_CONFIG ((NDIS_STATUS)0x4002000CL) +#endif + +#if (NDIS_SUPPORT_NDIS620) +#define NDIS_STATUS_RECEIVE_QUEUE_STATE ((NDIS_STATUS)0x4002000DL) +#endif + +#define NDIS_STATUS_OFFLOAD_IM_RESERVED1 ((NDIS_STATUS)0x40020100L) +#define NDIS_STATUS_OFFLOAD_IM_RESERVED2 ((NDIS_STATUS)0x40020101L) +#define NDIS_STATUS_OFFLOAD_IM_RESERVED3 ((NDIS_STATUS)0x40020102L) + +#define NDIS_STATUS_DOT11_SCAN_CONFIRM ((NDIS_STATUS)0x40030000L) +#define NDIS_STATUS_DOT11_MPDU_MAX_LENGTH_CHANGED ((NDIS_STATUS)0x40030001L) +#define NDIS_STATUS_DOT11_ASSOCIATION_START ((NDIS_STATUS)0x40030002L) +#define NDIS_STATUS_DOT11_ASSOCIATION_COMPLETION ((NDIS_STATUS)0x40030003L) +#define NDIS_STATUS_DOT11_CONNECTION_START ((NDIS_STATUS)0x40030004L) +#define NDIS_STATUS_DOT11_CONNECTION_COMPLETION ((NDIS_STATUS)0x40030005L) +#define NDIS_STATUS_DOT11_ROAMING_START ((NDIS_STATUS)0x40030006L) +#define NDIS_STATUS_DOT11_ROAMING_COMPLETION ((NDIS_STATUS)0x40030007L) +#define NDIS_STATUS_DOT11_DISASSOCIATION ((NDIS_STATUS)0x40030008L) +#define NDIS_STATUS_DOT11_TKIPMIC_FAILURE ((NDIS_STATUS)0x40030009L) +#define NDIS_STATUS_DOT11_PMKID_CANDIDATE_LIST ((NDIS_STATUS)0x4003000AL) +#define NDIS_STATUS_DOT11_PHY_STATE_CHANGED ((NDIS_STATUS)0x4003000BL) +#define NDIS_STATUS_DOT11_LINK_QUALITY ((NDIS_STATUS)0x4003000CL) +#define NDIS_STATUS_DOT11_INCOMING_ASSOC_STARTED ((NDIS_STATUS)0x4003000DL) +#define NDIS_STATUS_DOT11_INCOMING_ASSOC_REQUEST_RECEIVED ((NDIS_STATUS)0x4003000EL) +#define NDIS_STATUS_DOT11_INCOMING_ASSOC_COMPLETION ((NDIS_STATUS)0x4003000FL) +#define NDIS_STATUS_DOT11_STOP_AP ((NDIS_STATUS)0x40030010L) +#define NDIS_STATUS_DOT11_PHY_FREQUENCY_ADOPTED ((NDIS_STATUS)0x40030011L) +#define NDIS_STATUS_DOT11_CAN_SUSTAIN_AP ((NDIS_STATUS)0x40030012L) + +#define NDIS_STATUS_WWAN_DEVICE_CAPS ((NDIS_STATUS)0x40041000) +#define NDIS_STATUS_WWAN_READY_INFO ((NDIS_STATUS)0x40041001) +#define NDIS_STATUS_WWAN_RADIO_STATE ((NDIS_STATUS)0x40041002) +#define NDIS_STATUS_WWAN_PIN_INFO ((NDIS_STATUS)0x40041003) +#define NDIS_STATUS_WWAN_PIN_LIST ((NDIS_STATUS)0x40041004) +#define NDIS_STATUS_WWAN_HOME_PROVIDER ((NDIS_STATUS)0x40041005) +#define NDIS_STATUS_WWAN_PREFERRED_PROVIDERS ((NDIS_STATUS)0x40041006) +#define NDIS_STATUS_WWAN_VISIBLE_PROVIDERS ((NDIS_STATUS)0x40041007) +#define NDIS_STATUS_WWAN_REGISTER_STATE ((NDIS_STATUS)0x40041008) +#define NDIS_STATUS_WWAN_PACKET_SERVICE ((NDIS_STATUS)0x40041009) +#define NDIS_STATUS_WWAN_SIGNAL_STATE ((NDIS_STATUS)0x4004100a) +#define NDIS_STATUS_WWAN_CONTEXT_STATE ((NDIS_STATUS)0x4004100b) +#define NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS ((NDIS_STATUS)0x4004100c) +#define NDIS_STATUS_WWAN_SERVICE_ACTIVATION ((NDIS_STATUS)0x4004100d) +#define NDIS_STATUS_WWAN_SMS_CONFIGURATION ((NDIS_STATUS)0x4004100e) +#define NDIS_STATUS_WWAN_SMS_RECEIVE ((NDIS_STATUS)0x4004100f) +#define NDIS_STATUS_WWAN_SMS_SEND ((NDIS_STATUS)0x40041010) +#define NDIS_STATUS_WWAN_SMS_DELETE ((NDIS_STATUS)0x40041011) +#define NDIS_STATUS_WWAN_SMS_STATUS ((NDIS_STATUS)0x40041012) +#define NDIS_STATUS_WWAN_DNS_ADDRESS ((NDIS_STATUS)0x40041013) + +#define NDIS_STATUS_WWAN_VENDOR_SPECIFIC ((NDIS_STATUS)0x40043000) + +#endif /* NDIS_SUPPORT_NDIS6 */ + +#if (NDIS_SUPPORT_NDIS620) +#define NDIS_STATUS_PM_WOL_PATTERN_REJECTED ((NDIS_STATUS)0x40030051L) +#define NDIS_STATUS_PM_OFFLOAD_REJECTED ((NDIS_STATUS)0x40030052L) +#define NDIS_STATUS_PM_CAPABILITIES_CHANGE ((NDIS_STATUS)0x40030053L) +#endif #define NDIS_STATUS_NOT_RESETTABLE ((NDIS_STATUS)0x80010001L) -#define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L) +#define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L) #define NDIS_STATUS_HARD_ERRORS ((NDIS_STATUS)0x80010004L) -#define NDIS_STATUS_BUFFER_OVERFLOW ((NDIS_STATUS)STATUS_BUFFER_OVERFLOW) - -#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) +#define NDIS_STATUS_BUFFER_OVERFLOW ((NDIS_STATUS)STATUS_BUFFER_OVERFLOW) +#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) #define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) -#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) -#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) +#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) +#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) #define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) #define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) -#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) +#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) #define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) #define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) #define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) -#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) -#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) +#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) +#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) #define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) #define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) #define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) @@ -407,8 +490,8 @@ typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; #define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) #define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) #define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) -#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) -#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) +#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) +#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) #define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) #define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) #define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) @@ -417,7 +500,7 @@ typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; #define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) #define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) -#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) +#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) #define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) #define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) #define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) @@ -432,25 +515,69 @@ typedef ULONG NDIS_ERROR_CODE, *PNDIS_ERROR_CODE; #define NDIS_STATUS_INVALID_DEVICE_REQUEST ((NDIS_STATUS)STATUS_INVALID_DEVICE_REQUEST) #define NDIS_STATUS_NETWORK_UNREACHABLE ((NDIS_STATUS)STATUS_NETWORK_UNREACHABLE) +#if NDIS_SUPPORT_NDIS6 + +#define NDIS_STATUS_SEND_ABORTED ((NDIS_STATUS)STATUS_NDIS_REQUEST_ABORTED) +#define NDIS_STATUS_PAUSED ((NDIS_STATUS)STATUS_NDIS_PAUSED) +#define NDIS_STATUS_INTERFACE_NOT_FOUND ((NDIS_STATUS)STATUS_NDIS_INTERFACE_NOT_FOUND) +#define NDIS_STATUS_INVALID_PARAMETER ((NDIS_STATUS)STATUS_INVALID_PARAMETER) +#define NDIS_STATUS_UNSUPPORTED_REVISION ((NDIS_STATUS)STATUS_NDIS_UNSUPPORTED_REVISION) +#define NDIS_STATUS_INVALID_PORT ((NDIS_STATUS)STATUS_NDIS_INVALID_PORT) +#define NDIS_STATUS_INVALID_PORT_STATE ((NDIS_STATUS)STATUS_NDIS_INVALID_PORT_STATE) +#define NDIS_STATUS_INVALID_STATE ((NDIS_STATUS)STATUS_INVALID_DEVICE_STATE) +#define NDIS_STATUS_MEDIA_DISCONNECTED ((NDIS_STATUS)STATUS_NDIS_MEDIA_DISCONNECTED) +#define NDIS_STATUS_LOW_POWER_STATE ((NDIS_STATUS)STATUS_NDIS_LOW_POWER_STATE) +#define NDIS_STATUS_DOT11_AUTO_CONFIG_ENABLED ((NDIS_STATUS)STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED) +#define NDIS_STATUS_DOT11_MEDIA_IN_USE ((NDIS_STATUS)STATUS_NDIS_DOT11_MEDIA_IN_USE) +#define NDIS_STATUS_DOT11_POWER_STATE_INVALID ((NDIS_STATUS)STATUS_NDIS_DOT11_POWER_STATE_INVALID) +#define NDIS_STATUS_UPLOAD_IN_PROGRESS ((NDIS_STATUS)0xC0231001L) +#define NDIS_STATUS_REQUEST_UPLOAD ((NDIS_STATUS)0xC0231002L) +#define NDIS_STATUS_UPLOAD_REQUESTED ((NDIS_STATUS)0xC0231003L) +#define NDIS_STATUS_OFFLOAD_TCP_ENTRIES ((NDIS_STATUS)0xC0231004L) +#define NDIS_STATUS_OFFLOAD_PATH_ENTRIES ((NDIS_STATUS)0xC0231005L) +#define NDIS_STATUS_OFFLOAD_NEIGHBOR_ENTRIES ((NDIS_STATUS)0xC0231006L) +#define NDIS_STATUS_OFFLOAD_IP_ADDRESS_ENTRIES ((NDIS_STATUS)0xC0231007L) +#define NDIS_STATUS_OFFLOAD_HW_ADDRESS_ENTRIES ((NDIS_STATUS)0xC0231008L) +#define NDIS_STATUS_OFFLOAD_VLAN_ENTRIES ((NDIS_STATUS)0xC0231009L) +#define NDIS_STATUS_OFFLOAD_TCP_XMIT_BUFFER ((NDIS_STATUS)0xC023100AL) +#define NDIS_STATUS_OFFLOAD_TCP_RCV_BUFFER ((NDIS_STATUS)0xC023100BL) +#define NDIS_STATUS_OFFLOAD_TCP_RCV_WINDOW ((NDIS_STATUS)0xC023100CL) +#define NDIS_STATUS_OFFLOAD_VLAN_MISMATCH ((NDIS_STATUS)0xC023100DL) +#define NDIS_STATUS_OFFLOAD_DATA_NOT_ACCEPTED ((NDIS_STATUS)0xC023100EL) +#define NDIS_STATUS_OFFLOAD_POLICY ((NDIS_STATUS)0xC023100FL) +#define NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED ((NDIS_STATUS)0xC0231010L) +#define NDIS_STATUS_OFFLOAD_REQUEST_RESET ((NDIS_STATUS)0xC0231011L) + +#if NDIS_SUPPORT_NDIS620 +#define NDIS_STATUS_PM_WOL_PATTERN_LIST_FULL ((NDIS_STATUS)STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL) +#define NDIS_STATUS_PM_PROTOCOL_OFFLOAD_LIST_FULL ((NDIS_STATUS)STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL) +#endif + +#endif /* NDIS_SUPPORT_NDIS6 */ + +#if (NDIS_SUPPORT_NDIS620) +#define NDIS_STATUS_OFFLOAD_CONNECTION_REJECTED ((NDIS_STATUS)STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED) +#endif /* NDIS error codes for error logging */ -#define NDIS_ERROR_CODE_RESOURCE_CONFLICT EVENT_NDIS_RESOURCE_CONFLICT -#define NDIS_ERROR_CODE_OUT_OF_RESOURCES EVENT_NDIS_OUT_OF_RESOURCE -#define NDIS_ERROR_CODE_HARDWARE_FAILURE EVENT_NDIS_HARDWARE_FAILURE -#define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND EVENT_NDIS_ADAPTER_NOT_FOUND -#define NDIS_ERROR_CODE_INTERRUPT_CONNECT EVENT_NDIS_INTERRUPT_CONNECT -#define NDIS_ERROR_CODE_DRIVER_FAILURE EVENT_NDIS_DRIVER_FAILURE -#define NDIS_ERROR_CODE_BAD_VERSION EVENT_NDIS_BAD_VERSION -#define NDIS_ERROR_CODE_TIMEOUT EVENT_NDIS_TIMEOUT -#define NDIS_ERROR_CODE_NETWORK_ADDRESS EVENT_NDIS_NETWORK_ADDRESS -#define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION EVENT_NDIS_UNSUPPORTED_CONFIGURATION -#define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER -#define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER -#define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS EVENT_NDIS_BAD_IO_BASE_ADDRESS -#define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL EVENT_NDIS_RECEIVE_SPACE_SMALL -#define NDIS_ERROR_CODE_ADAPTER_DISABLED EVENT_NDIS_ADAPTER_DISABLED +#define NDIS_ERROR_CODE ULONG +#define NDIS_ERROR_CODE_RESOURCE_CONFLICT EVENT_NDIS_RESOURCE_CONFLICT +#define NDIS_ERROR_CODE_OUT_OF_RESOURCES EVENT_NDIS_OUT_OF_RESOURCE +#define NDIS_ERROR_CODE_HARDWARE_FAILURE EVENT_NDIS_HARDWARE_FAILURE +#define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND EVENT_NDIS_ADAPTER_NOT_FOUND +#define NDIS_ERROR_CODE_INTERRUPT_CONNECT EVENT_NDIS_INTERRUPT_CONNECT +#define NDIS_ERROR_CODE_DRIVER_FAILURE EVENT_NDIS_DRIVER_FAILURE +#define NDIS_ERROR_CODE_BAD_VERSION EVENT_NDIS_BAD_VERSION +#define NDIS_ERROR_CODE_TIMEOUT EVENT_NDIS_TIMEOUT +#define NDIS_ERROR_CODE_NETWORK_ADDRESS EVENT_NDIS_NETWORK_ADDRESS +#define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION EVENT_NDIS_UNSUPPORTED_CONFIGURATION +#define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER +#define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER +#define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS EVENT_NDIS_BAD_IO_BASE_ADDRESS +#define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL EVENT_NDIS_RECEIVE_SPACE_SMALL +#define NDIS_ERROR_CODE_ADAPTER_DISABLED EVENT_NDIS_ADAPTER_DISABLED /* Memory allocation flags. Used by Ndis[Allocate|Free]Memory */ #define NDIS_MEMORY_CONTIGUOUS 0x00000001 @@ -633,27 +760,32 @@ typedef struct _NDIS_PACKET_PRIVATE { USHORT NdisPacketOobOffset; } NDIS_PACKET_PRIVATE, *PNDIS_PACKET_PRIVATE; -#endif /* NDIS_LEGACY_DRIVER */ - typedef struct _NDIS_PACKET { NDIS_PACKET_PRIVATE Private; - _ANONYMOUS_UNION union { - _ANONYMOUS_STRUCT struct { + __MINGW_EXTENSION union { + __MINGW_EXTENSION struct { UCHAR MiniportReserved[2 * sizeof(PVOID)]; UCHAR WrapperReserved[2 * sizeof(PVOID)]; - } DUMMYSTRUCTNAME; - _ANONYMOUS_STRUCT struct { + }; + __MINGW_EXTENSION struct { UCHAR MiniportReservedEx[3 * sizeof(PVOID)]; UCHAR WrapperReservedEx[sizeof(PVOID)]; - } DUMMYSTRUCTNAME; - _ANONYMOUS_STRUCT struct { + }; + __MINGW_EXTENSION struct { UCHAR MacReserved[4 * sizeof(PVOID)]; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; + }; + }; ULONG_PTR Reserved[2]; UCHAR ProtocolReserved[1]; } NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET; +typedef struct _NDIS_PACKET_STACK { + ULONG_PTR IMReserved[2]; + ULONG_PTR NdisReserved[4]; +} NDIS_PACKET_STACK, *PNDIS_PACKET_STACK; + +#endif /* NDIS_LEGACY_DRIVER */ + typedef enum _NDIS_CLASS_ID { NdisClass802_3Priority, NdisClassWirelessWanMbxMailbox, @@ -691,11 +823,6 @@ typedef struct _NDIS_PM_PACKET_PATTERN { ULONG PatternFlags; } NDIS_PM_PACKET_PATTERN, *PNDIS_PM_PACKET_PATTERN; -typedef struct _NDIS_PACKET_STACK { - ULONG_PTR IMReserved[2]; - ULONG_PTR NdisReserved[4]; -} NDIS_PACKET_STACK, *PNDIS_PACKET_STACK; - /* Request types used by NdisRequest */ typedef enum _NDIS_REQUEST_TYPE { NdisRequestQueryInformation, @@ -709,59 +836,62 @@ typedef enum _NDIS_REQUEST_TYPE { NdisRequestGeneric1, NdisRequestGeneric2, NdisRequestGeneric3, - NdisRequestGeneric4 + NdisRequestGeneric4, +#if NDIS_SUPPORT_NDIS6 + NdisRequestMethod, +#endif } NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE; +#if NDIS_LEGACY_DRIVER typedef struct _NDIS_REQUEST { - UCHAR MacReserved[4 * sizeof(PVOID)]; - NDIS_REQUEST_TYPE RequestType; + UCHAR MacReserved[4 * sizeof(PVOID)]; + NDIS_REQUEST_TYPE RequestType; union _DATA { struct QUERY_INFORMATION { - NDIS_OID Oid; - PVOID InformationBuffer; - UINT InformationBufferLength; - UINT BytesWritten; - UINT BytesNeeded; + NDIS_OID Oid; + PVOID InformationBuffer; + UINT InformationBufferLength; + UINT BytesWritten; + UINT BytesNeeded; } QUERY_INFORMATION; struct SET_INFORMATION { - NDIS_OID Oid; - PVOID InformationBuffer; - UINT InformationBufferLength; - UINT BytesRead; - UINT BytesNeeded; + NDIS_OID Oid; + PVOID InformationBuffer; + UINT InformationBufferLength; + UINT BytesRead; + UINT BytesNeeded; } SET_INFORMATION; } DATA; -#if (defined(NDIS50) || defined(NDIS51)) - UCHAR NdisReserved[9 * sizeof(PVOID)]; - __GNU_EXTENSION union { - UCHAR CallMgrReserved[2 * sizeof(PVOID)]; - UCHAR ProtocolReserved[2 * sizeof(PVOID)]; +#if (defined(NDIS50) || defined(NDIS51) || defined(NDIS50_MINIPORT) || defined(NDIS51_MINIPORT)) + UCHAR NdisReserved[9 * sizeof(PVOID)]; + __MINGW_EXTENSION union { + UCHAR CallMgrReserved[2 * sizeof(PVOID)]; + UCHAR ProtocolReserved[2 * sizeof(PVOID)]; }; - UCHAR MiniportReserved[2 * sizeof(PVOID)]; + UCHAR MiniportReserved[2 * sizeof(PVOID)]; #endif } NDIS_REQUEST, *PNDIS_REQUEST; - - +#endif /* NDIS_LEGACY_DRIVER */ /* Wide Area Networks definitions */ +#if NDIS_LEGACY_DRIVER typedef struct _NDIS_WAN_PACKET { - LIST_ENTRY WanPacketQueue; - PUCHAR CurrentBuffer; - ULONG CurrentLength; - PUCHAR StartBuffer; - PUCHAR EndBuffer; - PVOID ProtocolReserved1; - PVOID ProtocolReserved2; - PVOID ProtocolReserved3; - PVOID ProtocolReserved4; - PVOID MacReserved1; - PVOID MacReserved2; - PVOID MacReserved3; - PVOID MacReserved4; + LIST_ENTRY WanPacketQueue; + PUCHAR CurrentBuffer; + ULONG CurrentLength; + PUCHAR StartBuffer; + PUCHAR EndBuffer; + PVOID ProtocolReserved1; + PVOID ProtocolReserved2; + PVOID ProtocolReserved3; + PVOID ProtocolReserved4; + PVOID MacReserved1; + PVOID MacReserved2; + PVOID MacReserved3; + PVOID MacReserved4; } NDIS_WAN_PACKET, *PNDIS_WAN_PACKET; - - +#endif /* DMA channel information */ @@ -855,8 +985,8 @@ typedef struct _NDIS_CONFIGURATION_PARAMETER { typedef PHYSICAL_ADDRESS NDIS_PHYSICAL_ADDRESS, *PNDIS_PHYSICAL_ADDRESS; typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT { - NDIS_PHYSICAL_ADDRESS PhysicalAddress; - UINT Length; + NDIS_PHYSICAL_ADDRESS PhysicalAddress; + UINT Length; } NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT; typedef struct _NDIS_WAN_LINE_DOWN { @@ -961,15 +1091,16 @@ typedef ULONG NDIS_AF, *PNDIS_AF; #define CO_ADDRESS_FAMILY_IRDA ((NDIS_AF)0x4) #define CO_ADDRESS_FAMILY_1394 ((NDIS_AF)0x5) #define CO_ADDRESS_FAMILY_PPP ((NDIS_AF)0x6) +#define CO_ADDRESS_FAMILY_INFINIBAND ((NDIS_AF)0x7) #define CO_ADDRESS_FAMILY_TAPI ((NDIS_AF)0x800) #define CO_ADDRESS_FAMILY_TAPI_PROXY ((NDIS_AF)0x801) #define CO_ADDRESS_FAMILY_PROXY 0x80000000 -typedef struct { - NDIS_AF AddressFamily; - ULONG MajorVersion; - ULONG MinorVersion; +typedef struct _CO_ADDRESS_FAMILY { + NDIS_AF AddressFamily; + ULONG MajorVersion; + ULONG MinorVersion; } CO_ADDRESS_FAMILY, *PCO_ADDRESS_FAMILY; typedef struct _CO_SPECIFIC_PARAMETERS { @@ -1016,9 +1147,9 @@ typedef struct _CO_CALL_PARAMETERS { } CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS; typedef struct _CO_SAP { - ULONG SapType; - ULONG SapLength; - UCHAR Sap[1]; + ULONG SapType; + ULONG SapLength; + UCHAR Sap[1]; } CO_SAP, *PCO_SAP; typedef struct _NDIS_IPSEC_PACKET_INFO { @@ -1063,42 +1194,38 @@ typedef struct _NDIS_MAC_LINE_UP { } NDIS_MAC_LINE_UP, *PNDIS_MAC_LINE_UP; typedef struct _NDIS_PACKET_8021Q_INFO { - _ANONYMOUS_UNION union { - struct { - UINT32 UserPriority : 3; - UINT32 CanonicalFormatId : 1; - UINT32 VlanId : 12; - UINT32 Reserved : 16; - } TagHeader; - PVOID Value; - } DUMMYUNIONNAME; + __MINGW_EXTENSION union { + struct { + UINT32 UserPriority:3; + UINT32 CanonicalFormatId:1; + UINT32 VlanId:12; + UINT32 Reserved:16; + } TagHeader; + PVOID Value; + }; } NDIS_PACKET_8021Q_INFO, *PNDIS_PACKET_8021Q_INFO; typedef enum _NDIS_PER_PACKET_INFO { - TcpIpChecksumPacketInfo, - IpSecPacketInfo, - TcpLargeSendPacketInfo, - ClassificationHandlePacketInfo, - NdisReserved, - ScatterGatherListPacketInfo, - Ieee8021QInfo, - OriginalPacketInfo, - PacketCancelId, - MaxPerPacketInfo + TcpIpChecksumPacketInfo, + IpSecPacketInfo, + TcpLargeSendPacketInfo, + ClassificationHandlePacketInfo, + NdisReserved, + ScatterGatherListPacketInfo, + Ieee8021QInfo, + OriginalPacketInfo, + PacketCancelId, + OriginalNetBufferList, + CachedNetBufferList, + ShortPacketPaddingInfo, + MaxPerPacketInfo } NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO; -typedef struct _NDIS_PACKET_EXTENSION { - PVOID NdisPacketInfo[MaxPerPacketInfo]; -} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION; +#if NDIS_LEGACY_DRIVER -#if NDIS_SUPPORT_NDIS6 -typedef struct _NDIS_GENERIC_OBJECT { - NDIS_OBJECT_HEADER Header; - PVOID Caller; - PVOID CallersCaller; - PDRIVER_OBJECT DriverObject; -} NDIS_GENERIC_OBJECT, *PNDIS_GENERIC_OBJECT; -#endif +typedef struct _NDIS_PACKET_EXTENSION { + PVOID NdisPacketInfo[MaxPerPacketInfo]; +} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION; /* * PNDIS_PACKET @@ -1153,6 +1280,20 @@ typedef struct _NDIS_GENERIC_OBJECT { #define NDIS_SET_PACKET_CANCEL_ID(Packet, CancelId) \ NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, PacketCancelId) = (CancelId) +#define NdisSetPacketCancelId(_Packet, _CancelId) NDIS_SET_PACKET_CANCEL_ID(_Packet, _CancelId) +#define NdisGetPacketCancelId(_Packet) NDIS_GET_PACKET_CANCEL_ID(_Packet) + +#endif /* NDIS_LEGACY_DRIVER */ + +#if NDIS_SUPPORT_NDIS6 +typedef struct _NDIS_GENERIC_OBJECT { + NDIS_OBJECT_HEADER Header; + PVOID Caller; + PVOID CallersCaller; + PDRIVER_OBJECT DriverObject; +} NDIS_GENERIC_OBJECT, *PNDIS_GENERIC_OBJECT; +#endif + typedef enum _NDIS_TASK { TcpIpChecksumNdisTask, IpSecNdisTask, @@ -1268,26 +1409,25 @@ typedef struct _NDIS_TASK_TCP_LARGE_SEND { } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND; typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO { - _ANONYMOUS_UNION union { + __MINGW_EXTENSION union { struct { - ULONG NdisPacketChecksumV4 : 1; - ULONG NdisPacketChecksumV6 : 1; - ULONG NdisPacketTcpChecksum : 1; - ULONG NdisPacketUdpChecksum : 1; - ULONG NdisPacketIpChecksum : 1; + ULONG NdisPacketChecksumV4:1; + ULONG NdisPacketChecksumV6:1; + ULONG NdisPacketTcpChecksum:1; + ULONG NdisPacketUdpChecksum:1; + ULONG NdisPacketIpChecksum:1; } Transmit; - struct { - ULONG NdisPacketTcpChecksumFailed : 1; - ULONG NdisPacketUdpChecksumFailed : 1; - ULONG NdisPacketIpChecksumFailed : 1; - ULONG NdisPacketTcpChecksumSucceeded : 1; - ULONG NdisPacketUdpChecksumSucceeded : 1; - ULONG NdisPacketIpChecksumSucceeded : 1; - ULONG NdisPacketLoopback : 1; + ULONG NdisPacketTcpChecksumFailed:1; + ULONG NdisPacketUdpChecksumFailed:1; + ULONG NdisPacketIpChecksumFailed:1; + ULONG NdisPacketTcpChecksumSucceeded:1; + ULONG NdisPacketUdpChecksumSucceeded:1; + ULONG NdisPacketIpChecksumSucceeded:1; + ULONG NdisPacketLoopback:1; } Receive; - ULONG Value; - } DUMMYUNIONNAME; + ULONG Value; + }; } NDIS_TCP_IP_CHECKSUM_PACKET_INFO, *PNDIS_TCP_IP_CHECKSUM_PACKET_INFO; typedef struct _NDIS_WAN_CO_FRAGMENT { @@ -2135,6 +2275,11 @@ NdisQueryBufferOffset( *(NextBuffer) = (CurrentBuffer)->Next; \ } +#if NDIS_LEGACY_DRIVER + +#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head) +#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail) +#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts) /* * UINT @@ -2143,56 +2288,27 @@ NdisQueryBufferOffset( */ #define NdisGetPacketFlags(Packet)(Packet)->Private.Flags; - -/* - * VOID - * NdisClearPacketFlags( - * IN PNDIS_PACKET Packet, - * IN UINT Flags); - */ -#define NdisClearPacketFlags(Packet, Flags) \ - (Packet)->Private.Flags &= ~(Flags) - - -/* - * VOID - * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO( - * IN PNDIS_PACKET Packet, - * IN PPVOID pMediaSpecificInfo, - * IN PUINT pSizeMediaSpecificInfo); - */ -#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ - _pMediaSpecificInfo, \ - _pSizeMediaSpecificInfo) \ -{ \ - if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) || \ - !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO)) \ - { \ - *(_pMediaSpecificInfo) = NULL; \ - *(_pSizeMediaSpecificInfo) = 0; \ - } \ - else \ - { \ - *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation; \ - *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo; \ - } \ -} - - /* * ULONG * NDIS_GET_PACKET_PROTOCOL_TYPE( - * IN PNDIS_PACKET Packet); + * IN PNDIS_PACKET Packet); */ #define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \ ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK) +/* + * PNDIS_PACKET_OOB_DATA + * NDIS_OOB_DATA_FROM_PACKET( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_OOB_DATA_FROM_PACKET(_Packet) \ + (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset) + /* * ULONG * NDIS_GET_PACKET_HEADER_SIZE( - * IN PNDIS_PACKET Packet); + * IN PNDIS_PACKET Packet); */ #define NDIS_GET_PACKET_HEADER_SIZE(_Packet) \ ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ @@ -2201,52 +2317,155 @@ NdisQueryBufferOffset( /* * NDIS_STATUS * NDIS_GET_PACKET_STATUS( - * IN PNDIS_PACKET Packet); + * IN PNDIS_PACKET Packet); */ -#define NDIS_GET_PACKET_STATUS(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->Status - - -/* - * ULONGLONG - * NDIS_GET_PACKET_TIME_RECEIVED( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeReceived - - -/* - * ULONGLONG - * NDIS_GET_PACKET_TIME_SENT( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_TIME_SENT(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeSent - +#define NDIS_GET_PACKET_STATUS(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->Status /* * ULONGLONG * NDIS_GET_PACKET_TIME_TO_SEND( - * IN PNDIS_PACKET Packet); + * IN PNDIS_PACKET Packet); */ #define NDIS_GET_PACKET_TIME_TO_SEND(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeToSend - + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeToSend /* - * PNDIS_PACKET_OOB_DATA - * NDIS_OOB_DATA_FROM_PACKET( - * IN PNDIS_PACKET Packet); + * ULONGLONG + * NDIS_GET_PACKET_TIME_SENT( + * IN PNDIS_PACKET Packet); */ -#define NDIS_OOB_DATA_FROM_PACKET(_Packet) \ - (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset) +#define NDIS_GET_PACKET_TIME_SENT(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeSent +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_RECEIVED( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeReceived + +/* + * VOID + * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO( + * IN PNDIS_PACKET Packet, + * IN PPVOID pMediaSpecificInfo, + * IN PUINT pSizeMediaSpecificInfo); + */ +#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ + _pMediaSpecificInfo, \ + _pSizeMediaSpecificInfo) \ +{ \ + if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) || \ + !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO)) \ + { \ + *(_pMediaSpecificInfo) = NULL; \ + *(_pSizeMediaSpecificInfo) = 0; \ + } \ + else \ + { \ + *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation; \ + *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo; \ + } \ +} + +/* + * VOID + * NDIS_SET_PACKET_HEADER_SIZE( + * IN PNDIS_PACKET Packet, + * IN UINT HdrSize); + */ +#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize) + +/* + * VOID + * NDIS_SET_PACKET_STATUS( + * IN PNDIS_PACKET Packet, + * IN NDIS_STATUS Status); + */ +#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status) + +/* + * VOID + * NDIS_SET_PACKET_TIME_TO_SEND( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeToSend); + */ +#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend) + +/* + * VOID + * NDIS_SET_PACKET_TIME_SENT( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeSent); + */ +#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent) + +/* + * VOID + * NDIS_SET_PACKET_TIME_RECEIVED( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeReceived); + */ +#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived) + +/* + * VOID + * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO( + * IN PNDIS_PACKET Packet, + * IN PVOID MediaSpecificInfo, + * IN UINT SizeMediaSpecificInfo); + */ +#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ + _MediaSpecificInfo, \ + _SizeMediaSpecificInfo) \ +{ \ + if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) \ + { \ + (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \ + (_MediaSpecificInfo); \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \ + (_SizeMediaSpecificInfo); \ + } \ +} + +/* + * VOID + * NdisSetPacketFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags) + +/* + * VOID + * NdisClearPacketFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags) + +#endif /* NDIS_LEGACY_DRIVER */ /* * VOID @@ -2358,96 +2577,6 @@ NdisQueryPacketLength( (Packet)->Private.ValidCounts = FALSE; \ } - -/* - * VOID - * NdisSetPacketFlags( - * IN PNDIS_PACKET Packet, - * IN UINT Flags); - */ -#define NdisSetPacketFlags(Packet, Flags) \ - (Packet)->Private.Flags |= (Flags); - - -/* - * VOID - * NDIS_SET_PACKET_HEADER_SIZE( - * IN PNDIS_PACKET Packet, - * IN UINT HdrSize); - */ -#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize) - - -/* - * VOID - * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO( - * IN PNDIS_PACKET Packet, - * IN PVOID MediaSpecificInfo, - * IN UINT SizeMediaSpecificInfo); - */ -#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ - _MediaSpecificInfo, \ - _SizeMediaSpecificInfo) \ -{ \ - if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) \ - { \ - (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \ - (_MediaSpecificInfo); \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \ - (_SizeMediaSpecificInfo); \ - } \ -} - - -/* - * VOID - * NDIS_SET_PACKET_STATUS( - * IN PNDIS_PACKET Packet, - * IN NDIS_STATUS Status); - */ -#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status) - - -/* - * VOID - * NDIS_SET_PACKET_TIME_RECEIVED( - * IN PNDIS_PACKET Packet, - * IN ULONGLONG TimeReceived); - */ -#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived) - - -/* - * VOID - * NDIS_SET_PACKET_TIME_SENT( - * IN PNDIS_PACKET Packet, - * IN ULONGLONG TimeSent); - */ -#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent) - - -/* - * VOID - * NDIS_SET_PACKET_TIME_TO_SEND( - * IN PNDIS_PACKET Packet, - * IN ULONGLONG TimeToSend); - */ -#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend) - - /* * VOID * NdisSetSendFlags( @@ -2834,41 +2963,59 @@ NdisUnicodeStringToAnsiString( /* Spin lock reoutines */ +/* NDISAPI VOID NTAPI NdisAllocateSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock) +/* NDISAPI VOID NTAPI NdisFreeSpinLock( IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisFreeSpinLock(_SpinLock) +/* NDISAPI VOID NTAPI NdisAcquireSpinLock( IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql) +/* NDISAPI VOID NTAPI NdisReleaseSpinLock( IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql) +/* NDISAPI VOID NTAPI NdisDprAcquireSpinLock( IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock) +/* NDISAPI VOID NTAPI NdisDprReleaseSpinLock( IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock) /* I/O routines */ @@ -3097,7 +3244,11 @@ NdisDprReleaseSpinLock( */ #define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead) +#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \ + ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock) +#define NdisInterlockedPopEntryList(ListHead, Lock) \ + ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock) /* Interlocked routines */ @@ -3170,11 +3321,14 @@ NdisWriteErrorLogEntry( */ #define NdisStallExecution KeStallExecutionProcessor +/* NDISAPI VOID NTAPI NdisGetCurrentSystemTime( IN PLARGE_INTEGER pSystemTime); +*/ +#define NdisGetCurrentSystemTime KeQuerySystemTime NDISAPI CCHAR From 66365c895ca27cb0717d59104c4439d091ee384e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Jul 2010 01:36:44 +0000 Subject: [PATCH 55/82] [PSEH] Add (non working) 64bit code svn path=/trunk/; revision=48206 --- reactos/lib/pseh/amd64/framebased.S | 73 +++++++++++++++++++++++++++++ reactos/lib/pseh/pseh.rbuild | 5 ++ 2 files changed, 78 insertions(+) create mode 100644 reactos/lib/pseh/amd64/framebased.S diff --git a/reactos/lib/pseh/amd64/framebased.S b/reactos/lib/pseh/amd64/framebased.S new file mode 100644 index 00000000000..98e3390f5fe --- /dev/null +++ b/reactos/lib/pseh/amd64/framebased.S @@ -0,0 +1,73 @@ +// Copyright (c) 2004/2005 KJK::Hyperion + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to dos so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +.text +.intel_syntax noprefix + +.globl __SEHCleanHandlerEnvironment +__SEHCleanHandlerEnvironment: + cld + ret + +.globl __SEHCurrentRegistration +__SEHCurrentRegistration: + mov rax, [fs:0] + ret + +.globl __SEHRegisterFrame +__SEHRegisterFrame: + mov rcx, [rsp+4] + mov rax, [fs:0] + mov [rcx+0], eax + mov [fs:0], ecx + ret + +.globl __SEHUnregisterFrame +__SEHUnregisterFrame: + mov rcx, [fs:0] + mov rcx, [rcx+0] + mov [fs:0], rcx + ret + +.globl __SEHGlobalUnwind +__SEHGlobalUnwind: + +.extern __SEHRtlUnwind + +// RtlUnwind clobbers all the "don't clobber" registers, so we save them + push rbx + mov rbx, [rsp+8] + push rsi + push rdi + + push 0 // ReturnValue + push 0 // ExceptionRecord +// push .RestoreRegisters // TargetIp + push rbx // TargetFrame +// call [__SEHRtlUnwind] + +.RestoreRegisters: + pop rdi + pop rsi + pop rbx + + ret + +// EOF diff --git a/reactos/lib/pseh/pseh.rbuild b/reactos/lib/pseh/pseh.rbuild index dcbde827368..3d2cbfeef4d 100644 --- a/reactos/lib/pseh/pseh.rbuild +++ b/reactos/lib/pseh/pseh.rbuild @@ -16,5 +16,10 @@ framebased.S + + + framebased.S + + framebased.c From 88499392ee4cdb954b67416b92b352cc6654ba14 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Jul 2010 02:18:30 +0000 Subject: [PATCH 56/82] [PSEH] Stub amd64 functions and remove leading underscores from symbols svn path=/trunk/; revision=48207 --- reactos/lib/pseh/amd64/framebased.S | 68 +++++------------------------ 1 file changed, 10 insertions(+), 58 deletions(-) diff --git a/reactos/lib/pseh/amd64/framebased.S b/reactos/lib/pseh/amd64/framebased.S index 98e3390f5fe..401d9227f31 100644 --- a/reactos/lib/pseh/amd64/framebased.S +++ b/reactos/lib/pseh/amd64/framebased.S @@ -1,73 +1,25 @@ -// Copyright (c) 2004/2005 KJK::Hyperion - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to dos so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. .text .intel_syntax noprefix -.globl __SEHCleanHandlerEnvironment -__SEHCleanHandlerEnvironment: - cld +.globl _SEHCleanHandlerEnvironment +_SEHCleanHandlerEnvironment: ret -.globl __SEHCurrentRegistration -__SEHCurrentRegistration: - mov rax, [fs:0] +.globl _SEHCurrentRegistration +_SEHCurrentRegistration: ret -.globl __SEHRegisterFrame -__SEHRegisterFrame: - mov rcx, [rsp+4] - mov rax, [fs:0] - mov [rcx+0], eax - mov [fs:0], ecx +.globl _SEHRegisterFrame +_SEHRegisterFrame: ret -.globl __SEHUnregisterFrame -__SEHUnregisterFrame: - mov rcx, [fs:0] - mov rcx, [rcx+0] - mov [fs:0], rcx +.globl _SEHUnregisterFrame +_SEHUnregisterFrame: ret -.globl __SEHGlobalUnwind -__SEHGlobalUnwind: - -.extern __SEHRtlUnwind - -// RtlUnwind clobbers all the "don't clobber" registers, so we save them - push rbx - mov rbx, [rsp+8] - push rsi - push rdi - - push 0 // ReturnValue - push 0 // ExceptionRecord -// push .RestoreRegisters // TargetIp - push rbx // TargetFrame -// call [__SEHRtlUnwind] - -.RestoreRegisters: - pop rdi - pop rsi - pop rbx - +.globl _SEHGlobalUnwind +_SEHGlobalUnwind: ret // EOF From 1048fa497466fa6f9b12c0ec6dc9543d077114a5 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Fri, 23 Jul 2010 08:34:57 +0000 Subject: [PATCH 57/82] Sync Winefile with Wine 1.2 svn path=/trunk/; revision=48209 --- rosapps/applications/winfile/Cs.rc | 4 +- rosapps/applications/winfile/Da.rc | 8 +- rosapps/applications/winfile/De.rc | 8 +- rosapps/applications/winfile/En.rc | 8 +- rosapps/applications/winfile/Es.rc | 8 +- rosapps/applications/winfile/Fr.rc | 8 +- rosapps/applications/winfile/Hu.rc | 2 +- rosapps/applications/winfile/It.rc | 8 +- rosapps/applications/winfile/Ja.rc | 8 +- rosapps/applications/winfile/Ko.rc | 8 +- rosapps/applications/winfile/Lt.rc | 8 +- rosapps/applications/winfile/Nl.rc | 8 +- rosapps/applications/winfile/No.rc | 8 +- rosapps/applications/winfile/Pl.rc | 8 +- rosapps/applications/winfile/Pt.rc | 16 +- rosapps/applications/winfile/Ro.rc | 249 +++++++++++++++++++++++++++ rosapps/applications/winfile/Ru.rc | 8 +- rosapps/applications/winfile/Si.rc | 8 +- rosapps/applications/winfile/Sv.rc | 8 +- rosapps/applications/winfile/Tr.rc | 8 +- rosapps/applications/winfile/Uk.rc | 126 +++++++------- rosapps/applications/winfile/Zh.rc | 4 +- rosapps/applications/winfile/rsrc.rc | 1 + 23 files changed, 390 insertions(+), 140 deletions(-) create mode 100644 rosapps/applications/winfile/Ro.rc diff --git a/rosapps/applications/winfile/Cs.rc b/rosapps/applications/winfile/Cs.rc index 80ddc1b75ca..00803bfcf99 100644 --- a/rosapps/applications/winfile/Cs.rc +++ b/rosapps/applications/winfile/Cs.rc @@ -31,7 +31,7 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Soubor" { MENUITEM "&Otevøít\tEnter", ID_ACTIVATE @@ -150,7 +150,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Zvolte cíl" FONT 8, "MS Shell Dlg" diff --git a/rosapps/applications/winfile/Da.rc b/rosapps/applications/winfile/Da.rc index 385333c3cfe..f7cf2e1e196 100644 --- a/rosapps/applications/winfile/Da.rc +++ b/rosapps/applications/winfile/Da.rc @@ -25,7 +25,7 @@ LANGUAGE LANG_DANISH, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Fil" { MENUITEM "&Åben\tEnter", ID_ACTIVATE @@ -144,7 +144,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Vælg destination" FONT 8, "MS Shell Dlg" @@ -157,7 +157,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Gennemse", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Efter filtype" FONT 8, "MS Sans Serif" @@ -179,7 +179,7 @@ BEGIN PUSHBUTTON "Annuller",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Egenskaper for %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/De.rc b/rosapps/applications/winfile/De.rc index 83e9f36c3dd..67f1087f706 100644 --- a/rosapps/applications/winfile/De.rc +++ b/rosapps/applications/winfile/De.rc @@ -29,7 +29,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Datei" { MENUITEM "Ö&ffnen\tEingabetaste", ID_ACTIVATE @@ -144,7 +144,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Ziel auswählen" FONT 8, "MS Shell Dlg" @@ -157,7 +157,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Durchsuchen", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Angaben auswählen" FONT 8, "MS Sans Serif" @@ -179,7 +179,7 @@ BEGIN PUSHBUTTON "Abbrechen",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Eigenschaften für %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/En.rc b/rosapps/applications/winfile/En.rc index 06405aa1c33..64a56aafe52 100644 --- a/rosapps/applications/winfile/En.rc +++ b/rosapps/applications/winfile/En.rc @@ -27,7 +27,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&File" { MENUITEM "&Open\tEnter", ID_ACTIVATE @@ -146,7 +146,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Select destination" FONT 8, "MS Shell Dlg" @@ -159,7 +159,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Browse", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "By File Type" FONT 8, "MS Sans Serif" @@ -181,7 +181,7 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Properties for %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Es.rc b/rosapps/applications/winfile/Es.rc index a531d974519..a711e79075d 100644 --- a/rosapps/applications/winfile/Es.rc +++ b/rosapps/applications/winfile/Es.rc @@ -25,7 +25,7 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Archivo" { MENUITEM "&Abrir\tEnter", ID_ACTIVATE @@ -144,7 +144,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Seleccione destino" FONT 8, "MS Shell Dlg" @@ -157,7 +157,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Examinar", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Por tipo de archivo" FONT 8, "MS Sans Serif" @@ -179,7 +179,7 @@ BEGIN PUSHBUTTON "Cancelar",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Propiedades de %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Fr.rc b/rosapps/applications/winfile/Fr.rc index 63eaeba5a13..5b3a078afbc 100644 --- a/rosapps/applications/winfile/Fr.rc +++ b/rosapps/applications/winfile/Fr.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Fichier" { MENUITEM "&Ouvrir\tEntrée", ID_ACTIVATE @@ -151,7 +151,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Sélectionner la destination" FONT 8, "MS Shell Dlg" @@ -164,7 +164,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Parcourir...", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 100 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Par type de fichier" FONT 8, "MS Sans Serif" @@ -186,7 +186,7 @@ BEGIN PUSHBUTTON "Annuler",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Propriétés de %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Hu.rc b/rosapps/applications/winfile/Hu.rc index 2af0595690f..eb048629574 100644 --- a/rosapps/applications/winfile/Hu.rc +++ b/rosapps/applications/winfile/Hu.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Fájl" { MENUITEM "&Megynitás\tEnter", ID_ACTIVATE diff --git a/rosapps/applications/winfile/It.rc b/rosapps/applications/winfile/It.rc index 843d47312e3..22db037a931 100644 --- a/rosapps/applications/winfile/It.rc +++ b/rosapps/applications/winfile/It.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&File" { MENUITEM "&Apri\tInvio", ID_ACTIVATE @@ -151,7 +151,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Seleziona destinazione" FONT 8, "MS Shell Dlg" @@ -164,7 +164,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Naviga", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Per tipo di file" FONT 8, "MS Sans Serif" @@ -186,7 +186,7 @@ BEGIN PUSHBUTTON "Annulla",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Propprietà di %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Ja.rc b/rosapps/applications/winfile/Ja.rc index a66eb1b0ff9..28973dfb20a 100644 --- a/rosapps/applications/winfile/Ja.rc +++ b/rosapps/applications/winfile/Ja.rc @@ -30,7 +30,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "ファイル(&F)" { MENUITEM "é–‹ã(&O)\tEnter", ID_ACTIVATE @@ -149,7 +149,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "移動先をé¸æŠž" FONT 9, "MS Shell Dlg" @@ -162,7 +162,7 @@ FONT 9, "MS Shell Dlg" PUSHBUTTON "å‚ç…§(&B)", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "By File Type" FONT 9, "MS Shell Dlg" @@ -184,7 +184,7 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Properties for %s" FONT 9, "MS Shell Dlg" diff --git a/rosapps/applications/winfile/Ko.rc b/rosapps/applications/winfile/Ko.rc index 7f125835c9e..62b0dc90245 100644 --- a/rosapps/applications/winfile/Ko.rc +++ b/rosapps/applications/winfile/Ko.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "ÆÄÀÏ(&F)" { MENUITEM "¿­±â(&O)\tEnter", ID_ACTIVATE @@ -147,7 +147,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "¸ñÀûÁö ¼±ÅÃ" FONT 9, "MS Shell Dlg" @@ -160,7 +160,7 @@ FONT 9, "MS Shell Dlg" PUSHBUTTON "ã±â(&B)", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ÆÄÀÏ Å¸ÀÔÀ¸·Î" FONT 9, "MS Shell Dlg" @@ -182,7 +182,7 @@ BEGIN PUSHBUTTON "Ãë¼Ò",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "%s ¼Ó¼º" FONT 9, "MS Shell Dlg" diff --git a/rosapps/applications/winfile/Lt.rc b/rosapps/applications/winfile/Lt.rc index a5c2eb64e19..6c33585654a 100644 --- a/rosapps/applications/winfile/Lt.rc +++ b/rosapps/applications/winfile/Lt.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Failas" { MENUITEM "&Atverti\tEnter", ID_ACTIVATE @@ -147,7 +147,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "IÅ¡rinkite paskirtį" FONT 8, "MS Shell Dlg" @@ -160,7 +160,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Parinkti", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pagal failo tipÄ…" FONT 8, "MS Sans Serif" @@ -182,7 +182,7 @@ BEGIN PUSHBUTTON "Atsisakyti",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "%s savybÄ—s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Nl.rc b/rosapps/applications/winfile/Nl.rc index cd7b9552291..f6f59700668 100644 --- a/rosapps/applications/winfile/Nl.rc +++ b/rosapps/applications/winfile/Nl.rc @@ -26,7 +26,7 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Bestand" { MENUITEM "&Openen\tEnter", ID_ACTIVATE @@ -145,7 +145,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Selecteer bestemming" FONT 8, "MS Shell Dlg" @@ -158,7 +158,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Bladeren", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Per Bestandstype" FONT 8, "MS Sans Serif" @@ -180,7 +180,7 @@ BEGIN PUSHBUTTON "Annuleren",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Eigenschappen voor %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/No.rc b/rosapps/applications/winfile/No.rc index f1317e8868d..21d6a348286 100644 --- a/rosapps/applications/winfile/No.rc +++ b/rosapps/applications/winfile/No.rc @@ -25,7 +25,7 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Fil" { MENUITEM "&Åpne\tEnter", ID_ACTIVATE @@ -144,7 +144,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Velg plasserings" FONT 8, "MS Shell Dlg" @@ -157,7 +157,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Bla", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Etter filtype" FONT 8, "MS Sans Serif" @@ -179,7 +179,7 @@ BEGIN PUSHBUTTON "Avbryt",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Egenskaper for %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Pl.rc b/rosapps/applications/winfile/Pl.rc index 8bc3a77bdd2..375bdaedf43 100644 --- a/rosapps/applications/winfile/Pl.rc +++ b/rosapps/applications/winfile/Pl.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Plik" { MENUITEM "&Otwórz\tEnter", ID_ACTIVATE @@ -147,7 +147,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Wybór celu" FONT 8, "MS Shell Dlg" @@ -160,7 +160,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Przegl¹daj", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Wed³ug typu pliku" FONT 8, "MS Sans Serif" @@ -182,7 +182,7 @@ BEGIN PUSHBUTTON "Anuluj",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "W³aœciwoœci: %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Pt.rc b/rosapps/applications/winfile/Pt.rc index 3a76ba72044..93253d4ac58 100644 --- a/rosapps/applications/winfile/Pt.rc +++ b/rosapps/applications/winfile/Pt.rc @@ -29,7 +29,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Arquivo" { MENUITEM "A&brir\tEnter", ID_ACTIVATE @@ -150,7 +150,7 @@ IDM_WINEFILE MENU FIXED IMPURE LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Ficheiro" { MENUITEM "A&brir\tEnter", ID_ACTIVATE @@ -271,7 +271,7 @@ IDM_WINEFILE MENU FIXED IMPURE LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Selecionar destino" FONT 8, "MS Shell Dlg" @@ -286,7 +286,7 @@ FONT 8, "MS Shell Dlg" LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Seleccionar destino" FONT 8, "MS Shell Dlg" @@ -302,7 +302,7 @@ FONT 8, "MS Shell Dlg" LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Por tipo de arquivo" FONT 8, "MS Sans Serif" @@ -327,7 +327,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Por tipo de ficheiro" FONT 8, "MS Sans Serif" @@ -352,7 +352,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Propriedades de %s" FONT 8, "MS Sans Serif" @@ -384,7 +384,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Propriedades de %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Ro.rc b/rosapps/applications/winfile/Ro.rc new file mode 100644 index 00000000000..14df878b1a2 --- /dev/null +++ b/rosapps/applications/winfile/Ro.rc @@ -0,0 +1,249 @@ +/* + * WineFile + * + * Copyright 2000 Martin Fuchs + * Copyright 2002 Steven Edwards + * Copyright 2002 Alexandre Julliard + * Copyright 2010 Claudia Cotună + * Michael Stefaniuc + * + * 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" + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +#pragma code_page(65001) + +/* Menu */ + +IDM_WINEFILE MENU +{ + POPUP "&FiÈ™ier" { + MENUITEM "Desc&hide\tEnter", ID_ACTIVATE + MENUITEM "&Mutare...\tF7", ID_FILE_MOVE + MENUITEM "&Copiere...\tF8", ID_FILE_COPY + MENUITEM "ÃŽn cl&ipboard...\tF9", 118 + MENUITEM "Șter&ge\tDel", ID_FILE_DELETE + MENUITEM "Rede&numire...", 109 + MENUITEM "Proprietăț&i...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "C&omprimare...", 119 + MENUITEM "Dec&omprimare...", 120 + MENUITEM SEPARATOR + MENUITEM "E&xecutare...", ID_RUN + MENUITEM "Im&primare...", 102 + MENUITEM "Asociere...", 103 + MENUITEM SEPARATOR + MENUITEM "Cr&eare director...", 111 + MENUITEM "Că&utare...", 104 + MENUITEM "&Selectare fiÈ™iere...", 116 + MENUITEM SEPARATOR +#ifndef _NO_EXTENSIONS + MENUITEM "ÃŽnc&hide\Alt+X", ID_FILE_EXIT +#else + MENUITEM "ÃŽnc&hide", ID_FILE_EXIT +#endif + } + + POPUP "&Disc" { + MENUITEM "&Copiere disc...", 201 + MENUITEM "E&tichetare disc...", 202 + MENUITEM SEPARATOR + MENUITEM "&Formatare disc...", ID_FORMAT_DISK +#ifdef _WIN95 + MENUITEM "Creare disc siste&m...", -1 /*TODO*/ +#endif + MENUITEM SEPARATOR + MENUITEM "Co&nectează unitatea de reÈ›ea", ID_CONNECT_NETWORK_DRIVE + MENUITEM "&Deconectează unitatea de reÈ›ea", ID_DISCONNECT_NETWORK_DRIVE + MENUITEM SEPARATOR + MENUITEM "Partajare ca...", 254 + MENUITEM "Elimina&re partajare...", 255 + MENUITEM SEPARATOR + MENUITEM "&Selectare unitate...", 251 + } + + POPUP "Di&rectoare" { + MENUITEM "&Nivelul următor\t+", 301 + MENUITEM "Extinde ar&borele\t*", 302 + MENUITEM "Extinde t&ot\tStrg+*", 303 + MENUITEM "Restrân&ge arborele\t-", 304 + MENUITEM SEPARATOR + MENUITEM "&Marchează copiii", 505 + } + + POPUP "&Vizualizare" { + MENUITEM "Arbo&re È™i director", 413 + MENUITEM "Numai arbor&ele", 411 + MENUITEM "Numai direct&orul", 412 + MENUITEM SEPARATOR + MENUITEM "Sep&ară", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Nume", ID_VIEW_NAME + MENUITEM "To&ate detaliile ", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "Detalii &parÈ›iale...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "&Sortează după nume", ID_VIEW_SORT_NAME + MENUITEM "Sortează după &tip", ID_VIEW_SORT_TYPE + MENUITEM "Sortează după &mărime", ID_VIEW_SORT_SIZE + MENUITEM "Sortează după &dată", ID_VIEW_SORT_DATE + MENUITEM SEPARATOR + MENUITEM "Filtrare după &...", ID_VIEW_FILTER + } + + POPUP "&OpÈ›iuni" { + MENUITEM "&Confirmare...", 501 + MENUITEM "&Font...", ID_SELECT_FONT + MENUITEM "Personalizare &bară de unelte...", 512 + MENUITEM SEPARATOR + MENUITEM "Bara de unel&te", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "Bara &de unitate", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Bara de &stare", ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "Pe tot ecran&ul\tCtrl+Shift+S", ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "&Minimizează la execuÈ›ie", 504 + MENUITEM "&Salvează configuraÈ›ia la închidere", ID_VIEW_SAVESETTINGS + } + + POPUP "&Securitate" { + MENUITEM "&Acces...", 605 + MENUITEM "ÃŽnre&gistrare...", 606 + MENUITEM "Pr&oprietar...", 607 + } + + POPUP "&Fereastră" { + MENUITEM "&Fereastră nouă", ID_WINDOW_NEW + MENUITEM "Cascadă\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "Mozaic &orizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Mozaic &vertical\tCtrl+F4", ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "Aranjează automat", ID_WINDOW_AUTOSORT +#endif + MENUITEM "Aranjează &simbolurile", ID_WINDOW_ARRANGE + MENUITEM "Actualiza&re\tF5", ID_REFRESH + } + + POPUP "A&jutor" { + MENUITEM "&Subiecte în ajutor...\tF1", ID_HELP + MENUITEM "&Căutare în ajutor...\tF1", ID_HELP + MENUITEM "&Utilizare ajutor\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "Des&pre Winefile...", ID_ABOUT + } +} + +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Selectare destinaÈ›ie" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "Ca&le:", -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 "Anulează", 2, 158, 23, 47, 14 + PUSHBUTTON "Navi&gare", 254, 158, 43, 47, 14 +} + +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "După tipul de fiÈ™ier" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Nume:",-1,7,8,22,10 + EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL + GROUPBOX "Tip fiÈ™ier",-1,7,23,87,56 + CONTROL "&Directoare",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Programe",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "Docu&mente",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "&Alte fiÈ™iere",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "Arată fiÈ™ierele ascunse/de &sistem",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,126,9 + DEFPUSHBUTTON "OK",IDOK,104,7,50,14 + PUSHBUTTON "Anulează",IDCANCEL,104,24,50,14 +END + +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Proprietăți pentru %s" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,191,7,50,14 + PUSHBUTTON "Anulează",IDCANCEL,191,29,50,14 + LTEXT "Nume &fiÈ™ier:",-1,7,7,59,9 + EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Calea com&pletă:",-1,7,18,59,9 + EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Ultima modificare:",-1,7,29,59,9 + EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Versiune:",-1,7,40,59,9 + EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Drep&t de autor:",-1,7,51,59,9 + EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Dimensiune:",-1,7,62,59,9 + EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + GROUPBOX "Atribute",-1,7,79,158,46 + CONTROL "Doar citi&re",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "Ascu&ns",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "&Arhivă",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 + CONTROL "&Sistem",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "&Comprimat",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "InformaÈ›ii despre &versiune",-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 "Se aplică opÈ›iunile de font" + IDS_FONT_SEL_ERROR "Eroare la selectarea unui nou font." +} + +STRINGTABLE +{ + IDS_WINEFILE "Administrator Wine File" + IDS_ERROR "Eroare" + IDS_ROOT_FS "director rădăcină" + IDS_UNIXFS "director unix" + IDS_DESKTOP "Desktop" + IDS_SHELL "Shell" + IDS_TITLEFMT "%s - %s" + IDS_NO_IMPL "Neimplementat încă" + IDS_WINE_FILE "Wine File" +} + +STRINGTABLE +{ + IDS_COL_NAME "Nume" + IDS_COL_SIZE "Dimensiune" + IDS_COL_CDATE "Ultima schimbare de stare (ctime)" + IDS_COL_ADATE "Ultima accesare" + IDS_COL_MDATE "Ultima modificare" + IDS_COL_IDX "Index/Inode" + IDS_COL_LINKS "Legături" + IDS_COL_ATTR "Atribute" + IDS_COL_SEC "Securitate" + + IDS_FREE_SPACE_FMT "%s din %s liber" +} diff --git a/rosapps/applications/winfile/Ru.rc b/rosapps/applications/winfile/Ru.rc index 252f14f4c39..0bc2fc35485 100644 --- a/rosapps/applications/winfile/Ru.rc +++ b/rosapps/applications/winfile/Ru.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Файл" { MENUITEM "&Открыть\tEnter", ID_ACTIVATE @@ -147,7 +147,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Выберите путь назначениÑ" FONT 8, "MS Shell Dlg" @@ -160,7 +160,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Обзор", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "По типу файлов" FONT 8, "MS Sans Serif" @@ -182,7 +182,7 @@ BEGIN PUSHBUTTON "Отмена",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "СвойÑтва %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Si.rc b/rosapps/applications/winfile/Si.rc index 08e495c357d..651b98c99cf 100644 --- a/rosapps/applications/winfile/Si.rc +++ b/rosapps/applications/winfile/Si.rc @@ -27,7 +27,7 @@ LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Datoteka" { MENUITEM "&Odpri\tEnter", ID_ACTIVATE @@ -146,7 +146,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Izbira ciljne poti" FONT 8, "MS Shell Dlg" @@ -159,7 +159,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Brskaj", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Glede na vrsto datoteke" FONT 8, "MS Sans Serif" @@ -181,7 +181,7 @@ BEGIN PUSHBUTTON "PrekliÄi",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Lastnosti %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Sv.rc b/rosapps/applications/winfile/Sv.rc index 45202b218cb..dcd3b80e636 100644 --- a/rosapps/applications/winfile/Sv.rc +++ b/rosapps/applications/winfile/Sv.rc @@ -28,7 +28,7 @@ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Arkiv" { MENUITEM "&Öppna\tEnter", ID_ACTIVATE @@ -146,7 +146,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Välj mål" FONT 8, "MS Shell Dlg" @@ -159,7 +159,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Bläddra", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Efter filtyp" FONT 8, "MS Sans Serif" @@ -181,7 +181,7 @@ BEGIN PUSHBUTTON "Avbryt",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Egenskaper för %s" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Tr.rc b/rosapps/applications/winfile/Tr.rc index 48d5063600b..f09113e5861 100644 --- a/rosapps/applications/winfile/Tr.rc +++ b/rosapps/applications/winfile/Tr.rc @@ -25,7 +25,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "&Dosya" { MENUITEM "&Aç\tEnter", ID_ACTIVATE @@ -144,7 +144,7 @@ IDM_WINEFILE MENU FIXED IMPURE } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Hedefi seç" FONT 8, "MS Shell Dlg" @@ -157,7 +157,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Gözat", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dosya Türüne Göre" FONT 8, "MS Sans Serif" @@ -179,7 +179,7 @@ BEGIN PUSHBUTTON "Ýptal",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "%s Özellikleri" FONT 8, "MS Sans Serif" diff --git a/rosapps/applications/winfile/Uk.rc b/rosapps/applications/winfile/Uk.rc index 168894ace96..5abbc64cf1d 100644 --- a/rosapps/applications/winfile/Uk.rc +++ b/rosapps/applications/winfile/Uk.rc @@ -31,27 +31,27 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { 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 "&Відкрити\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 "Запак&увати...", 119 MENUITEM "Р&озпакувати...", 120 MENUITEM SEPARATOR - MENUITEM "&ЗапуÑтити...", ID_RUN - MENUITEM "&Друк...", 102 + MENUITEM "&ЗапуÑтити...", ID_RUN + MENUITEM "&Друк...", 102 MENUITEM "ÐÑоціювати...", 103 MENUITEM SEPARATOR - MENUITEM "Створити директорі&ÑŽ...", 111 - MENUITEM "По&шук...", 104 - MENUITEM "Виділити &файли...", 116 + MENUITEM "Створити директорі&ÑŽ...", 111 + MENUITEM "По&шук...", 104 + MENUITEM "Виділити &файли...", 116 MENUITEM SEPARATOR #ifndef _NO_EXTENSIONS MENUITEM "Ви&хід\tAlt+X", ID_FILE_EXIT @@ -61,96 +61,96 @@ IDM_WINEFILE MENU FIXED IMPURE } POPUP "&ДиÑк" { - MENUITEM "&Копіювати диÑк...", 201 - MENUITEM "&Мітка тому...", 202 + MENUITEM "&Копіювати диÑк...", 201 + MENUITEM "&Мітка тому...", 202 MENUITEM SEPARATOR - MENUITEM "&Форматувати диÑк...", ID_FORMAT_DISK + MENUITEM "&Форматувати диÑк...", ID_FORMAT_DISK #ifdef _WIN95 MENUITEM "&Створити ÑиÑтемний диÑк...", -1 /*TODO*/ #endif MENUITEM SEPARATOR - MENUITEM "Підключити &мережний диÑк", ID_CONNECT_NETWORK_DRIVE - MENUITEM "&Відключити мережний диÑк", ID_DISCONNECT_NETWORK_DRIVE + MENUITEM "&Підключити мережний диÑк", ID_CONNECT_NETWORK_DRIVE + MENUITEM "&Відключити мережний диÑк", ID_DISCONNECT_NETWORK_DRIVE MENUITEM SEPARATOR - MENUITEM "Зробити Ñпільним Ñк...", 254 - MENUITEM "&Закрити Ñпільний доÑтуп...", 255 + MENUITEM "Зробити Ñпільним Ñк...", 254 + MENUITEM "&Закрити Ñпільний доÑтуп...", 255 MENUITEM SEPARATOR - MENUITEM "Ви&брати диÑк...", 251 + MENUITEM "Ви&брати диÑк...", 251 } POPUP "Ди&ректорії" { - MENUITEM "&ÐаÑтупний рівень\t+", 301 - MENUITEM "Розгорнути &дерево\t*", 302 - MENUITEM "Розгорнути &вÑе\tStrg+*", 303 - MENUITEM "Згорнути д&ерево\t-", 304 + MENUITEM "&ÐаÑтупний рівень\t+", 301 + MENUITEM "Розгорнути &дерево\t*", 302 + MENUITEM "Розгорнути &вÑе\tStrg+*", 303 + MENUITEM "Згорнути д&ерево\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Mark Children", 505 + MENUITEM "Відмітити &гілки", 505 } POPUP "&ВиглÑд" { - MENUITEM "Дере&во Ñ– директоріÑ", 413 - MENUITEM "Лише д&ерево", 411 + MENUITEM "&Дерево Ñ– директоріÑ", 413 + MENUITEM "Лише д&ерево", 411 MENUITEM "Лише д&иректоріÑ", 412 MENUITEM SEPARATOR - MENUITEM "Роз&бити", ID_VIEW_SPLIT + MENUITEM "Роз&бити", ID_VIEW_SPLIT MENUITEM SEPARATOR - MENUITEM "&Ім'Ñ", ID_VIEW_NAME + MENUITEM "&Ім'Ñ", ID_VIEW_NAME MENUITEM "Ð’ÑÑ– дані про фай&л", ID_VIEW_ALL_ATTRIBUTES, CHECKED - MENUITEM "&ЧаÑткові дані...", ID_VIEW_SELECTED_ATTRIBUTES + 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 "&Сортувати за ім'Ñм", 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 + MENUITEM "Сортувати за &...", ID_VIEW_FILTER } POPUP "&ÐалаштуваннÑ" { - MENUITEM "&ПідтвердженнÑ...", 501 - MENUITEM "&Шрифт...", ID_SELECT_FONT - MENUITEM "Customize Tool&bar...", 512 + MENUITEM "&ПідтвердженнÑ...", 501 + MENUITEM "&Шрифт...", ID_SELECT_FONT + MENUITEM "Ðалаштувати &панель інÑтрументів...", 512 MENUITEM SEPARATOR - MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "Панель &диÑків", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "&РÑдок Ñтану", ID_VIEW_STATUSBAR, CHECKED + MENUITEM "Панель &інÑтрументів", 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 + MENUITEM "Ð’&еÑÑŒ екран\tCtrl+Shift+S", ID_VIEW_FULLSCREEN #endif MENUITEM SEPARATOR - MENUITEM "&Minimize on run", 504 - MENUITEM "&Зберегти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ виходом", ID_VIEW_SAVESETTINGS + MENUITEM "&Мінімізувати при запуÑку", 504 + MENUITEM "&Зберегти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ виходом", ID_VIEW_SAVESETTINGS } POPUP "&Безпека" { - MENUITEM "&ДоÑтуп...", 605 - MENUITEM "&Logging...", 606 + MENUITEM "&ДоÑтуп...", 605 + MENUITEM "&Протоколи...", 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 + MENUITEM "Ðове &Вікно", ID_WINDOW_NEW + MENUITEM "Вікна каÑкадом\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "Вікна &зверху вниз", ID_WINDOW_TILE_HORZ + MENUITEM "Вікна зліва &направо\tCtrl+F4", ID_WINDOW_TILE_VERT #ifndef _NO_EXTENSIONS - MENUITEM "ВпорÑдкувати автоматично", ID_WINDOW_AUTOSORT + MENUITEM "ВпорÑдкувати автоматично", ID_WINDOW_AUTOSORT #endif - MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE - MENUITEM "&Оновити\tF5", ID_REFRESH + MENUITEM "РозміÑтити &Символи", ID_WINDOW_ARRANGE + MENUITEM "&Оновити\tF5", ID_REFRESH } POPUP "Довідк&а" { MENUITEM "&Розділи довідки\tF1", ID_HELP - MENUITEM "По&шук...\tF1", ID_HELP - MENUITEM "&КориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¾ÑŽ\tF1", ID_HELP_USING + MENUITEM "По&шук...\tF1", ID_HELP + MENUITEM "&КориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¾ÑŽ\tF1", ID_HELP_USING MENUITEM SEPARATOR - MENUITEM "&Про Winefile...", ID_ABOUT + MENUITEM "&Про Winefile...", ID_ABOUT } } -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +IDD_SELECT_DESTINATION DIALOG 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Виберіть шлÑÑ… призначеннÑ" FONT 8, "MS Shell Dlg" @@ -163,7 +163,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&ОглÑд", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "За типом файлів" FONT 8, "MS Sans Serif" @@ -185,7 +185,7 @@ BEGIN PUSHBUTTON "СкаÑувати",IDCANCEL,104,24,50,14 END -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +IDD_DIALOG_PROPERTIES DIALOG 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ВлаÑтивоÑÑ‚Ñ– Ð´Ð»Ñ %s" FONT 8, "MS Sans Serif" @@ -239,9 +239,9 @@ STRINGTABLE { IDS_COL_NAME "Ім'Ñ" IDS_COL_SIZE "Розмір" - IDS_COL_CDATE "CDate" - IDS_COL_ADATE "ADate" - IDS_COL_MDATE "MDate" + IDS_COL_CDATE "Дата ÑтвореннÑ" + IDS_COL_ADATE "Дата оÑтаннього доÑтупу" + IDS_COL_MDATE "Дата оÑтанньої зміни" IDS_COL_IDX "Index/Inode" IDS_COL_LINKS "ПоÑиланнÑ" IDS_COL_ATTR "Ðтрибути" diff --git a/rosapps/applications/winfile/Zh.rc b/rosapps/applications/winfile/Zh.rc index 7b9af46a646..ca14564dfbc 100644 --- a/rosapps/applications/winfile/Zh.rc +++ b/rosapps/applications/winfile/Zh.rc @@ -29,7 +29,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "文件(&F)" { MENUITEM "打开(&O)\tEnter", ID_ACTIVATE @@ -152,7 +152,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL /* Menu */ -IDM_WINEFILE MENU FIXED IMPURE +IDM_WINEFILE MENU { POPUP "檔案(&F)" { MENUITEM "é–‹å•Ÿ(&O)\tEnter", ID_ACTIVATE diff --git a/rosapps/applications/winfile/rsrc.rc b/rosapps/applications/winfile/rsrc.rc index 84a2ec09f95..1db55303140 100644 --- a/rosapps/applications/winfile/rsrc.rc +++ b/rosapps/applications/winfile/rsrc.rc @@ -71,6 +71,7 @@ IDB_IMAGES BITMAP DISCARDABLE images.bmp #include "Lt.rc" #include "Nl.rc" #include "Pt.rc" +#include "Ro.rc" #include "Ru.rc" #include "Si.rc" #include "Uk.rc" From 87b3292e96b08ec9309c1eca1ff713431e5d15c3 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Fri, 23 Jul 2010 08:36:51 +0000 Subject: [PATCH 58/82] Sync reg, xcopy, winhlp32, wordpad with Wine 1.2 svn path=/trunk/; revision=48210 --- reactos/base/applications/cmdutils/reg/Pt.rc | 2 +- reactos/base/applications/cmdutils/reg/Uk.rc | 8 +- .../base/applications/cmdutils/xcopy/It.rc | 26 +- .../base/applications/cmdutils/xcopy/Ko.rc | 8 +- .../base/applications/cmdutils/xcopy/Pt.rc | 111 ++++++-- .../base/applications/cmdutils/xcopy/Uk.rc | 31 +- .../base/applications/cmdutils/xcopy/rsrc.rc | 2 +- reactos/base/applications/winhlp32/Bg.rc | 7 +- reactos/base/applications/winhlp32/Cs.rc | 7 +- reactos/base/applications/winhlp32/Da.rc | 7 +- reactos/base/applications/winhlp32/De.rc | 12 +- reactos/base/applications/winhlp32/En.rc | 22 +- reactos/base/applications/winhlp32/Es.rc | 10 +- reactos/base/applications/winhlp32/Fi.rc | 7 +- reactos/base/applications/winhlp32/Fr.rc | 8 +- reactos/base/applications/winhlp32/Hu.rc | 7 +- reactos/base/applications/winhlp32/It.rc | 12 +- reactos/base/applications/winhlp32/Ja.rc | 12 +- reactos/base/applications/winhlp32/Ko.rc | 12 +- reactos/base/applications/winhlp32/Lt.rc | 6 +- reactos/base/applications/winhlp32/Nl.rc | 6 +- reactos/base/applications/winhlp32/No.rc | 12 +- reactos/base/applications/winhlp32/Pl.rc | 6 +- reactos/base/applications/winhlp32/Pt.rc | 72 +++-- reactos/base/applications/winhlp32/Rm.rc | 7 +- reactos/base/applications/winhlp32/Ro.rc | 6 +- reactos/base/applications/winhlp32/Ru.rc | 6 +- reactos/base/applications/winhlp32/Si.rc | 12 +- reactos/base/applications/winhlp32/Sk.rc | 7 +- reactos/base/applications/winhlp32/Sv.rc | 12 +- reactos/base/applications/winhlp32/Tr.rc | 7 +- reactos/base/applications/winhlp32/Uk.rc | 110 ++------ reactos/base/applications/winhlp32/Zh.rc | 4 +- reactos/base/applications/wordpad/Da.rc | 30 +- reactos/base/applications/wordpad/De.rc | 30 +- reactos/base/applications/wordpad/En.rc | 28 +- reactos/base/applications/wordpad/Fr.rc | 30 +- reactos/base/applications/wordpad/Hu.rc | 4 +- reactos/base/applications/wordpad/It.rc | 26 +- reactos/base/applications/wordpad/Ja.rc | 26 +- reactos/base/applications/wordpad/Ko.rc | 26 +- reactos/base/applications/wordpad/Lt.rc | 30 +- reactos/base/applications/wordpad/Nl.rc | 26 +- reactos/base/applications/wordpad/No.rc | 52 ++-- reactos/base/applications/wordpad/Pl.rc | 30 +- reactos/base/applications/wordpad/Pt.rc | 42 ++- reactos/base/applications/wordpad/Ro.rc | 267 ++++++++++++++++++ reactos/base/applications/wordpad/Ru.rc | 39 ++- reactos/base/applications/wordpad/Si.rc | 30 +- reactos/base/applications/wordpad/Sv.rc | 35 +-- reactos/base/applications/wordpad/Tr.rc | 6 +- reactos/base/applications/wordpad/Uk.rc | 173 ++++++------ reactos/base/applications/wordpad/Zh.rc | 135 +++++---- .../base/applications/wordpad/olecallback.c | 210 ++++++++++++++ reactos/base/applications/wordpad/print.c | 180 ++++++------ reactos/base/applications/wordpad/registry.c | 32 ++- reactos/base/applications/wordpad/rsrc.rc | 1 + reactos/base/applications/wordpad/wordpad.c | 189 ++++++------- reactos/base/applications/wordpad/wordpad.h | 8 +- .../base/applications/wordpad/wordpad.rbuild | 4 + 60 files changed, 1425 insertions(+), 848 deletions(-) create mode 100644 reactos/base/applications/wordpad/Ro.rc create mode 100644 reactos/base/applications/wordpad/olecallback.c diff --git a/reactos/base/applications/cmdutils/reg/Pt.rc b/reactos/base/applications/cmdutils/reg/Pt.rc index 0de0e336149..dc2d11ace20 100644 --- a/reactos/base/applications/cmdutils/reg/Pt.rc +++ b/reactos/base/applications/cmdutils/reg/Pt.rc @@ -24,7 +24,7 @@ #pragma code_page(65001) -LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE +LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL STRINGTABLE { diff --git a/reactos/base/applications/cmdutils/reg/Uk.rc b/reactos/base/applications/cmdutils/reg/Uk.rc index 70c86f70cb9..d2c776a5832 100644 --- a/reactos/base/applications/cmdutils/reg/Uk.rc +++ b/reactos/base/applications/cmdutils/reg/Uk.rc @@ -31,10 +31,10 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE { - STRING_USAGE, "СинтакÑÐ¸Ñ Ñ†Ñ–Ñ”Ñ— команди наÑтупний:\n\nREG [ ADD | DELETE | QUERY ]\nREG command /?\n" - STRING_ADD_USAGE, "REG ADD key_name [/v value_name | /ve] [/t type] [/s separator] [/d data] [/f]\n" - STRING_DELETE_USAGE, "REG DELETE key_name [/v value_name | /ve | /va] [/f]\n" - STRING_QUERY_USAGE, "REG QUERY key_name [/v value_name | /ve] [/s]\n" + STRING_USAGE, "СинтакÑÐ¸Ñ Ñ†Ñ–Ñ”Ñ— команди наÑтупний:\n\nREG [ ADD | DELETE | QUERY ]\nREG <команда> /?\n" + STRING_ADD_USAGE, "REG ADD <ключ> [/v <параметр> | /ve] [/t <тип>] [/s <розділювач>] [/d дані] [/f]\n" + STRING_DELETE_USAGE, "REG DELETE <ключ> [/v <параметр> | /ve | /va] [/f]\n" + STRING_QUERY_USAGE, "REG QUERY <ключ> [/v <параметр> | /ve] [/s]\n" STRING_SUCCESS, "ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ ÑƒÑпішно завершена\n" STRING_INVALID_KEY, "Помилка: неправильне ім'Ñ ÐºÐ»ÑŽÑ‡Ð°\n" STRING_INVALID_CMDLINE, "Помилка: неправильні параметри командного Ñ€Ñдка\n" diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc index 258cb3f4a7b..a3b742a14e1 100644 --- a/reactos/base/applications/cmdutils/xcopy/It.rc +++ b/reactos/base/applications/cmdutils/xcopy/It.rc @@ -31,10 +31,10 @@ 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_SIMCOPY, "%d file sarebbero copiati\n" + STRING_COPY, "%d file copiato/i\n" STRING_QISDIR, "'%s' è il nome di un file o una cartella\n" \ - "sull'obiettivo?\n" \ + "nell'obiettivo?\n" \ "(F - File, C - Cartella)\n" STRING_SRCPROMPT,"%s? (Sì|No)\n" STRING_OVERWRITE,"Sovrascrivere %s? (Sì|No|Tutti)\n" @@ -56,27 +56,27 @@ XCOPY sorgente [destinazione] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \n\ Dove:\n\ \n\ -[/I] Assumi una cartella se la destinazione non esiste e sono copiati 2 o\n\ -\tpiù files\n\ +[/I] Assume una cartella se la destinazione non esiste e sono copiati 2 o\n\ +\tpiù file\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\ +[/Q] Non mostra 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\ +[/W] Richiede prima di iniziare l'operazione di copia\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\ +[/N] Copia usando i nomi abbreviati\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\ +[/R] Sovrascrive ogni file che abbia l'attributo Sola Lettura\n\ +[/H] Include i file 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\ +[/A] Copia solo i file che abbiano l'attributo Archivio\n\ +[/M] Copia solo i file 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\ +[/D | /D:m-g-a] Copia i nuovi file 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" diff --git a/reactos/base/applications/cmdutils/xcopy/Ko.rc b/reactos/base/applications/cmdutils/xcopy/Ko.rc index 6a5071cae86..2d32095502e 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ko.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ko.rc @@ -3,7 +3,7 @@ * Korean language support * * Copyright (C) 2007 J. Edmeades - * Copyright (C) 2007 YunSong Hwang(hys545@dreamwiz.com) + * Copyright (C) 2007,2010 YunSong Hwang * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -54,8 +54,8 @@ XCOPY \n\ Where:\n\ \n\ -[/I] Assume directory if destination does not exist and copying 2 or\n\ -\tmore files\n\ +[/I] ¸¸¾à ´ë»óÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì µð·ºÅ丮·Î °¡Á¤ÇÏ°í µÎ°³³ª ´õ ¸¹Àº ÆÄÀÏÀ» \n\ +\ º¹»ç\n\ [/S] µð·ºÅ丮ÇÏ°í ÇÏÀ§ µð·ºÅ丮 º¹»ç\n\ [/E] ºó µð·ºÅ丮¸¦ Æ÷ÇÔÇؼ­ µð·ºÅ丮¿Í ÇÏÀ§ µð·ºÅ丮 º¹»ç\n\ [/Q] Á¶¿ëÇÏ°Ô º¹»çµÇ´Â ÆÄÀÏÀ̳ª µð·ºÅ丮¸¦ Ç¥½ÃÇÏÁö ¾Ê°í º¹»ç.\n\ @@ -73,7 +73,7 @@ Where:\n\ [/C] º¹»çÇÏ´Â µ¿¾È¿¡ ¿¡·¯°¡ ¹ß»ýÇصµ °è¼Ó ÁøÇà\n\ [/A] ¿ÀÁ÷ ¾ÐÃà ¼Ó¼ºÀÌ ¼³Á¤µÇ¾îÀÖ´Â ÆÄÀϸ¸ º¹»ç\n\ [/M] ¿ÀÁ÷ ¾ÐÃà ¼Ó¼ºÀ» Á¦°ÅÇϸ鼭 ¾ÐÃà ¼Ó¼ºÀÌ ¼³Á¤µÇ¾îÀÖ´Â\n\ -\ÆÄÀϸ¸ º¹»ç\n\ +\ ÆÄÀϸ¸ º¹»ç\n\ [/D | /D:m-d-y] ÁöÁ¤µÈ ³¯Â¥ ÈÄ¿¡ ¼öÁ¤µÇ°Å³ª »õ·Î¿î ÆÄÀÏ º¹»ç.\n\ \t\tI¸¸¾à ¾î¶°ÇÑ ³¯Â¥µµ ÁöÁ¤µÇÁö ¾ÊÀ¸¸é,¿ÀÁ÷ ¿øº»º¸´Ù\n\ \t\t´ë»óÀÌ ¿À·¡µÈ °Í¸¸ º¹»ç\n\n" diff --git a/reactos/base/applications/cmdutils/xcopy/Pt.rc b/reactos/base/applications/cmdutils/xcopy/Pt.rc index d8254d5e1fb..f8f70c317ad 100644 --- a/reactos/base/applications/cmdutils/xcopy/Pt.rc +++ b/reactos/base/applications/cmdutils/xcopy/Pt.rc @@ -3,6 +3,7 @@ * Portuguese language support * * Copyright (C) 2008 Ricardo Filipe + * Copyright 2010 Gustavo Henrique Milaré * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,21 +22,81 @@ #include "xcopy.h" -LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL +#pragma code_page(65001) + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN STRINGTABLE { - STRING_INVPARMS, "Número de parâmetros inválido - Use xcopy /? para ajuda\n" - STRING_INVPARM, "Parâmetro inválido '%s' - Use xcopy /? para ajuda\n" - STRING_PAUSE, "Carregue para iniciar cópia\n" - STRING_SIMCOPY, "%d ficheiro(s) seriam copiados\n" - STRING_COPY, "%d ficheiro(s) copiados\n" - STRING_QISDIR, "'%s' é um ficheiro ou directório\n" \ + STRING_INVPARMS, "Número de parâmetros inválido - Use xcopy /? para ajuda\n" + STRING_INVPARM, "Parâmetro inválido '%s' - Use xcopy /? para ajuda\n" + STRING_PAUSE, "Pressione para iniciar a cópia\n" + STRING_SIMCOPY, "%d arquivo(s) seriam copiado(s)\n" + STRING_COPY, "%d arquivo(s) copiado(s)\n" + STRING_QISDIR, "'%s' é um arquivo ou diretório\n" \ "no alvo?\n" \ - "(F - Ficheiro, D - Directório)\n" + "(A - Arquivo, D - Directório)\n" + STRING_SRCPROMPT,"%s? (Sim|Não)\n" + STRING_OVERWRITE,"Reescrever %s? (Sim|Não|Tudo)\n" + STRING_COPYFAIL, "Falha ao copiar '%s' para '%s' com r/c %d\n" + STRING_OPENFAIL, "Falha ao abrir '%s'\n" + STRING_READFAIL, "Falha a ler '%s'\n" + STRING_YES_CHAR, "S" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "T" + STRING_FILE_CHAR,"A" + STRING_DIR_CHAR, "D" + + STRING_HELP, +"XCOPY - Copia arquivos ou diretórios para um destino\n\ +\n\ +Sintaxe:\n\ +XCOPY fonte [destino] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Onde:\n\ +\n\ +[/I] Assume diretório se o destino não existe e está copiando 2 ou\n\ +\tmais arquivos\n\ +[/S] Copiar diretórios e subdiretórios\n\ +[/E] Copiar diretórios e subdiretórios, incluindo os vazios\n\ +[/Q] Não mostrar nomes durante a cópia, ie modo silencioso.\n\ +[/F] Mostrar por completo os nomes de fonte e destino durante a cópia\n\ +[/L] Simular a operação, mostrando os nomes que seriam copiados\n\ +[/W] Alerta antes de iniciar a operação de cópia\n\ +[/T] Cria a estrutura de diretórios mas não copia arquivos\n\ +[/Y] Omitir alertas ao sobrescrever arquivos\n\ +[/-Y] Alertar ao sobrescrever arquivos\n\ +[/P] Alertar antes de cada arquivo ser copiado\n\ +[/N] Copiar usando nomes pequenos\n\ +[/U] Copiar apenas arquivos que já existem no destino\n\ +[/R] Reescrever quaisquer arquivos de somente leitura\n\ +[/H] Incluir arquivos ocultos e de sistema na cópia\n\ +[/C] Continuar mesmo que ocorra um erro durante a cópia\n\ +[/A] Copiar apenas arquivos com atributo de arquivo\n\ +[/M] Copiar apenas arquivos com atributo de arquivo, removendo\n\ +\to atributo de arquivo\n\ +[/D | /D:m-d-y] Copiar novos arquivos ou os alterados após a data fornecida\n\ +\t\tSe nenhuma data for fornecida, apenas copiar se o destino\n\ +\t\tfor mais antigo que a fonte\n\n" + +} + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +STRINGTABLE +{ + STRING_INVPARMS, "Número de parâmetros inválido - Use xcopy /? para ajuda\n" + STRING_INVPARM, "Parâmetro inválido '%s' - Use xcopy /? para ajuda\n" + STRING_PAUSE, "Carregue para iniciar cópia\n" + STRING_SIMCOPY, "%d ficheiro(s) seriam copiado(s)\n" + STRING_COPY, "%d ficheiro(s) copiado(s)\n" + STRING_QISDIR, "'%s' é um ficheiro ou directório\n" \ + "no alvo?\n" \ + "(F - Ficheiro, D - Directório)\n" STRING_SRCPROMPT,"%s? (Yes|No)\n" STRING_OVERWRITE,"Reescrever %s? (Yes|No|All)\n" - STRING_COPYFAIL, "Cópia de '%s' para '%s' falhou com r/c %d\n" + STRING_COPYFAIL, "Cópia de '%s' para '%s' falhou com r/c %d\n" STRING_OPENFAIL, "Falhou ao abrir '%s'\n" STRING_READFAIL, "Falhou a ler '%s'\n" STRING_YES_CHAR, "Y" @@ -45,7 +106,7 @@ STRINGTABLE STRING_DIR_CHAR, "D" STRING_HELP, -"XCOPY - Copia ficheiros ou directórios para um destino\n\ +"XCOPY - Copia ficheiros ou directórios para um destino\n\ \n\ Sintaxe:\n\ XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ @@ -53,28 +114,28 @@ XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \n\ Onde:\n\ \n\ -[/I] Assume directório se o destino não existe e está a copiar 2 ou\n\ +[/I] Assume directório se o destino não existe e está a copiar 2 ou\n\ \tmais ficheiros\n\ -[/S] Copiar directórios e subdirectórios\n\ -[/E] Copiar directórios e subdirectórios, incluindo os vazios\n\ -[/Q] Não mostrar nomes durante a cópia, ie quiet.\n\ -[/F] Mostrar por completo os nomes de fonte e destino durante a cópia\n\ -[/L] Simular a operação, mostrando os nomes que seriam copiados\n\ -[/W] Alerta antes de iniciar a operação de cópia\n\ -[/T] Cria a estrutura de directórios mas não copia ficheiros\n\ +[/S] Copiar directórios e subdirectórios\n\ +[/E] Copiar directórios e subdirectórios, incluindo os vazios\n\ +[/Q] Não mostrar nomes durante a cópia, ie quiet.\n\ +[/F] Mostrar por completo os nomes de fonte e destino durante a cópia\n\ +[/L] Simular a operação, mostrando os nomes que seriam copiados\n\ +[/W] Alerta antes de iniciar a operação de cópia\n\ +[/T] Cria a estrutura de directórios mas não copia ficheiros\n\ [/Y] Suprimir alertas quando reescreve ficheiros\n\ [/-Y] Alertar quando reescreve ficheiros\n\ -[/P] Alertar antes de cada ficheiros ser copiado\n\ +[/P] Alertar antes de cada ficheiro ser copiado\n\ [/N] Copiar usando nomes pequenos\n\ -[/U] Copiar apenas ficheiros que já existem no destino\n\ +[/U] Copiar apenas ficheiros que já existem no destino\n\ [/R] Reescrever quaisquer ficheiros apenas de leitura\n\ -[/H] Incluir ficheiros ocultos e de sistema na cópia\n\ -[/C] Continuar mesmo que ocorra um erro durante a cópia\n\ +[/H] Incluir ficheiros ocultos e de sistema na cópia\n\ +[/C] Continuar mesmo que ocorra um erro durante a cópia\n\ [/A] Copiar apenas ficheiros com atributo de arquivo\n\ [/M] Copiar apenas ficheiros com atributo de arquivo, removendo\n\ \to atributo de arquivo\n\ -[/D | /D:m-d-y] Copiar novos ficheiros ou os alterados após a data fornecida\n\ -\t\tSe nenhuma data for fornecida, apenas copiar se o destino for mais antigo\n\ -\t\tque a fonte\n\n" +[/D | /D:m-d-y] Copiar novos ficheiros ou os alterados após a data fornecida\n\ +\t\tSe nenhuma data for fornecida, apenas copiar se o destino\n\ +\t\tfor mais antigo que a fonte\n\n" } diff --git a/reactos/base/applications/cmdutils/xcopy/Uk.rc b/reactos/base/applications/cmdutils/xcopy/Uk.rc index 6d59e1bfac6..eb0ec1fe57d 100644 --- a/reactos/base/applications/cmdutils/xcopy/Uk.rc +++ b/reactos/base/applications/cmdutils/xcopy/Uk.rc @@ -34,8 +34,7 @@ STRINGTABLE STRING_PAUSE, "ÐатиÑніть щоб почати копіюваннÑ\n" STRING_SIMCOPY, "%d файл(ів) буде Ñкопійовано\n" STRING_COPY, "%d файл(ів) Ñкопійовано\n" - STRING_QISDIR, "'%s' Ñ” файлом чи директорією\n" \ - "on the target?\n" \ + STRING_QISDIR, "'%s' Ñ” файлом чи директорією?\n" \ "(F - Файл, D - ДиректоріÑ)\n" STRING_SRCPROMPT,"%s? (Yes|No)\n" STRING_OVERWRITE,"ПерепиÑати %s? (Yes|No|All)\n" @@ -51,34 +50,34 @@ STRINGTABLE STRING_HELP, "XCOPY - Копіює файли та дерева директорій за призначеннÑм\n\ \n\ -Syntax:\n\ +СинтакÑиÑ:\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\ \n\ -[/I] Assume directory if destination does not exist and copying 2 or\n\ -\tmore files\n\ +[/I] Якщо кінцева папка відÑÑƒÑ‚Ð½Ñ Ñ– копіюєтьÑÑ Ð±iльше одного файлу,\n\ +\tто припуÑкаєтьÑÑ, що мiÑце Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ” папкою\n\ [/S] Копіює директорії та піддиректорії\n\ [/E] Копіює директорії та піддиректорії, включно з порожніми\n\ -[/Q] Do not list names during copy, ie quiet.\n\ +[/Q] Ðе відображає імена файлів під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ.\n\ [/F] Під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ” повні імена початкових Ñ– кінцевих файлів\n\ -[/L] Simulate operation, showing names which would be copied\n\ +[/L] Виводить ÑпиÑок файлів, Ñкі будуть Ñкопійовані\n\ [/W] Питає Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ початком копіюваннÑ\n\ [/T] Створює Ñтруктуру каталогів але не копіює файли\n\ -[/Y] Suppress prompting when overwriting files\n\ +[/Y] Придушує запит на Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñу файлів\n\ [/-Y] Питає Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð° Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²\n\ -[/P] Prompts on each source file before copying\n\ +[/P] Питає Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ копійованого файлу\n\ [/N] Копіює, викориÑтовуючи короткі імена\n\ -[/U] Copy only files which already exist in destination\n\ +[/U] Копіює лише Ñ‚Ñ– файли, Ñк вже iÑнують в кінцевій папці\n\ [/R] ПерезапиÑує файли, доÑтупні лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\n\ -[/H] Include hidden and system files in the copy\n\ -[/C] Продовжує роботу, навіть Ñкщо при копіюванні виникла помилка\n\ +[/H] Копіює також приховані та ÑиÑтемні файли\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" +[/D | /D:m-d-y] Копіює лише нові файли або Ñ‚Ñ–, Ñкі були змінені піÑÐ»Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ñ—\n\ +дати. Якщо дата не вказана, копіює лише Ñ‚Ñ– файли, Ñкі новіші\n\ +в початковій папці\n\n" } diff --git a/reactos/base/applications/cmdutils/xcopy/rsrc.rc b/reactos/base/applications/cmdutils/xcopy/rsrc.rc index 06a61dbca3e..60fa9083732 100644 --- a/reactos/base/applications/cmdutils/xcopy/rsrc.rc +++ b/reactos/base/applications/cmdutils/xcopy/rsrc.rc @@ -31,7 +31,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Ko.rc" #include "No.rc" #include "Pl.rc" -#include "Pt.rc" /* UTF-8 */ #include "De.rc" @@ -40,6 +39,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Ja.rc" #include "Lt.rc" #include "Nl.rc" +#include "Pt.rc" #include "Ro.rc" #include "Ru.rc" #include "Si.rc" diff --git a/reactos/base/applications/winhlp32/Bg.rc b/reactos/base/applications/winhlp32/Bg.rc index e6d3143db24..ee9c07bbe71 100644 --- a/reactos/base/applications/winhlp32/Bg.rc +++ b/reactos/base/applications/winhlp32/Bg.rc @@ -20,9 +20,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Ôàéë" { MENUITEM "&Îòâîðè", MNID_FILE_OPEN @@ -68,7 +70,7 @@ MAIN_MENU MENU LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE Ïîìîù" STID_WHERROR, "ÃÐÅØÊÀ" @@ -83,5 +85,4 @@ STID_ALL_FILES, " STID_HELP_FILES_HLP, "Ïîìîùíè ôàéëîâå (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/Cs.rc b/reactos/base/applications/winhlp32/Cs.rc index a8f8db31a26..7b89d24dc3c 100644 --- a/reactos/base/applications/winhlp32/Cs.rc +++ b/reactos/base/applications/winhlp32/Cs.rc @@ -23,11 +23,13 @@ #include "winhelp_res.h" +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + /* Czech strings in CP1250 */ /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Soubor" { MENUITEM "&Otevøít", MNID_FILE_OPEN @@ -73,7 +75,7 @@ MAIN_MENU MENU LANGUAGE LANG_CZECH, SUBLANG_DEFAULT } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "Nápovìda WINE" STID_WHERROR, "CHYBA" @@ -88,5 +90,4 @@ STID_ALL_FILES, "V STID_HELP_FILES_HLP, "Soubory nápovìdy (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/Da.rc b/reactos/base/applications/winhlp32/Da.rc index 20e3331bd51..4db0268522e 100644 --- a/reactos/base/applications/winhlp32/Da.rc +++ b/reactos/base/applications/winhlp32/Da.rc @@ -74,7 +74,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -82,7 +82,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Søg" @@ -91,7 +91,7 @@ CAPTION "Søg" } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Wine Hjælp" STID_WHERROR, "FEJL" @@ -106,7 +106,6 @@ STID_ALL_FILES, "Alle filer (*.*)" STID_HELP_FILES_HLP, "Hjælpe filer (*.hlp)" STID_FILE_NOT_FOUND_s "Kan ikke finde '%s'. Vil du selv finde filen?" STID_NO_RICHEDIT "Kan ikke finde en 'richedit' implementering... Afbryder" -STID_PSH_INDEX, "Help topics: " } CONTEXT_MENU MENU diff --git a/reactos/base/applications/winhlp32/De.rc b/reactos/base/applications/winhlp32/De.rc index 2e14f70ad84..a5d2e3c8190 100644 --- a/reactos/base/applications/winhlp32/De.rc +++ b/reactos/base/applications/winhlp32/De.rc @@ -21,11 +21,13 @@ #include "winhelp_res.h" +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + #pragma code_page(65001) /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +MAIN_MENU MENU { POPUP "&Datei" { MENUITEM "Ö&ffnen...", MNID_FILE_OPEN @@ -70,7 +72,7 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -78,7 +80,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Suche" @@ -88,7 +90,7 @@ CAPTION "Suche" /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +STRINGTABLE { STID_WINE_HELP, "WINE Hilfe" STID_WHERROR, "FEHLER" @@ -106,7 +108,7 @@ STID_NO_RICHEDIT "Die Richedit Implementation konnte nicht gefunden werden... Br STID_PSH_INDEX, "Hilfethemen: " } -CONTEXT_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/En.rc b/reactos/base/applications/winhlp32/En.rc index a4e9d8add4e..7526d1c71ed 100644 --- a/reactos/base/applications/winhlp32/En.rc +++ b/reactos/base/applications/winhlp32/En.rc @@ -23,7 +23,9 @@ /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +MAIN_MENU MENU { POPUP "&File" { MENUITEM "&Open", MNID_FILE_OPEN @@ -68,7 +70,9 @@ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT } } -MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL +LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL + +MAIN_MENU MENU { POPUP "&File" { MENUITEM "&Open", MNID_FILE_OPEN @@ -113,7 +117,9 @@ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -121,7 +127,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Search" @@ -130,7 +136,7 @@ CAPTION "Search" } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "Wine Help" STID_WHERROR, "ERROR" @@ -148,7 +154,7 @@ STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" STID_PSH_INDEX, "Help topics: " } -CONTEXT_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN @@ -171,7 +177,9 @@ BEGIN END END -CONTEXT_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL +LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL + +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Es.rc b/reactos/base/applications/winhlp32/Es.rc index 745cac62692..f39ddbde6b9 100644 --- a/reactos/base/applications/winhlp32/Es.rc +++ b/reactos/base/applications/winhlp32/Es.rc @@ -22,9 +22,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +MAIN_MENU MENU { POPUP "&Archivo" { MENUITEM "A&brir...", MNID_FILE_OPEN @@ -69,7 +71,7 @@ MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Índice" @@ -77,7 +79,7 @@ CAPTION " LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Buscar" @@ -86,7 +88,7 @@ CAPTION "Buscar" } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +STRINGTABLE { STID_WINE_HELP, "Ayuda de WINE" STID_WHERROR, "ERROR" diff --git a/reactos/base/applications/winhlp32/Fi.rc b/reactos/base/applications/winhlp32/Fi.rc index 5585619e4ed..bb6b7848153 100644 --- a/reactos/base/applications/winhlp32/Fi.rc +++ b/reactos/base/applications/winhlp32/Fi.rc @@ -22,9 +22,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Tiedosto" { MENUITEM "&Avaa...", MNID_FILE_OPEN @@ -71,7 +73,7 @@ MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE Ohje" STID_WHERROR, "VIRHE" @@ -86,5 +88,4 @@ STID_ALL_FILES, "Kaikki tiedostot (*.*)" STID_HELP_FILES_HLP, "Ohjetiedostot (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/Fr.rc b/reactos/base/applications/winhlp32/Fr.rc index cedb0f694b7..4178810588c 100644 --- a/reactos/base/applications/winhlp32/Fr.rc +++ b/reactos/base/applications/winhlp32/Fr.rc @@ -22,6 +22,8 @@ #include "winhelp_res.h" +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + /* UTF-8 */ #pragma code_page(65001) @@ -74,7 +76,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -82,7 +84,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Recherche" @@ -91,7 +93,7 @@ CAPTION "Recherche" } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +STRINGTABLE { STID_WINE_HELP, "Aide de Wine" STID_WHERROR, "ERREUR" diff --git a/reactos/base/applications/winhlp32/Hu.rc b/reactos/base/applications/winhlp32/Hu.rc index ef3a1ee2bc3..4fccbebccd2 100644 --- a/reactos/base/applications/winhlp32/Hu.rc +++ b/reactos/base/applications/winhlp32/Hu.rc @@ -22,9 +22,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Fájl" { MENUITEM "&Megnyitás...", MNID_FILE_OPEN @@ -71,7 +73,7 @@ MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE súgó" STID_WHERROR, "HIBA" @@ -86,5 +88,4 @@ STID_ALL_FILES, "Minden f STID_HELP_FILES_HLP, "Súgó fájlok (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/It.rc b/reactos/base/applications/winhlp32/It.rc index 44b2481e319..b146b1009c1 100644 --- a/reactos/base/applications/winhlp32/It.rc +++ b/reactos/base/applications/winhlp32/It.rc @@ -21,11 +21,13 @@ #include "winhelp_res.h" +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + #pragma code_page(65001) /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL +MAIN_MENU MENU { POPUP "&File" { MENUITEM "&Apri...", MNID_FILE_OPEN @@ -70,7 +72,7 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Indice" @@ -78,7 +80,7 @@ CAPTION "Indice" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Cerca" @@ -87,7 +89,7 @@ CAPTION "Cerca" } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL +STRINGTABLE { STID_WINE_HELP, "Guida di WINE" STID_WHERROR, "ERRORE" @@ -105,7 +107,7 @@ STID_NO_RICHEDIT "Non è stato possibile trovare un'implementazione richedit... STID_PSH_INDEX, "Argomenti di aiuto: " } -CONTEXT_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Ja.rc b/reactos/base/applications/winhlp32/Ja.rc index b73d18dd192..8d3f3542575 100644 --- a/reactos/base/applications/winhlp32/Ja.rc +++ b/reactos/base/applications/winhlp32/Ja.rc @@ -21,12 +21,14 @@ #include "winhelp_res.h" +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + /* UTF-8 */ #pragma code_page(65001) /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "ファイル(&F)" { MENUITEM "é–‹ã(&O)", MNID_FILE_OPEN @@ -71,7 +73,7 @@ MAIN_MENU MENU LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 9, "MS Shell Dlg" CAPTION "索引" @@ -79,7 +81,7 @@ CAPTION "索引" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 9, "MS Shell Dlg" CAPTION "検索" @@ -88,7 +90,7 @@ CAPTION "検索" } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE ヘルプ" STID_WHERROR, "エラー" @@ -106,7 +108,7 @@ STID_NO_RICHEDIT "リッãƒã‚¨ãƒ‡ã‚£ãƒƒãƒˆå®Ÿè£…ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“... 終 STID_PSH_INDEX, "ヘルプ トピック: " } -CONTEXT_MENU MENU LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Ko.rc b/reactos/base/applications/winhlp32/Ko.rc index 8b4c785ed0c..e4eff0ba0b3 100644 --- a/reactos/base/applications/winhlp32/Ko.rc +++ b/reactos/base/applications/winhlp32/Ko.rc @@ -21,9 +21,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "ÆÄÀÏ(&F)" { MENUITEM "¿­±â(&O)...", MNID_FILE_OPEN @@ -69,7 +71,7 @@ MAIN_MENU MENU LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 9, "MS Shell Dlg" CAPTION "À妽º" @@ -77,7 +79,7 @@ CAPTION " LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 9, "MS Shell Dlg" CAPTION "ã±â" @@ -87,7 +89,7 @@ CAPTION "ã /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "Wine µµ¿ò¸»" STID_WHERROR, "¿¡·¯" @@ -105,7 +107,7 @@ STID_NO_RICHEDIT "richedit STID_PSH_INDEX, "µµ¿ò¸» ¸ñÂ÷: " } -CONTEXT_MENU MENU LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Lt.rc b/reactos/base/applications/winhlp32/Lt.rc index f8e78681aae..b6ee9c792fb 100644 --- a/reactos/base/applications/winhlp32/Lt.rc +++ b/reactos/base/applications/winhlp32/Lt.rc @@ -72,7 +72,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Indeksas" @@ -80,7 +80,7 @@ CAPTION "Indeksas" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "PaieÅ¡ka" @@ -89,7 +89,7 @@ CAPTION "PaieÅ¡ka" } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Wine žinynas" STID_WHERROR, "KLAIDA" diff --git a/reactos/base/applications/winhlp32/Nl.rc b/reactos/base/applications/winhlp32/Nl.rc index 9294856e7dd..228667df4ba 100644 --- a/reactos/base/applications/winhlp32/Nl.rc +++ b/reactos/base/applications/winhlp32/Nl.rc @@ -72,7 +72,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -80,7 +80,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Zoeken" @@ -89,7 +89,7 @@ CAPTION "Zoeken" } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Wine Help" STID_WHERROR, "FOUT" diff --git a/reactos/base/applications/winhlp32/No.rc b/reactos/base/applications/winhlp32/No.rc index 2cf2a782372..141ad3a1b84 100644 --- a/reactos/base/applications/winhlp32/No.rc +++ b/reactos/base/applications/winhlp32/No.rc @@ -20,9 +20,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL +MAIN_MENU MENU { POPUP "&Fil" { MENUITEM "&Åpne", MNID_FILE_OPEN @@ -67,7 +69,7 @@ MAIN_MENU MENU LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Innhold" @@ -75,7 +77,7 @@ CAPTION "Innhold" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Søk" @@ -84,7 +86,7 @@ CAPTION "S } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL +STRINGTABLE { STID_WINE_HELP, "Hjelp" STID_WHERROR, "FEIL" @@ -102,7 +104,7 @@ STID_NO_RICHEDIT "Klarte ikke finne richedit; avbryter" STID_PSH_INDEX, "Emner i Hjelp: " } -CONTEXT_MENU MENU LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Pl.rc b/reactos/base/applications/winhlp32/Pl.rc index f549b25de60..2a561f2c0b8 100644 --- a/reactos/base/applications/winhlp32/Pl.rc +++ b/reactos/base/applications/winhlp32/Pl.rc @@ -72,7 +72,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Indeks" @@ -80,7 +80,7 @@ CAPTION "Indeks" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Szukaj" @@ -89,7 +89,7 @@ CAPTION "Szukaj" } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "WINE - Pomoc" STID_WHERROR, "B£¥D" diff --git a/reactos/base/applications/winhlp32/Pt.rc b/reactos/base/applications/winhlp32/Pt.rc index 28933a22a6f..4b62a5fbb19 100644 --- a/reactos/base/applications/winhlp32/Pt.rc +++ b/reactos/base/applications/winhlp32/Pt.rc @@ -8,6 +8,7 @@ * Copyright 2003 Marcelo Duarte * Copyright 2004,2007 Américo José Melo * Copyright 2009 Ricardo Filipe + * Copyright 2010 Gustavo Henrique Milaré * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -50,21 +51,21 @@ MAIN_MENU MENU POPUP "In&dicador" { MENUITEM "&Definir...", MNID_BKMK_DEFINE } - POPUP "&Options" { - POPUP "Help always visible" + POPUP "&Opções" { + POPUP "Ajuda sempre visível" BEGIN - MENUITEM "Default", MNID_OPTS_HELP_DEFAULT - MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE - MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE + MENUITEM "Padrão", MNID_OPTS_HELP_DEFAULT + MENUITEM "Visível", MNID_OPTS_HELP_VISIBLE + MENUITEM "Invisível", MNID_OPTS_HELP_NONVISIBLE END - MENUITEM "History", MNID_OPTS_HISTORY - POPUP "Fonts" + MENUITEM "Histórico", MNID_OPTS_HISTORY + POPUP "Fontes" BEGIN - MENUITEM "Small", MNID_OPTS_FONTS_SMALL + MENUITEM "Pequeno", MNID_OPTS_FONTS_SMALL MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL - MENUITEM "Large", MNID_OPTS_FONTS_LARGE + MENUITEM "Grande", MNID_OPTS_FONTS_LARGE END - MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Usar cores do sistema", MNID_OPTS_SYSTEM_COLORS } POPUP "Aj&uda" { MENUITEM "Ajuda &na ajuda", MNID_HELP_HELPON @@ -72,7 +73,7 @@ MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Informações...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "&Sobre WINE", MNID_HELP_WINE + MENUITEM "&Sobre o WINE", MNID_HELP_WINE #endif } } @@ -124,7 +125,9 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE +LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL + +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Ãndice" @@ -132,7 +135,7 @@ CAPTION "Ãndice" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Procura" @@ -144,7 +147,7 @@ CAPTION "Procura" LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Ajuda WINE" STID_WHERROR, "ERRO" @@ -153,18 +156,18 @@ STID_INFO, "Informação" STID_NOT_IMPLEMENTED, "Não implementado" STID_HLPFILE_ERROR_s, "Erro encontrado na leitura do arquivo de ajuda '%s'" STID_INDEX, "&Conteúdo" -STID_CONTENTS, "Summary" +STID_CONTENTS, "Sumário" STID_BACK, "&Voltar" STID_ALL_FILES, "Todos os arquivos (*.*)" STID_HELP_FILES_HLP, "Arquivos de ajuda (*.hlp)" -STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" -STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " +STID_FILE_NOT_FOUND_s "Não é possível encontrar '%s'. Deseja procurar este arquivo você mesmo?" +STID_NO_RICHEDIT "Não foi possível encontrar uma implementação do richedit... Abortando" +STID_PSH_INDEX, "Tópicos de ajuda: " } LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Ajuda WINE" STID_WHERROR, "ERRO" @@ -182,7 +185,36 @@ STID_NO_RICHEDIT "Não foi possível encontrar uma implementação do richedit.. STID_PSH_INDEX, "Tópicos de ajuda: " } -CONTEXT_MENU MENU LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + +CONTEXT_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "Anotação...", MNID_CTXT_ANNOTATE + MENUITEM "Copiar", MNID_CTXT_COPY + MENUITEM "Imprimir...", MNID_CTXT_PRINT + POPUP "Fontes" + BEGIN + MENUITEM "Pequeno", MNID_CTXT_FONTS_SMALL + MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL + MENUITEM "Grande", MNID_CTXT_FONTS_LARGE + END + POPUP "Ajuda sempre visível" + BEGIN + MENUITEM "Padrão", MNID_CTXT_HELP_DEFAULT + MENUITEM "Visível", MNID_CTXT_HELP_VISIBLE + MENUITEM "Invisível", MNID_CTXT_HELP_NONVISIBLE + END + MENUITEM "Usar cores do sistema", MNID_CTXT_SYSTEM_COLORS + END +END + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Rm.rc b/reactos/base/applications/winhlp32/Rm.rc index 3b2a1fa9403..a5462b87a32 100644 --- a/reactos/base/applications/winhlp32/Rm.rc +++ b/reactos/base/applications/winhlp32/Rm.rc @@ -22,6 +22,8 @@ #include "winhelp_res.h" +LANGUAGE LANG_ROMANSH, SUBLANG_DEFAULT + #pragma code_page(65001) /* FIXME: This file is in the Vallader Romansh dialect and not in the @@ -29,7 +31,7 @@ /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_ROMANSH, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Datoteca" { MENUITEM "&Rivir", MNID_FILE_OPEN @@ -75,7 +77,7 @@ MAIN_MENU MENU LANGUAGE LANG_ROMANSH, SUBLANG_DEFAULT } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_ROMANSH, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE ag�d" STID_WHERROR, "SBAGL" @@ -90,5 +92,4 @@ STID_ALL_FILES, "Tuot las datotecas (*.*)" STID_HELP_FILES_HLP, "Datotecas d'ag�d (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/Ro.rc b/reactos/base/applications/winhlp32/Ro.rc index 1f916ac21d5..845b1cc5754 100644 --- a/reactos/base/applications/winhlp32/Ro.rc +++ b/reactos/base/applications/winhlp32/Ro.rc @@ -73,7 +73,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -81,7 +81,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Căutare" @@ -90,7 +90,7 @@ CAPTION "Căutare" } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Ajutor Wine" STID_WHERROR, "EROARE" diff --git a/reactos/base/applications/winhlp32/Ru.rc b/reactos/base/applications/winhlp32/Ru.rc index 43181cc1e47..f8bc3cbe924 100644 --- a/reactos/base/applications/winhlp32/Ru.rc +++ b/reactos/base/applications/winhlp32/Ru.rc @@ -72,7 +72,7 @@ MAIN_MENU MENU } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Указатель" @@ -80,7 +80,7 @@ CAPTION "Указатель" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "ПоиÑк" @@ -89,7 +89,7 @@ CAPTION "ПоиÑк" } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "Справка WINE" STID_WHERROR, "ОШИБКÐ" diff --git a/reactos/base/applications/winhlp32/Si.rc b/reactos/base/applications/winhlp32/Si.rc index 527b45431ee..340b9414551 100644 --- a/reactos/base/applications/winhlp32/Si.rc +++ b/reactos/base/applications/winhlp32/Si.rc @@ -20,11 +20,13 @@ #include "winhelp_res.h" +LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT + #pragma code_page(65001) /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Datoteka" { MENUITEM "&Odpri", MNID_FILE_OPEN @@ -69,7 +71,7 @@ MAIN_MENU MENU LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Indeks" @@ -77,7 +79,7 @@ CAPTION "Indeks" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Iskanje" @@ -86,7 +88,7 @@ CAPTION "Iskanje" } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE PomoÄ" STID_WHERROR, "NAPAKA" @@ -104,7 +106,7 @@ STID_NO_RICHEDIT "Ne morem najti knjižnice richedit ... Prekinjam" STID_PSH_INDEX, "Teme pomoÄi: " } -CONTEXT_MENU MENU LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Sk.rc b/reactos/base/applications/winhlp32/Sk.rc index 1b45e1fe89e..773f5405e9d 100644 --- a/reactos/base/applications/winhlp32/Sk.rc +++ b/reactos/base/applications/winhlp32/Sk.rc @@ -20,7 +20,9 @@ #include "winhelp_res.h" -MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT +LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT + +MAIN_MENU MENU { POPUP "&Súbor" { MENUITEM "&Otvori...", MNID_FILE_OPEN @@ -66,7 +68,7 @@ MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE Pomoc" STID_WHERROR, "CHYBA" @@ -81,5 +83,4 @@ STID_ALL_FILES, "V STID_HELP_FILES_HLP, "Súbory pomoci (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/Sv.rc b/reactos/base/applications/winhlp32/Sv.rc index 935b618909b..8a5da49ce54 100644 --- a/reactos/base/applications/winhlp32/Sv.rc +++ b/reactos/base/applications/winhlp32/Sv.rc @@ -24,9 +24,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +MAIN_MENU MENU { POPUP "&Arkiv" { MENUITEM "&Öppna", MNID_FILE_OPEN @@ -71,7 +73,7 @@ MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL } } -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Index" @@ -79,7 +81,7 @@ CAPTION "Index" LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Sök" @@ -88,7 +90,7 @@ CAPTION "S } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +STRINGTABLE { STID_WINE_HELP, "Wine Hjälp" STID_WHERROR, "FEL" @@ -106,7 +108,7 @@ STID_NO_RICHEDIT "Kan inte hitta en implementation av richedit... Avslutar" STID_PSH_INDEX, "Hjälprubriker: " } -CONTEXT_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/winhlp32/Tr.rc b/reactos/base/applications/winhlp32/Tr.rc index 876f33caa2f..62202f7fc95 100644 --- a/reactos/base/applications/winhlp32/Tr.rc +++ b/reactos/base/applications/winhlp32/Tr.rc @@ -20,9 +20,11 @@ #include "winhelp_res.h" +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Dosya" { MENUITEM "&Aç", MNID_FILE_OPEN @@ -68,7 +70,7 @@ MAIN_MENU MENU LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "WINE Yardým" STID_WHERROR, "HATA" @@ -83,5 +85,4 @@ STID_ALL_FILES, "T STID_HELP_FILES_HLP, "Yardým dosyalarý (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " } diff --git a/reactos/base/applications/winhlp32/Uk.rc b/reactos/base/applications/winhlp32/Uk.rc index bf026b0eca1..f4e72d0e8ee 100644 --- a/reactos/base/applications/winhlp32/Uk.rc +++ b/reactos/base/applications/winhlp32/Uk.rc @@ -28,9 +28,11 @@ /* UTF-8 */ #pragma code_page(65001) +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +MAIN_MENU MENU { POPUP "&Файл" { MENUITEM "&Відкрити", MNID_FILE_OPEN @@ -43,17 +45,17 @@ MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT POPUP "&Правка" { MENUITEM "&Копіювати...", MNID_EDIT_COPYDLG MENUITEM SEPARATOR - MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE + MENUITEM "&Замітки...", MNID_EDIT_ANNOTATE } POPUP "&Закладка" { - MENUITEM "&Define...", MNID_BKMK_DEFINE + MENUITEM "&Задати...", MNID_BKMK_DEFINE } POPUP "&ÐалаштуваннÑ" { - POPUP "Help always visible" + POPUP "ВидиміÑÑ‚ÑŒ Довідки" BEGIN MENUITEM "За замовчуваннÑм", MNID_OPTS_HELP_DEFAULT - MENUITEM "Видимий", MNID_OPTS_HELP_VISIBLE - MENUITEM "Ðевидимий", MNID_OPTS_HELP_NONVISIBLE + MENUITEM "Зверху", MNID_OPTS_HELP_VISIBLE + MENUITEM "Ðе зверху", MNID_OPTS_HELP_NONVISIBLE END MENUITEM "ІÑторіÑ", MNID_OPTS_HISTORY POPUP "Шрифти" @@ -65,7 +67,7 @@ MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT MENUITEM "ВикориÑтати ÑиÑтемні кольори", MNID_OPTS_SYSTEM_COLORS } POPUP "&Довідка" { - MENUITEM "Help &on help", MNID_HELP_HELPON + MENUITEM "Довідка &про Довідку", MNID_HELP_HELPON MENUITEM "Завжди &зверху", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&ІнформаціÑ...", MNID_HELP_ABOUT @@ -75,69 +77,24 @@ MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT } } -MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL -{ - POPUP "&Файл" { - MENUITEM "&Відкрити", MNID_FILE_OPEN - MENUITEM SEPARATOR - MENUITEM "&Друк", MNID_FILE_PRINT - MENUITEM "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &принтера...", MNID_FILE_SETUP - MENUITEM SEPARATOR - MENUITEM "Ð’&ихід", MNID_FILE_EXIT - } - POPUP "&Правка" { - MENUITEM "&Копіювати...", MNID_EDIT_COPYDLG - MENUITEM SEPARATOR - MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE - } - POPUP "&Закладка" { - MENUITEM "&Define...", MNID_BKMK_DEFINE - } - POPUP "&ÐалаштуваннÑ" { - POPUP "Help always visible" - BEGIN - MENUITEM "За замовчуваннÑм", MNID_OPTS_HELP_DEFAULT - MENUITEM "Видимий", MNID_OPTS_HELP_VISIBLE - MENUITEM "Ðевидимий", MNID_OPTS_HELP_NONVISIBLE - END - MENUITEM "ІÑторіÑ", MNID_OPTS_HISTORY - POPUP "Шрифти" - BEGIN - MENUITEM "Малий", MNID_OPTS_FONTS_SMALL - MENUITEM "Ðормальний", MNID_OPTS_FONTS_NORMAL - MENUITEM "Великий", MNID_OPTS_FONTS_LARGE - END - MENUITEM "ВикориÑтати ÑиÑтемні кольори", MNID_OPTS_SYSTEM_COLORS - } - POPUP "&Довідка" { - MENUITEM "Help &on help", MNID_HELP_HELPON - MENUITEM "Завжди &зверху", MNID_HELP_HELPTOP - MENUITEM SEPARATOR - MENUITEM "&ІнформаціÑ...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Про Wine", MNID_HELP_WINE -#endif - } -} - -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +IDD_INDEX DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Index" +CAPTION "Вказівник" { LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER } -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +IDD_SEARCH DIALOG 0, 0, 200, 190 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Search" +CAPTION "Пошук" { LTEXT "Ще не впроваджено", -1, 10, 10, 180, 150 } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +STRINGTABLE { STID_WINE_HELP, "Довідка Wine" STID_WHERROR, "ПОМИЛКÐ" @@ -145,21 +102,21 @@ STID_WARNING, "УВÐГÐ" STID_INFO, "ІнформаціÑ" STID_NOT_IMPLEMENTED, "Ðе впроваджено" STID_HLPFILE_ERROR_s, "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ довідки `%s'" -STID_INDEX, "&Index" -STID_CONTENTS, "Summary" +STID_INDEX, "&ЗміÑÑ‚" +STID_CONTENTS, "Сумарно" STID_BACK, "&Ðазад" STID_ALL_FILES, "Ð’ÑÑ– файли (*.*)" STID_HELP_FILES_HLP, "Файли довідки (*.hlp)" STID_FILE_NOT_FOUND_s "Ðе можу знайти '%s'. Хочете знайти цей файл Ñамотужки?" -STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" +STID_NO_RICHEDIT "Ðе можу знайти richedit... СкаÑовую" STID_PSH_INDEX, "Розділи Довідки: " } -CONTEXT_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +CONTEXT_MENU MENU BEGIN POPUP "" BEGIN - MENUITEM "Annotation...", MNID_CTXT_ANNOTATE + MENUITEM "Замітки...", MNID_CTXT_ANNOTATE MENUITEM "Копіювати", MNID_CTXT_COPY MENUITEM "Друк...", MNID_CTXT_PRINT POPUP "Шрифти" @@ -168,35 +125,12 @@ BEGIN MENUITEM "Ðормальний", MNID_CTXT_FONTS_NORMAL MENUITEM "Великий", MNID_CTXT_FONTS_LARGE END - POPUP "Довідка завжди видима" + POPUP "ВидиміÑÑ‚ÑŒ Довідки" BEGIN MENUITEM "За замовчуваннÑм", MNID_CTXT_HELP_DEFAULT - MENUITEM "Видима", MNID_CTXT_HELP_VISIBLE - MENUITEM "Ðевидима", MNID_CTXT_HELP_NONVISIBLE + MENUITEM "Зверху", MNID_CTXT_HELP_VISIBLE + MENUITEM "Ðе зверху", MNID_CTXT_HELP_NONVISIBLE END MENUITEM "ВикориÑтати ÑиÑтемні кольори", MNID_CTXT_SYSTEM_COLORS END END - -CONTEXT_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL -BEGIN - POPUP "" - BEGIN - MENUITEM "Annotation...", MNID_CTXT_ANNOTATE - MENUITEM "Копіювати", MNID_CTXT_COPY - MENUITEM "Друк...", MNID_CTXT_PRINT - POPUP "Шрифти" - BEGIN - MENUITEM "Малий", MNID_CTXT_FONTS_SMALL - MENUITEM "Ðормальний", MNID_CTXT_FONTS_NORMAL - MENUITEM "Великий", MNID_CTXT_FONTS_LARGE - END - POPUP "Довідка завжди видима" - BEGIN - MENUITEM "За замовчуваннÑм", MNID_CTXT_HELP_DEFAULT - MENUITEM "Видима", MNID_CTXT_HELP_VISIBLE - MENUITEM "Ðевидима", MNID_CTXT_HELP_NONVISIBLE - END - MENUITEM "ВикориÑтати Ñитемні кольори", MNID_CTXT_SYSTEM_COLORS - END -END diff --git a/reactos/base/applications/winhlp32/Zh.rc b/reactos/base/applications/winhlp32/Zh.rc index ed20356cf47..9401e74a84c 100644 --- a/reactos/base/applications/winhlp32/Zh.rc +++ b/reactos/base/applications/winhlp32/Zh.rc @@ -75,7 +75,7 @@ MAIN_MENU MENU } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "WINE 帮助" STID_WHERROR, "错误" @@ -143,7 +143,7 @@ MAIN_MENU MENU } /* Strings */ -STRINGTABLE DISCARDABLE +STRINGTABLE { STID_WINE_HELP, "WINE 幫助" STID_WHERROR, "錯誤" diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc index b3a8e0a526f..64b49ef9230 100644 --- a/reactos/base/applications/wordpad/Da.rc +++ b/reactos/base/applications/wordpad/Da.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_DANISH, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Fil" BEGIN @@ -96,7 +96,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -109,7 +109,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -133,7 +133,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Dato og tid" FONT 10, "MS Sans Serif" @@ -144,7 +144,7 @@ BEGIN PUSHBUTTON "&Annuller",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Ny" FONT 10, "MS Sans Serif" @@ -155,7 +155,7 @@ BEGIN PUSHBUTTON "&Annuller",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Formater afsnit" FONT 8, "MS Shell Dlg" @@ -173,7 +173,7 @@ BEGIN PUSHBUTTON "&Annuller", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulatorer" FONT 8, "MS SHell DLg" @@ -187,7 +187,7 @@ BEGIN PUSHBUTTON "Fjern all&e", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -204,7 +204,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Rig tekstformat (*.rtf)" STRING_TEXT_FILES_TXT, "Tekstdokument (*.txt)" @@ -212,33 +212,33 @@ BEGIN STRING_ALL_FILES, "Alle filer (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Rig tekstdokument" STRING_NEWFILE_TXT, "Tekstdokument" STRING_NEWFILE_TXT_UNICODE, "Tekstdokument (Unicode)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Venstrestillet" STRING_ALIGN_RIGHT, "Højrestillet" STRING_ALIGN_CENTER, "Midterstillet" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Printerfiler (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Alternativer" STRING_VIEWPROPS_TEXT, "Tekst" STRING_VIEWPROPS_RICHTEXT, "Rig tekst" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Udskriv" STRING_PREVIEW_NEXTPAGE, "Næste side" @@ -256,7 +256,7 @@ BEGIN STRING_UNITS_PT, "pkt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Gemme ændringer i «%s»?" diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc index f6079c53541..a369f38a593 100644 --- a/reactos/base/applications/wordpad/De.rc +++ b/reactos/base/applications/wordpad/De.rc @@ -22,7 +22,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL #pragma code_page(65001) -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Datei" BEGIN @@ -95,7 +95,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -108,7 +108,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -132,7 +132,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum und Uhrzeit" FONT 10, "MS Sans Serif" @@ -143,7 +143,7 @@ BEGIN PUSHBUTTON "A&bbrechen",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Neu" FONT 10, "MS Sans Serif" @@ -154,7 +154,7 @@ BEGIN PUSHBUTTON "A&bbrechen",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Absatz" FONT 8, "MS Shell Dlg" @@ -172,7 +172,7 @@ BEGIN PUSHBUTTON "A&bbrechen", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabstopps" FONT 8, "MS SHell DLg" @@ -186,7 +186,7 @@ BEGIN PUSHBUTTON "&Alle löschen", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -203,7 +203,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "RTF-Format (*.rtf)" STRING_TEXT_FILES_TXT, "Textdokumente (*.txt)" @@ -211,33 +211,33 @@ BEGIN STRING_ALL_FILES, "Alle Dokumente (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Links" STRING_ALIGN_RIGHT, "Rechts" STRING_ALIGN_CENTER, "Zentriert" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "RTF-Dokument" STRING_NEWFILE_TXT, "Textdokument" STRING_NEWFILE_TXT_UNICODE, "Unicode-Textdokument" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Druckerdateien (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Optionen" STRING_VIEWPROPS_TEXT, "Text" STRING_VIEWPROPS_RICHTEXT, "Rich Text" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "&Drucken" STRING_PREVIEW_NEXTPAGE, "&Nächste" @@ -255,7 +255,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Änderungen an '%s' speichern?" diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index 312f0ebbf5e..9ee5521bd1e 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/base/applications/wordpad/En.rc @@ -20,7 +20,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&File" BEGIN @@ -93,7 +93,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -106,7 +106,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -130,7 +130,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Date and time" FONT 10, "MS Sans Serif" @@ -141,7 +141,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "New" FONT 10, "MS Sans Serif" @@ -152,7 +152,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Paragraph format" FONT 8, "MS Shell Dlg" @@ -170,7 +170,7 @@ BEGIN PUSHBUTTON "&Cancel", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabs" FONT 8, "MS SHell DLg" @@ -184,7 +184,7 @@ BEGIN PUSHBUTTON "Remove al&l", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -201,7 +201,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "All documents (*.*)" STRING_TEXT_FILES_TXT, "Text documents (*.txt)" @@ -213,21 +213,21 @@ BEGIN STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Left" STRING_ALIGN_RIGHT, "Right" STRING_ALIGN_CENTER, "Center" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Options" STRING_VIEWPROPS_TEXT, "Text" STRING_VIEWPROPS_RICHTEXT, "Rich text" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Print" STRING_PREVIEW_NEXTPAGE, "Next page" @@ -245,7 +245,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" @@ -266,7 +266,7 @@ END LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Left" STRING_ALIGN_RIGHT, "Right" diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 499c05b1bd3..b315bfbd27e 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/base/applications/wordpad/Fr.rc @@ -24,7 +24,7 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Fichier" BEGIN @@ -97,7 +97,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -110,7 +110,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -134,7 +134,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Date et heure" FONT 10, "MS Sans Serif" @@ -145,7 +145,7 @@ BEGIN PUSHBUTTON "&Annuler",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Nouveau" FONT 10, "MS Sans Serif" @@ -156,7 +156,7 @@ BEGIN PUSHBUTTON "&Annuler",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Format de paragraphe" FONT 8, "MS Shell Dlg" @@ -174,7 +174,7 @@ BEGIN PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulations" FONT 8, "MS SHell DLg" @@ -188,7 +188,7 @@ BEGIN PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 56, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -205,7 +205,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Format de texte enrichi (*.rtf)" STRING_TEXT_FILES_TXT, "Documents texte (*.txt)" @@ -213,33 +213,33 @@ BEGIN STRING_ALL_FILES, "Tous les documents (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Gauche" STRING_ALIGN_RIGHT, "Droite" STRING_ALIGN_CENTER, "Centrer" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Format de texte enrichi (RTF)" STRING_NEWFILE_TXT, "Document texte" STRING_NEWFILE_TXT_UNICODE, "Document texte Unicode" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Fichiers d'impression (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Options" STRING_VIEWPROPS_TEXT, "Texte" STRING_VIEWPROPS_RICHTEXT, "Texte riche" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Imprimer" STRING_PREVIEW_NEXTPAGE, "Page suivante" @@ -257,7 +257,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de « %s » ?" diff --git a/reactos/base/applications/wordpad/Hu.rc b/reactos/base/applications/wordpad/Hu.rc index 5f5cb2f65dc..da13a26ab8f 100644 --- a/reactos/base/applications/wordpad/Hu.rc +++ b/reactos/base/applications/wordpad/Hu.rc @@ -20,7 +20,7 @@ LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Fájl" BEGIN @@ -93,7 +93,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/wordpad/It.rc b/reactos/base/applications/wordpad/It.rc index 121f72011fe..de9828eb1b9 100644 --- a/reactos/base/applications/wordpad/It.rc +++ b/reactos/base/applications/wordpad/It.rc @@ -24,7 +24,7 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&File" BEGIN @@ -97,7 +97,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -110,7 +110,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -134,7 +134,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data e ora" FONT 10, "MS Sans Serif" @@ -145,7 +145,7 @@ BEGIN PUSHBUTTON "&Annulla",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Nuovo" FONT 10, "MS Sans Serif" @@ -156,7 +156,7 @@ BEGIN PUSHBUTTON "&Annulla",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Formato del paragrafo" FONT 8, "MS Shell Dlg" @@ -174,7 +174,7 @@ BEGIN PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulazioni" FONT 8, "MS SHell DLg" @@ -188,7 +188,7 @@ BEGIN PUSHBUTTON "Rimuovi &tutti", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 310, 110 +IDD_FORMATOPTS DIALOG 0, 0, 310, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -205,7 +205,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "Tutti i files (*.*)" STRING_TEXT_FILES_TXT, "File di testo (*.txt)" @@ -217,21 +217,21 @@ BEGIN STRING_PRINTER_FILES_PRN, "File di stampa (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Sinistra" STRING_ALIGN_RIGHT, "Destra" STRING_ALIGN_CENTER, "Centro" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Opzioni" STRING_VIEWPROPS_TEXT, "Testo" STRING_VIEWPROPS_RICHTEXT, "Rich text" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Stampa" STRING_PREVIEW_NEXTPAGE, "Prossima pagina" @@ -249,7 +249,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Documento" STRING_PROMPT_SAVE_CHANGES, "Salva i cambiamenti su '%s'?" diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc index 09c776f57b2..a7d59f6b6cd 100644 --- a/reactos/base/applications/wordpad/Ja.rc +++ b/reactos/base/applications/wordpad/Ja.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "ファイル(&F)" BEGIN @@ -96,7 +96,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -109,7 +109,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -133,7 +133,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "日付ã¨æ™‚刻" FONT 10, "MS Shell Dlg" @@ -144,7 +144,7 @@ BEGIN PUSHBUTTON "キャンセル(&C)",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "æ–°è¦ä½œæˆ" FONT 10, "MS Shell Dlg" @@ -155,7 +155,7 @@ BEGIN PUSHBUTTON "キャンセル(&C)",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "段è½ã®è¨­å®š" FONT 9, "MS Shell Dlg" @@ -173,7 +173,7 @@ BEGIN PUSHBUTTON "キャンセル(&C)", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "タブã®è¨­å®š" FONT 9, "MS Shell Dlg" @@ -187,7 +187,7 @@ BEGIN PUSHBUTTON "ã™ã¹ã¦å‰Šé™¤(&L)", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL CAPTION "" FONT 9, "MS Shell Dlg" @@ -204,7 +204,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« (*.*)" STRING_TEXT_FILES_TXT, "テキスト文書 (*.txt)" @@ -216,21 +216,21 @@ BEGIN STRING_PRINTER_FILES_PRN, "プリンタファイル (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "å·¦" STRING_ALIGN_RIGHT, "å³" STRING_ALIGN_CENTER, "中央" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "オプション" STRING_VIEWPROPS_TEXT, "テキスト" STRING_VIEWPROPS_RICHTEXT, "リッãƒãƒ†ã‚­ã‚¹ãƒˆ" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "å°åˆ·" STRING_PREVIEW_NEXTPAGE, "次ã®ãƒšãƒ¼ã‚¸" @@ -248,7 +248,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "文書" STRING_PROMPT_SAVE_CHANGES, "'%s'ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹?" diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc index 8a4419495c8..0df74686300 100644 --- a/reactos/base/applications/wordpad/Ko.rc +++ b/reactos/base/applications/wordpad/Ko.rc @@ -21,7 +21,7 @@ LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "ÆÄÀÏ(&F)" BEGIN @@ -94,7 +94,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -107,7 +107,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -131,7 +131,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "³¯Â¥¿Í ½Ã°£" FONT 10, "MS Shell Dlg" @@ -142,7 +142,7 @@ BEGIN PUSHBUTTON "Ãë¼Ò(&C)",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "»õ ¹®¼­" FONT 10, "MS Shell Dlg" @@ -153,7 +153,7 @@ BEGIN PUSHBUTTON "Ãë¼Ò(&C)",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "´Ü¶ô Çü½Ä" FONT 9, "MS Shell Dlg" @@ -171,7 +171,7 @@ BEGIN PUSHBUTTON "Ãë¼Ò(&C)", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "ÅÇ" FONT 9, "MS Shell Dlg" @@ -185,7 +185,7 @@ BEGIN PUSHBUTTON "¸ðµÎ Áö¿ì±â(&L)", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 9, "MS Shell Dlg" @@ -202,7 +202,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "¸ðµç ¹®¼­ (*.*)" STRING_TEXT_FILES_TXT, "ÅؽºÆ® ÆÄÀÏ (*.txt)" @@ -215,21 +215,21 @@ BEGIN END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "¿ÞÂÊ" STRING_ALIGN_RIGHT, "¿À¸¥ÂÊ" STRING_ALIGN_CENTER, "°¡¿îµ¥" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "¿É¼Ç" STRING_VIEWPROPS_TEXT, "ÅؽºÆ®" STRING_VIEWPROPS_RICHTEXT, "¸®Ä¡ ÅؽºÆ®" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Àμâ" STRING_PREVIEW_NEXTPAGE, "´ÙÀ½ ÆäÀÌÁö" @@ -247,7 +247,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "¹®¼­" STRING_PROMPT_SAVE_CHANGES, "'%s'ÀÇ ¹Ù²ï °ÍÀ» ÀúÀåÇÏ°Ú½À´Ï±î?" diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc index f9cd88f730a..82df7c893c1 100644 --- a/reactos/base/applications/wordpad/Lt.rc +++ b/reactos/base/applications/wordpad/Lt.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Failas" BEGIN @@ -96,7 +96,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -109,7 +109,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -133,7 +133,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data ir laikas" FONT 10, "MS Sans Serif" @@ -144,7 +144,7 @@ BEGIN PUSHBUTTON "&Atsisakyti",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Naujas" FONT 10, "MS Sans Serif" @@ -155,7 +155,7 @@ BEGIN PUSHBUTTON "&Atsisakyti",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Pastraipos formatas" FONT 8, "MS Shell Dlg" @@ -173,7 +173,7 @@ BEGIN PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabuliavimo žymÄ—s" FONT 8, "MS SHell DLg" @@ -187,7 +187,7 @@ BEGIN PUSHBUTTON "PaÅ¡alinti &visas", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -204,7 +204,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "RaiÅ¡kiojo teksto dokumentai (*.rtf)" STRING_TEXT_FILES_TXT, "Tekstiniai dokumentai (*.txt)" @@ -212,33 +212,33 @@ BEGIN STRING_ALL_FILES, "Visi dokumentai (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "KairinÄ—" STRING_ALIGN_RIGHT, "DeÅ¡ininÄ—" STRING_ALIGN_CENTER, "CentrinÄ—" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "RaiÅ¡kiojo teksto dokumentas" STRING_NEWFILE_TXT, "Tekstinis dokumentas" STRING_NEWFILE_TXT_UNICODE, "Teksto unikodu dokumentas" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Spausdintuvo failai (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Parinktys" STRING_VIEWPROPS_TEXT, "Tekstas" STRING_VIEWPROPS_RICHTEXT, "RaiÅ¡kusis tekstas" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Spausdinti" STRING_PREVIEW_NEXTPAGE, "Tolesnis puslapis" @@ -256,7 +256,7 @@ BEGIN STRING_UNITS_PT, "taÅ¡k." END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokumentas" STRING_PROMPT_SAVE_CHANGES, "IÅ¡saugoti „%s“ pakeitimus?" diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc index 2c363f5abcc..17b30368e8f 100644 --- a/reactos/base/applications/wordpad/Nl.rc +++ b/reactos/base/applications/wordpad/Nl.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL #pragma code_page(65001) -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Bestand" BEGIN @@ -96,7 +96,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -109,7 +109,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -133,7 +133,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum en tijd" FONT 10, "MS Sans Serif" @@ -144,7 +144,7 @@ BEGIN PUSHBUTTON "&Annuleren",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Nieuw" FONT 10, "MS Sans Serif" @@ -155,7 +155,7 @@ BEGIN PUSHBUTTON "&Annuleren",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Paragraaf formaat" FONT 8, "MS Shell Dlg" @@ -173,7 +173,7 @@ BEGIN PUSHBUTTON "&Annuleren", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabs" FONT 8, "MS SHell DLg" @@ -187,7 +187,7 @@ BEGIN PUSHBUTTON "Verwijder al&len", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -204,7 +204,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "Alle documenten (*.*)" STRING_TEXT_FILES_TXT, "Tekstdocumenten (*.txt)" @@ -216,21 +216,21 @@ BEGIN STRING_PRINTER_FILES_PRN, "Afdrukbestanden (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Links" STRING_ALIGN_RIGHT, "Rechts" STRING_ALIGN_CENTER, "Gecentreerd" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Opties" STRING_VIEWPROPS_TEXT, "Tekst" STRING_VIEWPROPS_RICHTEXT, "Rich tekst" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Afdrukken" STRING_PREVIEW_NEXTPAGE, "Volgende pagina" @@ -248,7 +248,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Wijzigingen opslaan naar '%s'?" diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc index 7fa0c84b956..dca3f95db31 100644 --- a/reactos/base/applications/wordpad/No.rc +++ b/reactos/base/applications/wordpad/No.rc @@ -1,5 +1,5 @@ /* - * Copyright 2006-2009 by Alexander N. Sørnes + * Copyright 2006-2010 by Alexander N. Sørnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,7 +22,7 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Fil" BEGIN @@ -95,7 +95,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -108,7 +108,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -118,7 +118,7 @@ BEGIN MENUITEM "Oliven" ID_COLOR_OLIVE MENUITEM "MarineblÃ¥" ID_COLOR_NAVY MENUITEM "Purpur" ID_COLOR_PURPLE - MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "BlÃ¥grønn" ID_COLOR_TEAL MENUITEM "GrÃ¥" ID_COLOR_GRAY MENUITEM "Sølv" ID_COLOR_SILVER MENUITEM "Rød" ID_COLOR_RED @@ -126,13 +126,13 @@ BEGIN MENUITEM "Gul" ID_COLOR_YELLOW MENUITEM "BlÃ¥" ID_COLOR_BLUE MENUITEM "Fuchsia" ID_COLOR_FUCHSIA - MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "Turkis" ID_COLOR_AQUA MENUITEM "Hvit" ID_COLOR_WHITE - MENUITEM "Automatic" ID_COLOR_AUTOMATIC + MENUITEM "Automatisk" ID_COLOR_AUTOMATIC END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Dato og klokkeslett" FONT 10, "MS Sans Serif" @@ -143,7 +143,7 @@ BEGIN PUSHBUTTON "&Avbryt",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Ny" FONT 10, "MS Sans Serif" @@ -154,7 +154,7 @@ BEGIN PUSHBUTTON "&Avbryt",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Formater avsnitt" FONT 8, "MS Shell Dlg" @@ -172,7 +172,7 @@ BEGIN PUSHBUTTON "&Avbryt", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulatorer" FONT 8, "MS SHell DLg" @@ -186,13 +186,13 @@ BEGIN PUSHBUTTON "Fjern all&e", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Linjebryting", -1, 10, 10, 130, 85 - RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "Ingen linjebryting", IDC_PAGEFMT_WN, 18, 25, 117, 15 RADIOBUTTON "Bryt tekst etter v&indusbredden", IDC_PAGEFMT_WW, 18, 45, 117, 15 RADIOBUTTON "Bryt tekst etter &margen", IDC_PAGEFMT_WM, 18, 65, 117, 15 GROUPBOX "Verktøylinjer", -1, 150, 10, 120, 85 @@ -203,7 +203,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Rikt tekstformat (*.rtf)" STRING_TEXT_FILES_TXT, "Tekstdokument (*.txt)" @@ -211,45 +211,51 @@ BEGIN STRING_ALL_FILES, "Alle filer (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Rikt tekstdokument" STRING_NEWFILE_TXT, "Tekstdokument" STRING_NEWFILE_TXT_UNICODE, "Tekstdokument (Unicode)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Venstrestilt" STRING_ALIGN_RIGHT, "Høyrestilt" STRING_ALIGN_CENTER, "Midtstilt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Skriverfiler (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Alternativer" STRING_VIEWPROPS_TEXT, "Tekst" STRING_VIEWPROPS_RICHTEXT, "Rik tekst" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Skriv ut" STRING_PREVIEW_NEXTPAGE, "Neste side" 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_ZOOMIN, "Forstørr" + STRING_PREVIEW_ZOOMOUT, "Forminsk" STRING_PREVIEW_CLOSE, "Lukk" + STRING_PREVIEW_PAGE, "Side" + STRING_PREVIEW_PAGES, "Sider" + STRING_UNITS_CM, "cm" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "tommer" + STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?" @@ -259,7 +265,7 @@ BEGIN "vil føre til at all formatering gÃ¥r tapt. Er du " \ "sikker pÃ¥ at du vil fortsette?" STRING_INVALID_NUMBER, "Ugyldig tallformat" - STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage documents are not supported" + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage-dokumenter støttes ikke" STRING_WRITE_FAILED, "Klarte ikke lagre filen." STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til Ã¥ lagre filen." STRING_OPEN_FAILED, "Klarte ikke Ã¥pne filen." diff --git a/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc index 053ecf20439..c2a4214f971 100644 --- a/reactos/base/applications/wordpad/Pl.rc +++ b/reactos/base/applications/wordpad/Pl.rc @@ -22,7 +22,7 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Plik" BEGIN @@ -95,7 +95,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -108,7 +108,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -132,7 +132,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data i godzina" FONT 10, "MS Sans Serif" @@ -143,7 +143,7 @@ BEGIN PUSHBUTTON "&Anuluj",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Nowy" FONT 10, "MS Sans Serif" @@ -154,7 +154,7 @@ BEGIN PUSHBUTTON "&Anuluj",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Format akapitu" FONT 8, "MS Shell Dlg" @@ -172,7 +172,7 @@ BEGIN PUSHBUTTON "&Anuluj", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulatory" FONT 8, "MS Shell Dlg" @@ -186,7 +186,7 @@ BEGIN PUSHBUTTON "Usuñ &wszystkie", ID_TAB_EMPTY, 137, 51, 57, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -203,7 +203,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Tekst sformatowany - RTF (*.rtf)" STRING_TEXT_FILES_TXT, "Dokument tekstowy (*.txt)" @@ -211,33 +211,33 @@ BEGIN STRING_ALL_FILES, "Wszystkie dokumenty (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Do lewej" STRING_ALIGN_RIGHT, "Do prawej" STRING_ALIGN_CENTER, "Wyœrodkowane" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Dokument sformatowany (RTF)" STRING_NEWFILE_TXT, "Dokument tekstowy" STRING_NEWFILE_TXT_UNICODE, "Dokument tekstowy Unicode" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Pliki drukarki (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Opcje" STRING_VIEWPROPS_TEXT, "Tekst" STRING_VIEWPROPS_RICHTEXT, "Tekst sformatowany" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Drukuj" STRING_PREVIEW_NEXTPAGE, "Nast. strona" @@ -255,7 +255,7 @@ BEGIN STRING_UNITS_PT, "punkt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Zapisaæ zmiany w pliku '%s'?" diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc index 2bc44febd79..ffb5c567a74 100644 --- a/reactos/base/applications/wordpad/Pt.rc +++ b/reactos/base/applications/wordpad/Pt.rc @@ -25,7 +25,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Arquivo" BEGIN @@ -100,7 +100,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Ficheiro" BEGIN @@ -176,7 +176,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -191,7 +191,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -207,7 +207,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -231,7 +231,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data e hora" FONT 10, "MS Sans Serif" @@ -242,7 +242,7 @@ BEGIN PUSHBUTTON "&Cancelar",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Novo" FONT 10, "MS Sans Serif" @@ -253,7 +253,7 @@ BEGIN PUSHBUTTON "&Cancelar",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 220, 110 +IDD_PARAFORMAT DIALOG 30, 20, 220, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Parágrafo" FONT 8, "MS Shell Dlg" @@ -271,7 +271,7 @@ BEGIN PUSHBUTTON "&Cancelar", IDCANCEL, 157, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulações" FONT 8, "MS SHell DLg" @@ -285,7 +285,7 @@ BEGIN PUSHBUTTON "Remover &todos", ID_TAB_EMPTY, 135, 51, 55, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -302,18 +302,10 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE -BEGIN - STRING_RICHTEXT_FILES_RTF, "Formato rich text (*.rtf)" - STRING_TEXT_FILES_TXT, "Documentos de texto (*.txt)" - STRING_TEXT_FILES_UNICODE_TXT, "Documentos de texto Unicode (*.txt)" - STRING_ALL_FILES, "Todos os documentos (*.*)" -END - LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "Todos os documentos (*.*)" STRING_TEXT_FILES_TXT, "Documentos de texto (*.txt)" @@ -327,7 +319,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "Todos os documentos (*.*)" STRING_TEXT_FILES_TXT, "Documentos de texto (*.txt)" @@ -342,21 +334,21 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Esquerda" STRING_ALIGN_RIGHT, "Direita" STRING_ALIGN_CENTER, "Centro" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Opções" STRING_VIEWPROPS_TEXT, "Texto" STRING_VIEWPROPS_RICHTEXT, "Rich text" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Imprimir" STRING_PREVIEW_NEXTPAGE, "Próxima página" @@ -377,7 +369,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Documento" STRING_PROMPT_SAVE_CHANGES, "Salvar as alterações de '%s'?" @@ -398,7 +390,7 @@ END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Documento" STRING_PROMPT_SAVE_CHANGES, "Guardar alterações a '%s'?" diff --git a/reactos/base/applications/wordpad/Ro.rc b/reactos/base/applications/wordpad/Ro.rc new file mode 100644 index 00000000000..4db8a95e9a1 --- /dev/null +++ b/reactos/base/applications/wordpad/Ro.rc @@ -0,0 +1,267 @@ +/* + * Copyright 2004 Krzysztof Foltman + * Copyright 2010 Claudia Cotună + * Michael Stefaniuc + * + * 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" + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +#pragma code_page(65001) + +IDM_MAINMENU MENU +BEGIN + POPUP "&FiÈ™ier" + BEGIN + MENUITEM "&Nou...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Deschide...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Salvează\tCtrl+S", ID_FILE_SAVE + MENUITEM "S&alvează ca...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "Im&primă...\tCtrl+P", ID_PRINT + MENUITEM "Pre&vizualizare imprimare...", ID_PREVIEW + MENUITEM "&OpÈ›iuni pagină...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "&IeÈ™ire", ID_FILE_EXIT + END + POPUP "&Editare" + BEGIN + MENUITEM "&Anulează\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "R&efă\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "&Taie\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Copiază\tCtrl+C", ID_EDIT_COPY + MENUITEM "Li&peÈ™te\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Curăță\tDEL", ID_EDIT_CLEAR + MENUITEM "&Selectează tot\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "Cău&tare...\tCrtl+F", ID_FIND + MENUITEM "Caută &următorul\tF3", ID_FIND_NEXT + MENUITEM "ÃŽ&nlocuire...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "D&oar citire", ID_EDIT_READONLY + MENUITEM "&Modificat", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "S&uplimente" + BEGIN + MENUITEM "Detal&ii pentru selecÈ›ie", ID_EDIT_SELECTIONINFO + MENUITEM "&Format caracter", ID_EDIT_CHARFORMAT + MENUITEM "For&mat caracter implicit", ID_EDIT_DEFCHARFORMAT + MENUITEM "Format ¶graf", ID_EDIT_PARAFORMAT + MENUITEM "Extra&ge textul", ID_EDIT_GETTEXT + END + END + POPUP "&Vizualizare" + BEGIN + MENUITEM "Bara de unel&te", ID_TOGGLE_TOOLBAR + MENUITEM "Bara de &format", ID_TOGGLE_FORMATBAR + MENUITEM "&Riglă", ID_TOGGLE_RULER + MENUITEM "Bară de &stare", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&OpÈ›iuni...", ID_VIEWPROPERTIES + END + POPUP "&Inserare" + BEGIN + MENUITEM "&Data È™i ora...", ID_DATETIME + END + POPUP "F&ormat" + BEGIN + MENUITEM "&Font...", ID_FONTSETTINGS + MENUITEM "Punct &bulină" ID_BULLET + MENUITEM "&Paragraf..." ID_PARAFORMAT + MENUITEM "&Taburi..." ID_TABSTOPS + POPUP "Fun&dal" + BEGIN + MENUITEM "&Sistem\tCtrl+1", ID_BACK_1 + MENUITEM "Gălbui de &post-it\tCtrl+2", ID_BACK_2 + END + END + POPUP "&Ajutor" + BEGIN + MENUITEM "&Despre Wine Wordpad" ID_ABOUT + END +END + +IDM_POPUP MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&Taie", ID_EDIT_CUT + MENUITEM "&Copiază", ID_EDIT_COPY + MENUITEM "&LipeÈ™te", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "Punct &bulină" ID_BULLET + MENUITEM "&Paragraf..." ID_PARAFORMAT + END +END + +IDM_COLOR_POPUP MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "Negru", ID_COLOR_BLACK + MENUITEM "Maro", ID_COLOR_MAROON + MENUITEM "Verde", ID_COLOR_GREEN + MENUITEM "Oliv" ID_COLOR_OLIVE + MENUITEM "Bleumarin" ID_COLOR_NAVY + MENUITEM "Violet" ID_COLOR_PURPLE + MENUITEM "Verde-albăstrui" ID_COLOR_TEAL + MENUITEM "Gri" ID_COLOR_GRAY + MENUITEM "Argintiu" ID_COLOR_SILVER + MENUITEM "RoÈ™u" ID_COLOR_RED + MENUITEM "Lămâie verde" ID_COLOR_LIME + MENUITEM "Galben" ID_COLOR_YELLOW + MENUITEM "Albastru" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Culoarea apei" ID_COLOR_AQUA + MENUITEM "Alb" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + +IDD_DATETIME DIALOG 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Data È™i ora" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Formate disponibile",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&OK",IDOK,87,12,40,12 + PUSHBUTTON "&Anulează",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Nou" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Nou tip de document",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&OK",IDOK,97,12,40,12 + PUSHBUTTON "&Anulează",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Format paragraf" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Indentare", -1, 10, 10, 120, 68 + LTEXT "Stânga", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "Dreapta", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "Primul rând", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "Aliniere", -1, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Anulează", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Taburi" +FONT 8, "MS SHell DLg" +BEGIN + GROUPBOX "SpaÈ›iere tab", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Adaugă", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Elimină", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Anulează", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "E&limină tot", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "DespărÈ›ire rânduri", -1, 10, 10, 130, 85 + RADIOBUTTON "Fără desparÈ›ire râ&nduri", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "ÃŽncadrează textul în chenarul &ferestrei", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "ÃŽncadrează textul în limitele ri&glei", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Bare de unelte", -1, 150, 10, 120, 85 + CHECKBOX "Bara de unel&te", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "Bara de &format", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "&Riglă", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "Bară de &stare", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE +BEGIN + STRING_ALL_FILES, "Toate documentele (*.*)" + STRING_TEXT_FILES_TXT, "Documentele text (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Documentele text unicode (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Formatul de text îmbogățit (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Document text îmbogățit" + STRING_NEWFILE_TXT, "Document text" + STRING_NEWFILE_TXT_UNICODE, "Document text unicode" + STRING_PRINTER_FILES_PRN, "FiÈ™iere de imprimat (*.PRN)" +END + +STRINGTABLE +BEGIN + STRING_ALIGN_LEFT, "Stânga" + STRING_ALIGN_RIGHT, "Dreapta" + STRING_ALIGN_CENTER, "Centru" +END + +STRINGTABLE +BEGIN + STRING_VIEWPROPS_TITLE, "OpÈ›iuni" + STRING_VIEWPROPS_TEXT, "Text" + STRING_VIEWPROPS_RICHTEXT, "Text îmbogățit" +END + +STRINGTABLE +BEGIN + STRING_PREVIEW_PRINT, "Imprimă" + STRING_PREVIEW_NEXTPAGE, "Pagina următoare" + STRING_PREVIEW_PREVPAGE, "Pagina precedentă" + STRING_PREVIEW_TWOPAGES, "Două pagini" + STRING_PREVIEW_ONEPAGE, "O pagină" + STRING_PREVIEW_ZOOMIN, "MăreÈ™te" + STRING_PREVIEW_ZOOMOUT, "MicÈ™orează" + STRING_PREVIEW_CLOSE, "ÃŽnchide" + STRING_PREVIEW_PAGE, "Pagină" + STRING_PREVIEW_PAGES, "Pagini" + STRING_UNITS_CM, "cm" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "È›ol" + STRING_UNITS_PT, "pt" +END + +STRINGTABLE +BEGIN + STRING_DEFAULT_FILENAME, "Document" + STRING_PROMPT_SAVE_CHANGES, "SalvaÈ›i modificările la „%sâ€?" + STRING_SEARCH_FINISHED, "S-a terminat căutarea în document." + STRING_LOAD_RICHED_FAILED, "Nu s-a putut încărca biblioteca RichEdit." + STRING_SAVE_LOSEFORMATTING, "AÈ›i ales să salvaÈ›i în formatul de text simplu, care va pierde formatarea. Sigur doriÈ›i să continuaÈ›i?" + STRING_INVALID_NUMBER, "Formatul de număr nu este valid." + STRING_OLE_STORAGE_NOT_SUPPORTED, "Documentele de depozitare OLE nu sunt suportate." + STRING_WRITE_FAILED, "Nu s-a putut salva fiÈ™ierul." + STRING_WRITE_ACCESS_DENIED, "Nu aveÈ›i permisiunea să salvaÈ›i fiÈ™ierul." + STRING_OPEN_FAILED, "Nu s-a putut deschide fiÈ™ierul." + STRING_OPEN_ACCESS_DENIED, "Nu aveÈ›i permisiunea de a deschide fiÈ™ierul." + STRING_PRINTING_NOT_IMPLEMENTED, "Imprimarea nu este implementată." + STRING_MAX_TAB_STOPS, "Nu se pot adăuga mai mult de 32 de taburi." +END diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc index 06fb33274a3..4eb0819cee1 100644 --- a/reactos/base/applications/wordpad/Ru.rc +++ b/reactos/base/applications/wordpad/Ru.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Файл" BEGIN @@ -96,7 +96,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -109,7 +109,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -133,7 +133,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Дата и времÑ" FONT 10, "MS Sans Serif" @@ -144,7 +144,7 @@ BEGIN PUSHBUTTON "О&тмена",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Ðовый документ" FONT 10, "MS Sans Serif" @@ -155,7 +155,7 @@ BEGIN PUSHBUTTON "О&тмена",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Ðбзац" FONT 8, "MS Shell Dlg" @@ -173,7 +173,7 @@ BEGIN PUSHBUTTON "О&тмена", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "ТабулÑциÑ" FONT 8, "MS SHell DLg" @@ -187,7 +187,7 @@ BEGIN PUSHBUTTON "ОчиÑтить &вÑе", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -204,7 +204,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Файлы RTF (*.rtf)" STRING_TEXT_FILES_TXT, "ТекÑтовые документы (*.txt)" @@ -212,33 +212,33 @@ BEGIN STRING_ALL_FILES, "Ð’Ñе документы (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "По левому краю" STRING_ALIGN_RIGHT, "По правому краю" STRING_ALIGN_CENTER, "По центру" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Файл RTF" STRING_NEWFILE_TXT, "ТекÑтовый документ" STRING_NEWFILE_TXT_UNICODE, "Документ в формате Unicode" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Файлы принтера (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "ÐаÑтройки" STRING_VIEWPROPS_TEXT, "ТекÑÑ‚" STRING_VIEWPROPS_RICHTEXT, "Файл RTF" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Печать" STRING_PREVIEW_NEXTPAGE, "СледующаÑ" @@ -250,14 +250,13 @@ BEGIN STRING_PREVIEW_CLOSE, "Закрыть" STRING_PREVIEW_PAGE, "Страница" STRING_PREVIEW_PAGES, "Страницы" + STRING_UNITS_CM, "Ñм" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "inch" + STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE -BEGIN - STRING_UNITS_CM, "Ñм" -END - -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Документ" STRING_PROMPT_SAVE_CHANGES, "Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² '%s'?" diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index 556197bd05b..11caf33986c 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/base/applications/wordpad/Si.rc @@ -22,7 +22,7 @@ LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Datotka" BEGIN @@ -95,7 +95,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -108,7 +108,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -132,7 +132,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum in Äas" FONT 10, "MS Sans Serif" @@ -143,7 +143,7 @@ BEGIN PUSHBUTTON "&PrekliÄi",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Nov dokument" FONT 10, "MS Sans Serif" @@ -154,7 +154,7 @@ BEGIN PUSHBUTTON "&PrekliÄi",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Oblika odstavka" FONT 8, "MS Shell Dlg" @@ -172,7 +172,7 @@ BEGIN PUSHBUTTON "&PrekliÄi", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulatorji" FONT 8, "MS SHell DLg" @@ -186,7 +186,7 @@ BEGIN PUSHBUTTON "Odstrani v&se", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -203,7 +203,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Dokument z obogatenim besedilom (*.rtf)" STRING_TEXT_FILES_TXT, "Dokument z besedilom (*.txt)" @@ -211,33 +211,33 @@ BEGIN STRING_ALL_FILES, "Vsi dokumenti (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Levo" STRING_ALIGN_RIGHT, "Desno" STRING_ALIGN_CENTER, "Sredina" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Dokument z obogatenim besedilom" STRING_NEWFILE_TXT, "Dokument z besedilom" STRING_NEWFILE_TXT_UNICODE, "Dokument z Unicode besedilom" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Tiskalnikova datoteka (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Možnosti" STRING_VIEWPROPS_TEXT, "Besedilo" STRING_VIEWPROPS_RICHTEXT, "Obogateno besedilo" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Natisni" STRING_PREVIEW_NEXTPAGE, "Naslednja" @@ -255,7 +255,7 @@ BEGIN STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Ali naj shranim spremembe v '%s'?" diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc index edc35a9b24a..acf4f94eeb9 100644 --- a/reactos/base/applications/wordpad/Sv.rc +++ b/reactos/base/applications/wordpad/Sv.rc @@ -22,7 +22,7 @@ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL #pragma code_page(65001) -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Arkiv" BEGIN @@ -95,7 +95,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -108,7 +108,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN @@ -132,7 +132,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum och tid" FONT 10, "MS Sans Serif" @@ -143,7 +143,7 @@ BEGIN PUSHBUTTON "&Avbryt",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Ny" FONT 10, "MS Sans Serif" @@ -154,7 +154,7 @@ BEGIN PUSHBUTTON "&Avbryt",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Formatera stycke" FONT 8, "MS Shell Dlg" @@ -172,7 +172,7 @@ BEGIN PUSHBUTTON "&Avbryt", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulatorer" FONT 8, "MS Shell Dlg" @@ -186,7 +186,7 @@ BEGIN PUSHBUTTON "Ta bort a&lla", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" @@ -203,7 +203,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "Rich text-format (*.rtf)" STRING_TEXT_FILES_TXT, "Textdokument (*.txt)" @@ -211,33 +211,33 @@ BEGIN STRING_ALL_FILES, "Alla filer (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "Vänsterställt" STRING_ALIGN_RIGHT, "Högerställt" STRING_ALIGN_CENTER, "Centrerat" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "Rich text-dokument" STRING_NEWFILE_TXT, "Textdokument" STRING_NEWFILE_TXT_UNICODE, "Textdokument (Unicode)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "Skrivarfiler (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "Alternativ" STRING_VIEWPROPS_TEXT, "Text" STRING_VIEWPROPS_RICHTEXT, "Rich text" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Skriv ut" STRING_PREVIEW_NEXTPAGE, "Nästa sida" @@ -251,12 +251,15 @@ BEGIN STRING_PREVIEW_PAGES, "Sidor" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_UNITS_CM, "cm" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "tum" + STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Spara ändringar i '%s'?" diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 2273175700a..93875cb0dbe 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -22,7 +22,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "&Dosya" BEGIN @@ -95,7 +95,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -108,7 +108,7 @@ BEGIN END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN diff --git a/reactos/base/applications/wordpad/Uk.rc b/reactos/base/applications/wordpad/Uk.rc index 35e35977e59..8a86989cebb 100644 --- a/reactos/base/applications/wordpad/Uk.rc +++ b/reactos/base/applications/wordpad/Uk.rc @@ -27,71 +27,71 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN - POPUP "&File" + POPUP "&Файл" BEGIN - MENUITEM "&Ðовий...\tCtrl+N", ID_FILE_NEW + 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 "&Друк...\tCtrl+P", ID_PRINT + MENUITEM "Попередній перег&лÑд...", ID_PREVIEW + MENUITEM "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Ñторінки...", ID_PRINTSETUP MENUITEM SEPARATOR - MENUITEM "Ð’&ихід", ID_FILE_EXIT + MENUITEM "Ð’&ихід", ID_FILE_EXIT END POPUP "&Правка" BEGIN - MENUITEM "&Відмінити\tCtrl+Z", ID_EDIT_UNDO - MENUITEM "Повт&орити\tCtrl+Y", ID_EDIT_REDO + 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 "Виріза&ти\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 "&Знайти...\tCtrl+F", ID_FIND + MENUITEM "Знайти д&алі\tF3", ID_FIND_NEXT + MENUITEM "За&мінити...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "Лише д&Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ", ID_EDIT_READONLY + 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 + MENUITEM "&Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ виділеннÑ", ID_EDIT_SELECTIONINFO + MENUITEM "&Формат Ñимволів", ID_EDIT_CHARFORMAT + MENUITEM "Формат Ñимволів &по замовчуванні", ID_EDIT_DEFCHARFORMAT + MENUITEM "Ðбза&ц", ID_EDIT_PARAFORMAT + MENUITEM "&ВзÑти текÑÑ‚", ID_EDIT_GETTEXT END END POPUP "&ВиглÑд" BEGIN - MENUITEM "Панель інÑ&трументів", ID_TOGGLE_TOOLBAR + MENUITEM "Панель інÑ&трументів", ID_TOGGLE_TOOLBAR MENUITEM "Панель &форматуваннÑ", ID_TOGGLE_FORMATBAR - MENUITEM "&Лінійка", ID_TOGGLE_RULER - MENUITEM "&РÑдок Ñтану", ID_TOGGLE_STATUSBAR + MENUITEM "&Лінійка", ID_TOGGLE_RULER + MENUITEM "&РÑдок Ñтану", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR - MENUITEM "&Параметри...", ID_VIEWPROPERTIES + MENUITEM "&Параметри...", ID_VIEWPROPERTIES END POPUP "&Ð’Ñтавка" BEGIN - MENUITEM "&Дата та чаÑ...", ID_DATETIME + MENUITEM "&Дата та чаÑ...", ID_DATETIME END POPUP "Ф&ормат" BEGIN - MENUITEM "&Шрифт...", ID_FONTSETTINGS - MENUITEM "&Bullet points" ID_BULLET - MENUITEM "&Ðбзац..." ID_PARAFORMAT - MENUITEM "&ТабулÑціÑ..." ID_TABSTOPS + MENUITEM "&Шрифт...", ID_FONTSETTINGS + MENUITEM "&Маркери" ID_BULLET + MENUITEM "&Ðбзац..." ID_PARAFORMAT + MENUITEM "&ТабулÑціÑ..." ID_TABSTOPS POPUP "&Фон" BEGIN - MENUITEM "&СитÑемний\tCtrl+1", ID_BACK_1 - MENUITEM "&Жовтуватий PostThat\tCtrl+2", ID_BACK_2 + MENUITEM "&СиÑтемний\tCtrl+1", ID_BACK_1 + MENUITEM "&Жовтуватий PostThat\tCtrl+2", ID_BACK_2 END END POPUP "&Довідка" @@ -100,44 +100,44 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "Вир&ізати", ID_EDIT_CUT - MENUITEM "&Копіювати", ID_EDIT_COPY - MENUITEM "&Ð’Ñтавити", ID_EDIT_PASTE + MENUITEM "Вир&ізати", ID_EDIT_CUT + MENUITEM "&Копіювати", ID_EDIT_COPY + MENUITEM "&Ð’Ñтавити", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "&Bullet points" ID_BULLET - MENUITEM "&Ðбзац..." ID_PARAFORMAT + MENUITEM "&Маркери" ID_BULLET + MENUITEM "&Ðбзац..." ID_PARAFORMAT END END -IDM_COLOR_POPUP MENU DISCARDABLE +IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "×îðíèé" ID_COLOR_BLACK - MENUITEM "Ãðóíàòíèé" ID_COLOR_MAROON - MENUITEM "Çåëåíèé" ID_COLOR_GREEN - MENUITEM "Îëèâêîâèé" ID_COLOR_OLIVE - MENUITEM "Ñèí³é" ID_COLOR_NAVY - MENUITEM "Ãóðïóðíèé" ID_COLOR_PURPLE - MENUITEM "Çåëåíî-ñèí³é" ID_COLOR_TEAL - MENUITEM "ѳðèé" ID_COLOR_GRAY - MENUITEM "Ñð³áíèé" ID_COLOR_SILVER - MENUITEM "×åðâîíèé" ID_COLOR_RED - MENUITEM "Ñàëàòîâèé" ID_COLOR_LIME - MENUITEM "Æîâòèé" ID_COLOR_YELLOW - MENUITEM "Ãîëóáèé" ID_COLOR_BLUE - MENUITEM "Ô³îëåòîâèé" ID_COLOR_FUCHSIA - MENUITEM "Àêâàìàðèí" ID_COLOR_AQUA - MENUITEM "óëèé" ID_COLOR_WHITE - MENUITEM "Automatic" ID_COLOR_AUTOMATIC + MENUITEM "Чорний" ID_COLOR_BLACK + MENUITEM "Коричневий" ID_COLOR_MAROON + MENUITEM "Зелений" ID_COLOR_GREEN + MENUITEM "Оливковий" ID_COLOR_OLIVE + MENUITEM "Темно-Ñиній" ID_COLOR_NAVY + MENUITEM "Пурпуровий" ID_COLOR_PURPLE + MENUITEM "Синьо-зелений" ID_COLOR_TEAL + MENUITEM "Сірий" ID_COLOR_GRAY + MENUITEM "СріблÑÑтий" ID_COLOR_SILVER + MENUITEM "Червоний" ID_COLOR_RED + MENUITEM "Салатовий" ID_COLOR_LIME + MENUITEM "Жовтий" ID_COLOR_YELLOW + MENUITEM "Синій" ID_COLOR_BLUE + MENUITEM "Малиновий" ID_COLOR_FUCHSIA + MENUITEM "Блакитний" ID_COLOR_AQUA + MENUITEM "Білий" ID_COLOR_WHITE + MENUITEM "Ðвтоматично" ID_COLOR_AUTOMATIC END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Дата та чаÑ" FONT 10, "MS Sans Serif" @@ -148,7 +148,7 @@ BEGIN PUSHBUTTON "&СкаÑувати",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Ðовий" FONT 10, "MS Sans Serif" @@ -159,7 +159,7 @@ BEGIN PUSHBUTTON "&СкаÑувати",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Ðбзац" FONT 8, "MS Shell Dlg" @@ -169,20 +169,20 @@ BEGIN 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 + LTEXT "Перший Ñ€Ñдок", -1, 15, 58, 40, 18 EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 - LTEXT "ВирівнюваннÑ", -1, 15, 87, 40, 13 - COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + LTEXT "ВирівнюваннÑ", -1, 13, 87, 50, 13 + COMBOBOX IDC_PARA_ALIGN, 63, 85, 75, 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 +IDD_TABSTOPS DIALOG 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 + GROUPBOX "Позиції табулÑції", -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 @@ -191,24 +191,24 @@ BEGIN PUSHBUTTON "Видалити в&Ñе", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 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 + GROUPBOX "ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ñ€Ñдка", -1, 10, 10, 130, 85 + RADIOBUTTON "&Без переноÑу", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "По &межі вікна", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "По м&ежі полÑ", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Панелі", -1, 150, 10, 120, 85 + CHECKBOX "Панель інÑ&трументів", IDC_PAGEFMT_TB, 160, 20, 88, 15 + CHECKBOX "Панель &форматуваннÑ", IDC_PAGEFMT_FB, 160, 38, 88, 15 CHECKBOX "&Лінійка", IDC_PAGEFMT_RU, 160, 56, 80, 15 - CHECKBOX "&РÑдоу Ñтану", IDC_PAGEFMT_SB, 160, 74, 80, 15 + CHECKBOX "&РÑдок Ñтану", IDC_PAGEFMT_SB, 160, 74, 80, 15 LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALL_FILES, "Ð’ÑÑ– документи (*.*)" STRING_TEXT_FILES_TXT, "ТекÑтові документи (*.txt)" @@ -217,24 +217,24 @@ BEGIN STRING_NEWFILE_RICHTEXT, "Rich text документ" STRING_NEWFILE_TXT, "ТекÑтовий документ" STRING_NEWFILE_TXT_UNICODE, "ТекÑтовий документ Unicode" - STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" + STRING_PRINTER_FILES_PRN, "Файли принтера (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "По Лівому Краю" STRING_ALIGN_RIGHT, "По Правому Краю" STRING_ALIGN_CENTER, "По Центру" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "ÐалаштуваннÑ" STRING_VIEWPROPS_TEXT, "ТекÑÑ‚" STRING_VIEWPROPS_RICHTEXT, "Rich text" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "Друк" STRING_PREVIEW_NEXTPAGE, "ÐаÑтупна Ñторінка" @@ -244,12 +244,15 @@ BEGIN STRING_PREVIEW_ZOOMIN, "Збільшити" STRING_PREVIEW_ZOOMOUT, "Зменшити" STRING_PREVIEW_CLOSE, "Закрити" - STRING_PREVIEW_PAGE, "Page" - STRING_PREVIEW_PAGES, "Pages" - STRING_UNITS_CM, "cm" + STRING_PREVIEW_PAGE, "Сторінка" + STRING_PREVIEW_PAGES, "Сторінок" + STRING_UNITS_CM, "Ñм" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "дюйм" + STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Документ" STRING_PROMPT_SAVE_CHANGES, "Зберегти зміни в '%s'?" @@ -270,7 +273,7 @@ END LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "По Лівому Краю" STRING_ALIGN_RIGHT, "По правому Краю" diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc index bae40a7fb02..63bfc57c3b6 100644 --- a/reactos/base/applications/wordpad/Zh.rc +++ b/reactos/base/applications/wordpad/Zh.rc @@ -2,6 +2,7 @@ * wordpad (Simplified and Traditional Chinese Resource) * * Copyright 2008 Hongbo Ni + * Copyright 2010 Cheer Xiao * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,7 +26,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "文件(&F)" BEGIN @@ -83,9 +84,9 @@ BEGIN POPUP "æ ¼å¼(&O)" BEGIN MENUITEM "字体(&F)..", ID_FONTSETTINGS - MENUITEM "å­å¼¹ç‚¹(&B)", ID_BULLET + MENUITEM "项目符å·(&B)", ID_BULLET MENUITEM "段è½(&P)...", ID_PARAFORMAT - MENUITEM "标签(&T)...", ID_TABSTOPS + MENUITEM "制表ä½(&T)...", ID_TABSTOPS POPUP "背景(&D)" BEGIN MENUITEM "系统(&S)\tCtrl+1", ID_BACK_1 @@ -98,7 +99,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -106,23 +107,47 @@ BEGIN MENUITEM "å¤åˆ¶(&C)", ID_EDIT_COPY MENUITEM "粘贴(&P)", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "å­å¼¹ç‚¹(&B)" ID_BULLET + MENUITEM "项目符å·(&B)" ID_BULLET MENUITEM "段è½(&P)..." ID_PARAFORMAT END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDM_COLOR_POPUP MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "黑", ID_COLOR_BLACK + MENUITEM "Maroon", ID_COLOR_MAROON + MENUITEM "绿", ID_COLOR_GREEN + MENUITEM "Olive" ID_COLOR_OLIVE + MENUITEM "Navy" ID_COLOR_NAVY + MENUITEM "ç´«" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "ç°" ID_COLOR_GRAY + MENUITEM "Silver" ID_COLOR_SILVER + MENUITEM "红" ID_COLOR_RED + MENUITEM "Lime" ID_COLOR_LIME + MENUITEM "黄" ID_COLOR_YELLOW + MENUITEM "è“" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "白" ID_COLOR_WHITE + MENUITEM "自动" ID_COLOR_AUTOMATIC + END +END + +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "日期和时间" FONT 9, "MS Shell Dlg" BEGIN - LTEXT "å¯ç”¨æ ¼å¼",-1,3,2,100,15 + LTEXT "å¯é€‰æ ¼å¼",-1,3,2,100,15 LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY PUSHBUTTON "确定(&O)",IDOK,87,12,40,12 PUSHBUTTON "å–消(&C)",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "新建" FONT 9, "MS Shell Dlg" @@ -133,7 +158,7 @@ BEGIN PUSHBUTTON "å–消(&C)",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "段è½æ ¼å¼" FONT 9, "MS Shell Dlg" @@ -143,7 +168,7 @@ BEGIN 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 + 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 @@ -151,12 +176,12 @@ BEGIN PUSHBUTTON "å–消(&C)", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -Caption "标签" +Caption "制表ä½" FONT 9, "MS Shell Dlg" BEGIN - GROUPBOX "标签åœç‚¹", -1, 10, 10, 120, 90 + GROUPBOX "制表ä½å®½åº¦", -1, 10, 10, 120, 90 COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE DEFPUSHBUTTON "添加(&A)", ID_TAB_ADD, 20, 80, 45, 15 PUSHBUTTON "删除(&R)", ID_TAB_DEL, 72, 80, 45, 15 @@ -165,14 +190,14 @@ BEGIN PUSHBUTTON "全部删除(&R)", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 9, "MS Shell Dlg" BEGIN GROUPBOX "自动æ¢è¡Œ", -1, 10, 10, 130, 85 - RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 - RADIOBUTTON "按视窗宽度(&W)", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "ä¸è¦è‡ªåŠ¨æ¢è¡Œ", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "按窗å£å®½åº¦(&W)", IDC_PAGEFMT_WW, 18, 45, 117, 15 RADIOBUTTON "按纸张宽度(&M)", IDC_PAGEFMT_WM, 18, 65, 117, 15 GROUPBOX "工具æ ", -1, 150, 10, 120, 85 CHECKBOX "工具æ (&T)", IDC_PAGEFMT_TB, 160, 20, 80, 15 @@ -182,72 +207,80 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN - STRING_RICHTEXT_FILES_RTF, "RTFä¸°å¯Œæ ¼å¼ (*.rtf)" + STRING_RICHTEXT_FILES_RTF, "RTF 富文本 (*.rtf)" STRING_TEXT_FILES_TXT, "文本文件 (*.txt)" - STRING_TEXT_FILES_UNICODE_TXT, "统一ç æ–‡æœ¬æ–‡ä»¶ (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Unicode 文本文件 (*.txt)" STRING_ALL_FILES, "所有文件 (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "å·¦" STRING_ALIGN_RIGHT, "å³" STRING_ALIGN_CENTER, "中" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN - STRING_NEWFILE_RICHTEXT, "RTF丰富格å¼æ–‡ä»¶" + STRING_NEWFILE_RICHTEXT, "RTF 富文本" STRING_NEWFILE_TXT, "文本文件 " - STRING_NEWFILE_TXT_UNICODE, "统一ç æ–‡æœ¬æ–‡ä»¶" + STRING_NEWFILE_TXT_UNICODE, "Unicode 文本文件" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "打å°æ–‡ä»¶ (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "选项" STRING_VIEWPROPS_TEXT, "文本文字" - STRING_VIEWPROPS_RICHTEXT, "丰富格å¼æ–‡å­—" + STRING_VIEWPROPS_RICHTEXT, "富文本格å¼" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "打å°" STRING_PREVIEW_NEXTPAGE, "下一页" STRING_PREVIEW_PREVPAGE, "上一页" STRING_PREVIEW_TWOPAGES, "åŒé¡µ" STRING_PREVIEW_ONEPAGE, "å•é¡µ" - STRING_PREVIEW_ZOOMIN, "Zoom in" - STRING_PREVIEW_ZOOMOUT, "Zoom out" + STRING_PREVIEW_ZOOMIN, "放大" + STRING_PREVIEW_ZOOMOUT, "缩å°" STRING_PREVIEW_CLOSE, "关闭" + STRING_PREVIEW_PAGE, "页" + STRING_PREVIEW_PAGES, "页" + STRING_UNITS_CM, "cm" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "英寸" + STRING_UNITS_PT, "pt" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN - STRING_DEFAULT_FILENAME, "Document" - STRING_PROMPT_SAVE_CHANGES, "ä¿å­˜æ”¹åŠ¨åˆ° '%s'?" + 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 储存文件" + STRING_OLE_STORAGE_NOT_SUPPORTED, "ä¸æ”¯æŒ OLE 储存文件" STRING_WRITE_FAILED, "ä¸èƒ½ä¿å­˜æ–‡ä»¶." - STRING_WRITE_ACCESS_DENIED, "你没有ä¿å­˜æ–‡ä»¶çš„æƒåŠ›." + STRING_WRITE_ACCESS_DENIED, "你没有ä¿å­˜æ–‡ä»¶çš„æƒé™." STRING_OPEN_FAILED, "ä¸èƒ½æ‰“开文件." - STRING_OPEN_ACCESS_DENIED, "你没有打开文件的æƒåŠ›." + STRING_OPEN_ACCESS_DENIED, "你没有打开文件的æƒé™." + STRING_PRINTING_NOT_IMPLEMENTED, "打å°åŠŸèƒ½å°šæœªå®žçŽ°" + STRING_MAX_TAB_STOPS, "最多åªèƒ½æ·»åŠ  32 个制表ä½å®½åº¦." END LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -IDM_MAINMENU MENU DISCARDABLE +IDM_MAINMENU MENU BEGIN POPUP "檔案(&F)" BEGIN @@ -320,7 +353,7 @@ BEGIN END END -IDM_POPUP MENU DISCARDABLE +IDM_POPUP MENU BEGIN POPUP "" BEGIN @@ -333,7 +366,7 @@ BEGIN END END -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +IDD_DATETIME DIALOG 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "日期和時間" FONT 9, "MS Shell Dlg" @@ -344,7 +377,7 @@ BEGIN PUSHBUTTON "å–消(&C)",IDCANCEL,87,26,40,12 END -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +IDD_NEWFILE DIALOG 30, 20, 140, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "新建" FONT 9, "MS Shell Dlg" @@ -355,7 +388,7 @@ BEGIN PUSHBUTTON "å–消(&C)",IDCANCEL,97,26,40,12 END -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "段è½æ ¼å¼" FONT 9, "MS Shell Dlg" @@ -373,7 +406,7 @@ BEGIN PUSHBUTTON "å–消(&C)", IDCANCEL, 137, 33, 50, 15 END -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "標籤" FONT 9, "MS Shell Dlg" @@ -387,12 +420,13 @@ BEGIN PUSHBUTTON "全部刪除(&R)", ID_TAB_EMPTY, 137, 51, 50, 15 END -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 STYLE DS_SYSMODAL Caption "" FONT 9, "MS Shell Dlg" BEGIN GROUPBOX "自動æ›è¡Œ", -1, 10, 10, 130, 85 + RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 RADIOBUTTON "按視窗寬度(&W)", IDC_PAGEFMT_WW, 18, 25, 117, 15 RADIOBUTTON "按紙張寬度(&M)", IDC_PAGEFMT_WM, 18, 45, 117, 15 GROUPBOX "工具欄", -1, 150, 10, 120, 85 @@ -403,7 +437,7 @@ BEGIN LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_RICHTEXT_FILES_RTF, "RTFè±å¯Œæ ¼å¼ (*.rtf)" STRING_TEXT_FILES_TXT, "文本檔案 (*.txt)" @@ -411,43 +445,45 @@ BEGIN STRING_ALL_FILES, "所有檔案 (*.*)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_ALIGN_LEFT, "å·¦" STRING_ALIGN_RIGHT, "å³" STRING_ALIGN_CENTER, "中" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_NEWFILE_RICHTEXT, "RTFè±å¯Œæ ¼å¼æª”案" STRING_NEWFILE_TXT, "文本檔案 " STRING_NEWFILE_TXT_UNICODE, "統一碼文本檔案" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PRINTER_FILES_PRN, "列å°æª”案 (*.PRN)" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_VIEWPROPS_TITLE, "é¸é …" STRING_VIEWPROPS_TEXT, "文本文字" STRING_VIEWPROPS_RICHTEXT, "è±å¯Œæ ¼å¼æ–‡å­—" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_PREVIEW_PRINT, "列å°" STRING_PREVIEW_NEXTPAGE, "下一é " STRING_PREVIEW_PREVPAGE, "上一é " STRING_PREVIEW_TWOPAGES, "é›™é " STRING_PREVIEW_ONEPAGE, "å–®é " + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "關閉" END -STRINGTABLE DISCARDABLE +STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "儲存改動到 '%s'?" @@ -462,4 +498,5 @@ BEGIN STRING_WRITE_ACCESS_DENIED, "你沒有儲存檔案的權力." STRING_OPEN_FAILED, "ä¸èƒ½é–‹å•Ÿæª”案." STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力." + STRING_PRINTING_NOT_IMPLEMENTED, "Printing not implemented" END diff --git a/reactos/base/applications/wordpad/olecallback.c b/reactos/base/applications/wordpad/olecallback.c new file mode 100644 index 00000000000..8b279ada89d --- /dev/null +++ b/reactos/base/applications/wordpad/olecallback.c @@ -0,0 +1,210 @@ +/* + * Wordpad implementation - Richedit OLE callback implementation + * + * Copyright 2010 by Dylan Smith + * + * 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 + */ + +#define COBJMACROS + +#include +#include +#include +#include + +#include "wine/debug.h" +#include "wordpad.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wordpad); + +struct IRichEditOleCallbackImpl { + const IRichEditOleCallbackVtbl *vtbl; + IStorage *stg; + int item_num; +}; + +struct IRichEditOleCallbackImpl olecallback; + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_QueryInterface( + IRichEditOleCallback* This, + REFIID riid, + void **ppvObject) +{ + WINE_TRACE("(%p, %s, %p)\n", This, wine_dbgstr_guid(riid), ppvObject); + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IRichEditOleCallback)) + { + *ppvObject = This; + return S_OK; + } + WINE_FIXME("Unknown interface: %s\n", wine_dbgstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE RichEditOleCallback_AddRef( + IRichEditOleCallback* This) +{ + WINE_TRACE("(%p)\n", This); + /* singleton */ + return 1; +} + +static ULONG STDMETHODCALLTYPE RichEditOleCallback_Release( + IRichEditOleCallback* This) +{ + WINE_TRACE("(%p)\n", This); + return 1; +} + +/*** IRichEditOleCallback methods ***/ +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetNewStorage( + IRichEditOleCallback* This, + LPSTORAGE *lplpstg) +{ + WCHAR name[32]; + static const WCHAR template[] = {'R','E','O','L','E','_','%','u','\0'}; + + WINE_TRACE("(%p, %p)\n", This, lplpstg); + wsprintfW(name, template, olecallback.item_num++); + return IStorage_CreateStorage(olecallback.stg, name, + STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, + 0, 0, lplpstg); +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetInPlaceContext( + IRichEditOleCallback* This, + LPOLEINPLACEFRAME *lplpFrame, + LPOLEINPLACEUIWINDOW *lplpDoc, + LPOLEINPLACEFRAMEINFO lpFrameInfo) +{ + WINE_FIXME("(%p, %p, %p, %p) stub\n", This, lplpFrame, lplpDoc, lpFrameInfo); + return E_INVALIDARG; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_ShowContainerUI( + IRichEditOleCallback* This, + BOOL fShow) +{ + WINE_TRACE("(%p, %d)\n", This, fShow); + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_QueryInsertObject( + IRichEditOleCallback* This, + LPCLSID lpclsid, + LPSTORAGE lpstg, + LONG cp) +{ + WINE_TRACE("(%p, %p, %p, %d)\n", This, lpclsid, lpstg, cp); + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_DeleteObject( + IRichEditOleCallback* This, + LPOLEOBJECT lpoleobj) +{ + WINE_TRACE("(%p, %p)\n", This, lpoleobj); + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_QueryAcceptData( + IRichEditOleCallback* This, + LPDATAOBJECT lpdataobj, + CLIPFORMAT *lpcfFormat, + DWORD reco, + BOOL fReally, + HGLOBAL hMetaPict) +{ + WINE_TRACE("(%p, %p, %p, %x, %d, %p)\n", + This, lpdataobj, lpcfFormat, reco, fReally, hMetaPict); + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_ContextSensitiveHelp( + IRichEditOleCallback* This, + BOOL fEnterMode) +{ + WINE_TRACE("(%p, %d)\n", This, fEnterMode); + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetClipboardData( + IRichEditOleCallback* This, + CHARRANGE *lpchrg, + DWORD reco, + LPDATAOBJECT *lplpdataobj) +{ + WINE_TRACE("(%p, %p, %x, %p)\n", This, lpchrg, reco, lplpdataobj); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetDragDropEffect( + IRichEditOleCallback* This, + BOOL fDrag, + DWORD grfKeyState, + LPDWORD pdwEffect) +{ + WINE_TRACE("(%p, %d, %x, %p)\n", This, fDrag, grfKeyState, pdwEffect); + if (pdwEffect) + *pdwEffect = DROPEFFECT_COPY; + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetContextMenu( + IRichEditOleCallback* This, + WORD seltype, + LPOLEOBJECT lpoleobj, + CHARRANGE *lpchrg, + HMENU *lphmenu) +{ + HINSTANCE hInstance = GetModuleHandleW(0); + HMENU hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_POPUP)); + + WINE_TRACE("(%p, %x, %p, %p, %p)\n", + This, seltype, lpoleobj, lpchrg, lphmenu); + + *lphmenu = GetSubMenu(hPopupMenu, 0); + return S_OK; +} + +struct IRichEditOleCallbackVtbl olecallbackVtbl = { + RichEditOleCallback_QueryInterface, + RichEditOleCallback_AddRef, + RichEditOleCallback_Release, + RichEditOleCallback_GetNewStorage, + RichEditOleCallback_GetInPlaceContext, + RichEditOleCallback_ShowContainerUI, + RichEditOleCallback_QueryInsertObject, + RichEditOleCallback_DeleteObject, + RichEditOleCallback_QueryAcceptData, + RichEditOleCallback_ContextSensitiveHelp, + RichEditOleCallback_GetClipboardData, + RichEditOleCallback_GetDragDropEffect, + RichEditOleCallback_GetContextMenu +}; + +struct IRichEditOleCallbackImpl olecallback = { + &olecallbackVtbl, NULL, 0 +}; + +HRESULT setup_richedit_olecallback(HWND hEditorWnd) +{ + HRESULT hr = StgCreateDocfile(NULL, + STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, + 0, &olecallback.stg); + + SendMessageW(hEditorWnd, EM_SETOLECALLBACK, 0, (LPARAM)&olecallback); + return hr; +} diff --git a/reactos/base/applications/wordpad/print.c b/reactos/base/applications/wordpad/print.c index 231c90e891c..7761c32379a 100644 --- a/reactos/base/applications/wordpad/print.c +++ b/reactos/base/applications/wordpad/print.c @@ -33,8 +33,6 @@ typedef struct _previewinfo int textlength; HDC hdc; HDC hdc2; - HDC hdcSized; - HDC hdcSized2; RECT window; RECT rcPage; SIZE bmSize; @@ -705,43 +703,44 @@ static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated) update_preview_scrollbars(hwndPreview, &window); } -static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight, BOOL draw_margins) +static void draw_margin_lines(HDC hdc, int x, int y, float ratio) { - HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight); - HBITMAP oldbm; HPEN hPen, oldPen; - int TopMargin = (int)((float)twips_to_pixels(lpFr->rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); - int BottomMargin = (int)((float)twips_to_pixels(lpFr->rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); - int LeftMargin = (int)((float)twips_to_pixels(lpFr->rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); - int RightMargin = (int)((float)twips_to_pixels(lpFr->rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); + SIZE dpi; + RECT page_margin = preview.rcPage; - if(*hdcSized) { - oldbm = SelectObject(*hdcSized, hBitmapScaled); - DeleteObject(oldbm); - } else { - *hdcSized = CreateCompatibleDC(hdc); - SelectObject(*hdcSized, hBitmapScaled); - } + dpi.cx = GetDeviceCaps(hdc, LOGPIXELSX); + dpi.cy = GetDeviceCaps(hdc, LOGPIXELSY); - StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY); + page_margin.left = preview.rcPage.left + margins.left; + page_margin.top = preview.rcPage.top + margins.top; + page_margin.bottom = preview.rcPage.bottom - margins.bottom; + page_margin.right = preview.rcPage.right - margins.right; - if (!draw_margins) return; + page_margin.left = (int)((float)twips_to_pixels(page_margin.left, dpi.cx) * ratio); + page_margin.top = (int)((float)twips_to_pixels(page_margin.top, dpi.cy) * ratio); + page_margin.bottom = (int)((float)twips_to_pixels(page_margin.bottom, dpi.cy) * ratio); + page_margin.right = (int)((float)twips_to_pixels(page_margin.right, dpi.cx) * ratio); + + page_margin.left += x; + page_margin.top += y; + page_margin.bottom += y; + page_margin.right += x; - /* Draw margin lines */ hPen = CreatePen(PS_DOT, 1, RGB(0,0,0)); - oldPen = SelectObject(*hdcSized, hPen); + oldPen = SelectObject(hdc, hPen); - MoveToEx(*hdcSized, 0, TopMargin, NULL); - LineTo(*hdcSized, bmNewWidth, TopMargin); - MoveToEx(*hdcSized, 0, BottomMargin, NULL); - LineTo(*hdcSized, bmNewWidth, BottomMargin); + MoveToEx(hdc, x, page_margin.top, NULL); + LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.top); + MoveToEx(hdc, x, page_margin.bottom, NULL); + LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.bottom); - MoveToEx(*hdcSized, LeftMargin, 0, NULL); - LineTo(*hdcSized, LeftMargin, bmNewHeight); - MoveToEx(*hdcSized, RightMargin, 0, NULL); - LineTo(*hdcSized, RightMargin, bmNewHeight); + MoveToEx(hdc, page_margin.left, y, NULL); + LineTo(hdc, page_margin.left, y + preview.bmScaledSize.cy); + MoveToEx(hdc, page_margin.right, y, NULL); + LineTo(hdc, page_margin.right, y + preview.bmScaledSize.cy); - SelectObject(*hdcSized, oldPen); + SelectObject(hdc, oldPen); DeleteObject(hPen); } @@ -750,41 +749,6 @@ static BOOL is_last_preview_page(int page) return preview.pageEnds[page - 1] >= preview.textlength; } -/* Update for zoom ratio changes with same page. */ -static void update_scaled_preview(HWND hMainWnd) -{ - FORMATRANGE fr; - HWND hwndPreview; - - /* This may occur on WM_CREATE before update_preview is called - * because a WM_SIZE message is generated from updating the - * scrollbars. */ - if (!preview.hdc) return; - - hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); - fr.hdcTarget = make_dc(); - 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; - - draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio, - preview.bmScaledSize.cx, preview.bmScaledSize.cy, - preview.bmSize.cx, preview.bmSize.cy, TRUE); - - if(preview.pages_shown > 1) - { - draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio, - preview.bmScaledSize.cx, preview.bmScaledSize.cy, - preview.bmSize.cx, preview.bmSize.cy, - !is_last_preview_page(preview.page)); - } - - InvalidateRect(hwndPreview, NULL, TRUE); - DeleteDC(fr.hdcTarget); -} - void init_preview(HWND hMainWnd, LPWSTR wszFileName) { HINSTANCE hInstance = GetModuleHandleW(0); @@ -824,18 +788,6 @@ void close_preview(HWND hMainWnd) DeleteObject(oldbm); preview.hdc2 = NULL; } - if(preview.hdcSized) { - HBITMAP oldbm = GetCurrentObject(preview.hdcSized, OBJ_BITMAP); - DeleteDC(preview.hdcSized); - DeleteObject(oldbm); - preview.hdcSized = NULL; - } - if(preview.hdcSized2) { - HBITMAP oldbm = GetCurrentObject(preview.hdcSized2, OBJ_BITMAP); - DeleteDC(preview.hdcSized2); - DeleteObject(oldbm); - preview.hdcSized2 = NULL; - } preview_bar_show(hMainWnd, FALSE); DestroyWindow(hwndPreview); @@ -893,43 +845,69 @@ static void update_preview_buttons(HWND hMainWnd) static LRESULT print_preview(HWND hwndPreview) { + HPEN hPen, oldPen; HDC hdc; + HRGN back_rgn, excl_rgn; RECT window, background; PAINTSTRUCT ps; - POINT scrollpos; + int x, y; hdc = BeginPaint(hwndPreview, &ps); GetClientRect(hwndPreview, &window); + back_rgn = CreateRectRgnIndirect(&window); - FillRect(hdc, &window, GetStockObject(GRAY_BRUSH)); - - 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)); + x = preview.spacing.cx - GetScrollPos(hwndPreview, SB_HORZ); + y = preview.spacing.cy - GetScrollPos(hwndPreview, SB_VERT); + /* draw page outlines */ + hPen = CreatePen(PS_SOLID|PS_INSIDEFRAME, 2, RGB(0,0,0)); + oldPen = SelectObject(hdc, hPen); + background.left = x - 2; + background.right = x + preview.bmScaledSize.cx + 2; + background.top = y - 2; + background.bottom = y + preview.bmScaledSize.cy + 2; + Rectangle(hdc, background.left, background.top, + background.right, background.bottom); + excl_rgn = CreateRectRgnIndirect(&background); + CombineRgn(back_rgn, back_rgn, excl_rgn, RGN_DIFF); if(preview.pages_shown > 1) { background.left += preview.bmScaledSize.cx + preview.spacing.cx; background.right += preview.bmScaledSize.cx + preview.spacing.cx; - - FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); + Rectangle(hdc, background.left, background.top, + background.right, background.bottom); + SetRectRgn(excl_rgn, background.left, background.top, + background.right, background.bottom); + CombineRgn(back_rgn, back_rgn, excl_rgn, RGN_DIFF); } + SelectObject(hdc, oldPen); + DeleteObject(hPen); + FillRgn(hdc, back_rgn, GetStockObject(GRAY_BRUSH)); + DeleteObject(excl_rgn); + DeleteObject(back_rgn); - BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y, - preview.bmScaledSize.cx, preview.bmScaledSize.cy, - preview.hdcSized, 0, 0, SRCCOPY); + StretchBlt(hdc, x, y, preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.hdc, 0, 0, preview.bmSize.cx, preview.bmSize.cy, SRCCOPY); + + draw_margin_lines(hdc, x, y, preview.zoomratio); if(preview.pages_shown > 1) { - 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); + if (!is_last_preview_page(preview.page)) { + x += preview.spacing.cx + preview.bmScaledSize.cx; + StretchBlt(hdc, x, y, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.hdc2, 0, 0, + preview.bmSize.cx, preview.bmSize.cy, SRCCOPY); + + draw_margin_lines(hdc, x, y, preview.zoomratio); + } else { + background.left += 2; + background.right -= 2; + background.top += 2; + background.bottom -= 2; + FillRect(hdc, &background, GetStockObject(WHITE_BRUSH)); + } } preview.window = window; @@ -1011,7 +989,7 @@ static void update_preview(HWND hMainWnd) DeleteDC(fr.hdcTarget); ReleaseDC(hwndPreview, hdc); - update_scaled_preview(hMainWnd); + InvalidateRect(hwndPreview, NULL, FALSE); update_preview_buttons(hMainWnd); update_preview_statusbar(hMainWnd); } @@ -1103,7 +1081,7 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_SIZE: { update_preview_sizes(hWnd, FALSE); - update_scaled_preview(hWnd); + InvalidateRect(hWnd, NULL, FALSE); break; } @@ -1216,7 +1194,7 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) toggle_num_pages(hMainWnd); } else { update_preview_sizes(hWnd, TRUE); - update_scaled_preview(hMainWnd); + InvalidateRect(hWnd, NULL, FALSE); update_preview_buttons(hMainWnd); } @@ -1285,7 +1263,7 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam) } else { HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW); update_preview_sizes(hwndPreview, TRUE); - update_scaled_preview(hWnd); + InvalidateRect(hwndPreview, NULL, FALSE); update_preview_buttons(hWnd); } } @@ -1301,7 +1279,7 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam) toggle_num_pages(hWnd); } else { update_preview_sizes(hwndPreview, TRUE); - update_scaled_preview(hWnd); + InvalidateRect(hwndPreview, NULL, FALSE); update_preview_buttons(hWnd); } } diff --git a/reactos/base/applications/wordpad/registry.c b/reactos/base/applications/wordpad/registry.c index 7311fb68232..472ed4da9be 100644 --- a/reactos/base/applications/wordpad/registry.c +++ b/reactos/base/applications/wordpad/registry.c @@ -34,6 +34,7 @@ static const WCHAR key_text[] = {'T','e','x','t',0}; static const WCHAR var_file[] = {'F','i','l','e','%','d',0}; static const WCHAR var_framerect[] = {'F','r','a','m','e','R','e','c','t',0}; static const WCHAR var_barstate0[] = {'B','a','r','S','t','a','t','e','0',0}; +static const WCHAR var_wrap[] = {'W','r','a','p',0}; static const WCHAR var_maximized[] = {'M','a','x','i','m','i','z','e','d',0}; static LRESULT registry_get_handle(HKEY *hKey, LPDWORD action, LPCWSTR subKey) @@ -377,10 +378,22 @@ static void registry_read_formatopts(int index, LPCWSTR key, DWORD barState[], D if(!fetched) barState[index] = (1 << BANDID_TOOLBAR) | (1 << BANDID_FORMATBAR) | (1 << BANDID_RULER) | (1 << BANDID_STATUSBAR); - if(index == reg_formatindex(SF_RTF)) - wordWrap[index] = ID_WORDWRAP_WINDOW; - else if(index == reg_formatindex(SF_TEXT)) - wordWrap[index] = ID_WORDWRAP_NONE; + fetched = FALSE; + if(action == REG_OPENED_EXISTING_KEY) + { + DWORD size = sizeof(DWORD); + if(RegQueryValueExW(hKey, var_wrap, 0, NULL, (LPBYTE)&wordWrap[index], + &size) == ERROR_SUCCESS) + fetched = TRUE; + } + + if (!fetched) + { + if(index == reg_formatindex(SF_RTF)) + wordWrap[index] = ID_WORDWRAP_WINDOW; + else if(index == reg_formatindex(SF_TEXT)) + wordWrap[index] = ID_WORDWRAP_NONE; + } RegCloseKey(hKey); } @@ -391,7 +404,7 @@ void registry_read_formatopts_all(DWORD barState[], DWORD wordWrap[]) registry_read_formatopts(reg_formatindex(SF_TEXT), key_text, barState, wordWrap); } -static void registry_set_formatopts(int index, LPCWSTR key, DWORD barState[]) +static void registry_set_formatopts(int index, LPCWSTR key, DWORD barState[], DWORD wordWrap[]) { HKEY hKey; DWORD action = 0; @@ -400,13 +413,14 @@ static void registry_set_formatopts(int index, LPCWSTR key, DWORD barState[]) { RegSetValueExW(hKey, var_barstate0, 0, REG_DWORD, (LPBYTE)&barState[index], sizeof(DWORD)); - + RegSetValueExW(hKey, var_wrap, 0, REG_DWORD, (LPBYTE)&wordWrap[index], + sizeof(DWORD)); RegCloseKey(hKey); } } -void registry_set_formatopts_all(DWORD barState[]) +void registry_set_formatopts_all(DWORD barState[], DWORD wordWrap[]) { - registry_set_formatopts(reg_formatindex(SF_RTF), key_rtf, barState); - registry_set_formatopts(reg_formatindex(SF_TEXT), key_text, barState); + registry_set_formatopts(reg_formatindex(SF_RTF), key_rtf, barState, wordWrap); + registry_set_formatopts(reg_formatindex(SF_TEXT), key_text, barState, wordWrap); } diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index e0609440672..658505a59ed 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -72,6 +72,7 @@ IDC_ZOOM CURSOR "zoom.cur" #include "Nl.rc" #include "No.rc" #include "Pt.rc" +#include "Ro.rc" #include "Ru.rc" #include "Si.rc" #include "Sv.rc" diff --git a/reactos/base/applications/wordpad/wordpad.c b/reactos/base/applications/wordpad/wordpad.c index 0e6566df74c..187aef09842 100644 --- a/reactos/base/applications/wordpad/wordpad.c +++ b/reactos/base/applications/wordpad/wordpad.c @@ -62,7 +62,6 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) static HWND hMainWnd; static HWND hEditorWnd; static HWND hFindWnd; -static HMENU hPopupMenu; static HMENU hColorPopupMenu; static UINT ID_FINDMSGSTRING; @@ -89,6 +88,13 @@ typedef enum UNIT_PT } UNIT; +typedef struct +{ + int endPos; + BOOL wrapped; + WCHAR findBuffer[128]; +} FINDREPLACE_custom; + /* Load string resources */ static void DoLoadStrings(void) { @@ -1215,13 +1221,11 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) if(pFr->Flags & FR_FINDNEXT || pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL) { - DWORD flags = FR_DOWN; - FINDTEXTW ft; - static CHARRANGE cr; - LRESULT end, ret; - GETTEXTLENGTHEX gt; - LRESULT length; - int startPos; + FINDREPLACE_custom *custom_data = (FINDREPLACE_custom*)pFr->lCustData; + DWORD flags; + FINDTEXTEXW ft; + CHARRANGE sel; + LRESULT ret = -1; HMENU hMenu = GetMenu(hMainWnd); MENUITEMINFOW mi; @@ -1230,69 +1234,69 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) mi.dwItemData = 1; SetMenuItemInfoW(hMenu, ID_FIND_NEXT, FALSE, &mi); - gt.flags = GTL_NUMCHARS; - gt.codepage = 1200; - - length = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); - - if(pFr->lCustData == -1) + /* Make sure find field is saved. */ + if (pFr->lpstrFindWhat != custom_data->findBuffer) { - SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&startPos, (LPARAM)&end); - cr.cpMin = startPos; - pFr->lCustData = startPos; - cr.cpMax = length; - if(cr.cpMin == length) - cr.cpMin = 0; - } else - { - startPos = pFr->lCustData; + lstrcpynW(custom_data->findBuffer, pFr->lpstrFindWhat, + sizeof(custom_data->findBuffer)); + pFr->lpstrFindWhat = custom_data->findBuffer; } - if(cr.cpMax > length) - { - startPos = 0; - cr.cpMin = 0; - cr.cpMax = length; + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&sel.cpMin, (LPARAM)&sel.cpMax); + if(custom_data->endPos == -1) { + custom_data->endPos = sel.cpMin; + custom_data->wrapped = FALSE; } - ft.chrg = cr; + flags = FR_DOWN | (pFr->Flags & (FR_MATCHCASE | FR_WHOLEWORD)); ft.lpstrText = pFr->lpstrFindWhat; - if(pFr->Flags & FR_MATCHCASE) - flags |= FR_MATCHCASE; - if(pFr->Flags & FR_WHOLEWORD) - flags |= FR_WHOLEWORD; - - ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft); - - if(ret == -1) + /* Only replace existing selectino if it is an exact match. */ + if (sel.cpMin != sel.cpMax && + (pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL)) { - if(cr.cpMax == length && cr.cpMax != startPos) - { - ft.chrg.cpMin = cr.cpMin = 0; - ft.chrg.cpMax = cr.cpMax = startPos; - - ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft); + ft.chrg = sel; + SendMessageW(hEditorWnd, EM_FINDTEXTEXW, flags, (LPARAM)&ft); + if (ft.chrgText.cpMin == sel.cpMin && ft.chrgText.cpMax == sel.cpMax) { + SendMessageW(hEditorWnd, EM_REPLACESEL, TRUE, (LPARAM)pFr->lpstrReplaceWith); + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&sel.cpMin, (LPARAM)&sel.cpMax); } } - if(ret == -1) - { - pFr->lCustData = -1; - MessageBoxWithResStringW(hMainWnd, MAKEINTRESOURCEW(STRING_SEARCH_FINISHED), wszAppTitle, - MB_OK | MB_ICONASTERISK); - } else - { - end = ret + lstrlenW(pFr->lpstrFindWhat); - cr.cpMin = end; - SendMessageW(hEditorWnd, EM_SETSEL, ret, end); + /* Search from the start of the selection, but exclude the first character + * from search if there is a selection. */ + ft.chrg.cpMin = sel.cpMin; + if (sel.cpMin != sel.cpMax) + ft.chrg.cpMin++; + + /* Search to the end, then wrap around and search from the start. */ + if (!custom_data->wrapped) { + ft.chrg.cpMax = -1; + ret = SendMessageW(hEditorWnd, EM_FINDTEXTEXW, flags, (LPARAM)&ft); + if (ret == -1) { + custom_data->wrapped = TRUE; + ft.chrg.cpMin = 0; + } + } + + if (ret == -1) { + ft.chrg.cpMax = custom_data->endPos + lstrlenW(pFr->lpstrFindWhat) - 1; + if (ft.chrg.cpMax > ft.chrg.cpMin) + ret = SendMessageW(hEditorWnd, EM_FINDTEXTEXW, flags, (LPARAM)&ft); + } + + if (ret == -1) { + custom_data->endPos = -1; + EnableWindow(hMainWnd, FALSE); + MessageBoxWithResStringW(hFindWnd, MAKEINTRESOURCEW(STRING_SEARCH_FINISHED), + wszAppTitle, MB_OK | MB_ICONASTERISK | MB_TASKMODAL); + EnableWindow(hMainWnd, TRUE); + } else { + SendMessageW(hEditorWnd, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax); SendMessageW(hEditorWnd, EM_SCROLLCARET, 0, 0); - if(pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL) - SendMessageW(hEditorWnd, EM_REPLACESEL, TRUE, (LPARAM)pFr->lpstrReplaceWith); - - if(pFr->Flags & FR_REPLACEALL) - handle_findmsg(pFr); + if (pFr->Flags & FR_REPLACEALL) + return handle_findmsg(pFr); } } @@ -1301,8 +1305,11 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) static void dialog_find(LPFINDREPLACEW fr, BOOL replace) { - static WCHAR findBuffer[MAX_STRING_LEN]; - static WCHAR replaceBuffer[MAX_STRING_LEN]; + static WCHAR selBuffer[128]; + static WCHAR replaceBuffer[128]; + static FINDREPLACE_custom custom_data; + static const WCHAR endl = '\r'; + FINDTEXTW ft; /* Allow only one search/replace dialog to open */ if(hFindWnd != NULL) @@ -1315,10 +1322,28 @@ static void dialog_find(LPFINDREPLACEW fr, BOOL replace) fr->lStructSize = sizeof(FINDREPLACEW); fr->hwndOwner = hMainWnd; fr->Flags = FR_HIDEUPDOWN; - fr->lpstrFindWhat = findBuffer; + /* Find field is filled with the selected text if it is non-empty + * and stays within the same paragraph, otherwise the previous + * find field is used. */ + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&ft.chrg.cpMin, + (LPARAM)&ft.chrg.cpMax); + ft.lpstrText = &endl; + if (ft.chrg.cpMin != ft.chrg.cpMax && + SendMessageW(hEditorWnd, EM_FINDTEXTW, FR_DOWN, (LPARAM)&ft) == -1) + { + /* Use a temporary buffer for the selected text so that the saved + * find field is only overwritten when a find/replace is clicked. */ + GETTEXTEX gt = {sizeof(selBuffer), GT_SELECTION, 1200, NULL, NULL}; + SendMessageW(hEditorWnd, EM_GETTEXTEX, (WPARAM)>, (LPARAM)selBuffer); + fr->lpstrFindWhat = selBuffer; + } else { + fr->lpstrFindWhat = custom_data.findBuffer; + } fr->lpstrReplaceWith = replaceBuffer; - fr->lCustData = -1; - fr->wFindWhatLen = sizeof(findBuffer); + custom_data.endPos = -1; + custom_data.wrapped = FALSE; + fr->lCustData = (LPARAM)&custom_data; + fr->wFindWhatLen = sizeof(custom_data.findBuffer); fr->wReplaceWithLen = sizeof(replaceBuffer); if(replace) @@ -1769,29 +1794,6 @@ static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LP return FALSE; } -static int context_menu(LPARAM lParam) -{ - int x = (int)(short)LOWORD(lParam); - int y = (int)(short)HIWORD(lParam); - HMENU hPop = GetSubMenu(hPopupMenu, 0); - - if(x == -1) - { - int from = 0, to = 0; - POINTL pt; - SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); - SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, to); - ClientToScreen(hEditorWnd, (POINT*)&pt); - x = pt.x; - y = pt.y; - } - - TrackPopupMenu(hPop, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, - x, y, 0, hMainWnd, 0); - - return 0; -} - static LRESULT OnCreate( HWND hWnd ) { HWND hToolBarWnd, hFormatBarWnd, hReBarWnd, hFontListWnd, hSizeListWnd, hRulerWnd; @@ -1929,6 +1931,7 @@ static LRESULT OnCreate( HWND hWnd ) } assert(hEditorWnd); + setup_richedit_olecallback(hEditorWnd); SetFocus(hEditorWnd); SendMessageW(hEditorWnd, EM_SETEVENTMASK, 0, ENM_SELCHANGE); @@ -2613,7 +2616,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara } else if(prompt_save_changes()) { registry_set_options(hMainWnd); - registry_set_formatopts_all(barState); + registry_set_formatopts_all(barState, wordWrap); PostQuitMessage(0); } break; @@ -2630,10 +2633,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara return OnSize( hWnd, wParam, lParam ); case WM_CONTEXTMENU: - if((HWND)wParam == hEditorWnd) - return context_menu(lParam); - else - return DefWindowProcW(hWnd, msg, wParam, lParam); + return DefWindowProcW(hWnd, msg, wParam, lParam); case WM_DROPFILES: { @@ -2675,7 +2675,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar hAccel = LoadAcceleratorsW(hInstance, wszAccelTable); wc.cbSize = sizeof(wc); - wc.style = CS_HREDRAW | CS_VREDRAW; + wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 4; @@ -2689,7 +2689,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar wc.lpszClassName = wszMainWndClass; RegisterClassExW(&wc); - wc.style = CS_HREDRAW | CS_VREDRAW; + wc.style = 0; wc.lpfnWndProc = preview_proc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; @@ -2697,7 +2697,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar wc.hIcon = NULL; wc.hIconSm = NULL; wc.hCursor = LoadCursor(NULL, IDC_IBEAM); - wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); + wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = wszPreviewWndClass; RegisterClassExW(&wc); @@ -2714,7 +2714,6 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar set_caption(NULL); set_bar_states(); set_fileformat(SF_RTF); - hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_POPUP)); hColorPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_COLOR_POPUP)); get_default_printer_opts(); target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]); diff --git a/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h index c3c5bc089ba..0cde557117c 100644 --- a/reactos/base/applications/wordpad/wordpad.h +++ b/reactos/base/applications/wordpad/wordpad.h @@ -237,8 +237,10 @@ #define STRING_PRINTING_NOT_IMPLEMENTED 1711 #define STRING_MAX_TAB_STOPS 1712 +/* wordpad.c */ LPWSTR file_basename(LPWSTR); +/* print.c */ void dialog_printsetup(HWND); void dialog_print(HWND, LPWSTR); void target_device(HWND, DWORD); @@ -255,6 +257,7 @@ void registry_read_previewpages(HKEY hKey); LRESULT CALLBACK ruler_proc(HWND, UINT, WPARAM, LPARAM); void redraw_ruler(HWND); +/* registry.c */ int reg_formatindex(WPARAM); void registry_read_filelist(HWND); void registry_read_options(void); @@ -262,5 +265,8 @@ void registry_read_formatopts_all(DWORD[], DWORD[]); void registry_read_winrect(RECT*); void registry_read_maximized(DWORD*); void registry_set_filelist(LPCWSTR, HWND); -void registry_set_formatopts_all(DWORD[]); +void registry_set_formatopts_all(DWORD[], DWORD[]); void registry_set_options(HWND); + +/* olecallback.c */ +HRESULT setup_richedit_olecallback(HWND hEditorWnd); diff --git a/reactos/base/applications/wordpad/wordpad.rbuild b/reactos/base/applications/wordpad/wordpad.rbuild index 9c21eac69b9..069fb119a0b 100644 --- a/reactos/base/applications/wordpad/wordpad.rbuild +++ b/reactos/base/applications/wordpad/wordpad.rbuild @@ -4,12 +4,16 @@ . include/reactos/wine + wine comdlg32 + uuid + ole32 shell32 user32 gdi32 advapi32 comctl32 + olecallback.c print.c registry.c wordpad.c From e814e6afe8223aa05f9345a0e3d6bc31aba529e5 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 23 Jul 2010 15:51:54 +0000 Subject: [PATCH 59/82] [NDIS] - Guard several definitions against NDIS_SUPPORT_60_COMPATIBLE_API. - __GNU_EXTENSION -> __MINGW_EXTENSION conversions. - Group some related definitions. - Update NDIS_RW_LOCK. - Improve NDIS_TIMER_FUNCTION. - Add several missing Ndis* function declarations. - Guard several definitions against NDIS_LEGACY_DRIVER and NDIS_LEGACY_MINIPORT. - Convert some function declarations into macros. svn path=/trunk/; revision=48211 --- reactos/include/ddk/ndis.h | 4653 +++++++++++++++++++----------------- 1 file changed, 2435 insertions(+), 2218 deletions(-) diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index e58e5dbdead..afc55c1c64f 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -595,45 +595,54 @@ typedef MDL NDIS_BUFFER, *PNDIS_BUFFER; #define NDIS_ATTRIBUTE_NOT_CO_NDIS 0x00000100 #define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS 0x00000200 - /* Lock */ +#if NDIS_SUPPORT_60_COMPATIBLE_API + typedef union _NDIS_RW_LOCK_REFCOUNT { - UINT RefCount; - UCHAR cacheLine[16]; + UINT RefCount; + UCHAR cacheLine[16]; } NDIS_RW_LOCK_REFCOUNT; typedef struct _NDIS_RW_LOCK { - __GNU_EXTENSION union { - __GNU_EXTENSION struct { - KSPIN_LOCK SpinLock; - PVOID Context; + __MINGW_EXTENSION union { + __MINGW_EXTENSION struct { + KSPIN_LOCK SpinLock; + PVOID Context; + }; + UCHAR Reserved[16]; + }; + __MINGW_EXTENSION union { + NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS]; + ULONG RefCountEx[sizeof(NDIS_RW_LOCK_REFCOUNT)/sizeof(ULONG) * MAXIMUM_PROCESSORS]; + __MINGW_EXTENSION struct { + KSPIN_LOCK RefCountLock; + volatile ULONG SharedRefCount; + volatile BOOLEAN WriterWaiting; }; - UCHAR Reserved[16]; }; - - NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS]; } NDIS_RW_LOCK, *PNDIS_RW_LOCK; typedef struct _LOCK_STATE { - USHORT LockState; - KIRQL OldIrql; + USHORT LockState; + KIRQL OldIrql; } LOCK_STATE, *PLOCK_STATE; - +#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */ /* Timer */ typedef VOID -(NTAPI *PNDIS_TIMER_FUNCTION)( - IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); +(NTAPI NDIS_TIMER_FUNCTION)( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); +typedef NDIS_TIMER_FUNCTION *PNDIS_TIMER_FUNCTION; typedef struct _NDIS_TIMER { - KTIMER Timer; - KDPC Dpc; + KTIMER Timer; + KDPC Dpc; } NDIS_TIMER, *PNDIS_TIMER; /* Hardware */ @@ -1941,2140 +1950,8 @@ typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; #endif - - -/* Buffer management routines */ - -NDISAPI -VOID -NTAPI -NdisAllocateBuffer( - OUT PNDIS_STATUS Status, - OUT PNDIS_BUFFER *Buffer, - IN NDIS_HANDLE PoolHandle, - IN PVOID VirtualAddress, - IN UINT Length); - - -NDISAPI -VOID -NTAPI -NdisAllocateBufferPool( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE PoolHandle, - IN UINT NumberOfDescriptors); - -NDISAPI -VOID -NTAPI -NdisAllocatePacket( - OUT PNDIS_STATUS Status, - OUT PNDIS_PACKET *Packet, - IN NDIS_HANDLE PoolHandle); - -NDISAPI -VOID -NTAPI -NdisAllocatePacketPool( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE PoolHandle, - IN UINT NumberOfDescriptors, - IN UINT ProtocolReservedLength); - #define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID)) -NDISAPI -VOID -NTAPI -NdisCopyBuffer( - OUT PNDIS_STATUS Status, - OUT PNDIS_BUFFER *Buffer, - IN NDIS_HANDLE PoolHandle, - IN PVOID MemoryDescriptor, - IN UINT Offset, - IN UINT Length); - -NDISAPI -VOID -NTAPI -NdisCopyFromPacketToPacket( - IN PNDIS_PACKET Destination, - IN UINT DestinationOffset, - IN UINT BytesToCopy, - IN PNDIS_PACKET Source, - IN UINT SourceOffset, - OUT PUINT BytesCopied); - -/* - * VOID - * NdisCopyLookaheadData( - * IN PVOID Destination, - * IN PVOID Source, - * IN ULONG Length, - * IN ULONG ReceiveFlags); - */ - -#if defined(_M_IX86) || defined(_M_AMD64) -#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \ - RtlCopyMemory(Destination, Source, Length) -#else -#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \ - { \ - if ((MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \ - { \ - RtlCopyMemory(_Destination, _Source, _Length); \ - } \ - else \ - { \ - PUCHAR _Src = (PUCHAR)(Source); \ - PUCHAR _Dest = (PUCHAR)(Destination); \ - PUCHAR _End = _Dest + (Length); \ - while (_Dest < _End) \ - *_Dest++ = *_Src++; \ - } \ - } -#endif - -NDISAPI -VOID -NTAPI -NdisDprAllocatePacket( - OUT PNDIS_STATUS Status, - OUT PNDIS_PACKET *Packet, - IN NDIS_HANDLE PoolHandle); - -NDISAPI -VOID -NTAPI -NdisDprAllocatePacketNonInterlocked( - OUT PNDIS_STATUS Status, - OUT PNDIS_PACKET *Packet, - IN NDIS_HANDLE PoolHandle); - -NDISAPI -VOID -NTAPI -NdisDprFreePacket( - IN PNDIS_PACKET Packet); - -NDISAPI -VOID -NTAPI -NdisDprFreePacketNonInterlocked( - IN PNDIS_PACKET Packet); - -NDISAPI -VOID -NTAPI -NdisFreeBufferPool( - IN NDIS_HANDLE PoolHandle); - -NDISAPI -VOID -NTAPI -NdisFreePacket( - IN PNDIS_PACKET Packet); - -NDISAPI -VOID -NTAPI -NdisFreePacketPool( - IN NDIS_HANDLE PoolHandle); - -NDISAPI -VOID -NTAPI -NdisReturnPackets( - IN PNDIS_PACKET *PacketsToReturn, - IN UINT NumberOfPackets); - -NDISAPI -VOID -NTAPI -NdisUnchainBufferAtBack( - IN OUT PNDIS_PACKET Packet, - OUT PNDIS_BUFFER *Buffer); - -NDISAPI -VOID -NTAPI -NdisUnchainBufferAtFront( - IN OUT PNDIS_PACKET Packet, - OUT PNDIS_BUFFER *Buffer); - -NDISAPI -VOID -NTAPI -NdisAdjustBufferLength( - IN PNDIS_BUFFER Buffer, - IN UINT Length); - -NDISAPI -ULONG -NTAPI -NdisBufferLength( - IN PNDIS_BUFFER Buffer); - -NDISAPI -PVOID -NTAPI -NdisBufferVirtualAddress( - IN PNDIS_BUFFER Buffer); - -NDISAPI -ULONG -NTAPI -NDIS_BUFFER_TO_SPAN_PAGES( - IN PNDIS_BUFFER Buffer); - -NDISAPI -VOID -NTAPI -NdisFreeBuffer( - IN PNDIS_BUFFER Buffer); - -NDISAPI -VOID -NTAPI -NdisGetBufferPhysicalArraySize( - IN PNDIS_BUFFER Buffer, - OUT PUINT ArraySize); - -NDISAPI -VOID -NTAPI -NdisGetFirstBufferFromPacket( - IN PNDIS_PACKET _Packet, - OUT PNDIS_BUFFER *_FirstBuffer, - OUT PVOID *_FirstBufferVA, - OUT PUINT _FirstBufferLength, - OUT PUINT _TotalBufferLength); - -/* - * VOID - * NdisGetFirstBufferFromPacketSafe( - * IN PNDIS_PACKET _Packet, - * OUT PNDIS_BUFFER * _FirstBuffer, - * OUT PVOID * _FirstBufferVA, - * OUT PUINT _FirstBufferLength, - * OUT PUINT _TotalBufferLength), - * IN MM_PAGE_PRIORITY _Priority) - */ -#define NdisGetFirstBufferFromPacketSafe(_Packet, \ - _FirstBuffer, \ - _FirstBufferVA, \ - _FirstBufferLength, \ - _TotalBufferLength, \ - _Priority) \ -{ \ - PNDIS_BUFFER _Buffer; \ - \ - _Buffer = (_Packet)->Private.Head; \ - *(_FirstBuffer) = _Buffer; \ - if (_Buffer != NULL) \ - { \ - *(_FirstBufferVA) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \ - *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer); \ - _Buffer = _Buffer->Next; \ - *(_TotalBufferLength) = *(_FirstBufferLength); \ - while (_Buffer != NULL) { \ - *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer); \ - _Buffer = _Buffer->Next; \ - } \ - } \ - else \ - { \ - *(_FirstBufferVA) = 0; \ - *(_FirstBufferLength) = 0; \ - *(_TotalBufferLength) = 0; \ - } \ -} - -NDISAPI -VOID -NTAPI -NdisQueryBuffer( - IN PNDIS_BUFFER Buffer, - OUT PVOID *VirtualAddress OPTIONAL, - OUT PUINT Length); - -NDISAPI -VOID -NTAPI -NdisQueryBufferOffset( - IN PNDIS_BUFFER Buffer, - OUT PUINT Offset, - OUT PUINT Length); - -/* - * PVOID - * NDIS_BUFFER_LINKAGE( - * IN PNDIS_BUFFER Buffer); - */ -#define NDIS_BUFFER_LINKAGE(Buffer)(Buffer)->Next; - - -/* - * VOID - * NdisChainBufferAtBack( - * IN OUT PNDIS_PACKET Packet, - * IN OUT PNDIS_BUFFER Buffer) - */ -#define NdisChainBufferAtBack(Packet, \ - Buffer) \ -{ \ - PNDIS_BUFFER NdisBuffer = (Buffer); \ - \ - while (NdisBuffer->Next != NULL) \ - NdisBuffer = NdisBuffer->Next; \ - \ - NdisBuffer->Next = NULL; \ - \ - if ((Packet)->Private.Head != NULL) \ - (Packet)->Private.Tail->Next = (Buffer); \ - else \ - (Packet)->Private.Head = (Buffer); \ - \ - (Packet)->Private.Tail = NdisBuffer; \ - (Packet)->Private.ValidCounts = FALSE; \ -} - - -/* - * VOID - * NdisChainBufferAtFront( - * IN OUT PNDIS_PACKET Packet, - * IN OUT PNDIS_BUFFER Buffer) - */ -#define NdisChainBufferAtFront(Packet, \ - Buffer) \ -{ \ - PNDIS_BUFFER _NdisBuffer = (Buffer); \ - \ - while (_NdisBuffer->Next != NULL) \ - _NdisBuffer = _NdisBuffer->Next; \ - \ - if ((Packet)->Private.Head == NULL) \ - (Packet)->Private.Tail = _NdisBuffer; \ - \ - _NdisBuffer->Next = (Packet)->Private.Head; \ - (Packet)->Private.Head = (Buffer); \ - (Packet)->Private.ValidCounts = FALSE; \ -} - - -/* - * VOID - * NdisGetNextBuffer( - * IN PNDIS_BUFFER CurrentBuffer, - * OUT PNDIS_BUFFER * NextBuffer) - */ -#define NdisGetNextBuffer(CurrentBuffer, \ - NextBuffer) \ -{ \ - *(NextBuffer) = (CurrentBuffer)->Next; \ -} - -#if NDIS_LEGACY_DRIVER - -#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head) -#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail) -#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts) - -/* - * UINT - * NdisGetPacketFlags( - * IN PNDIS_PACKET Packet); - */ -#define NdisGetPacketFlags(Packet)(Packet)->Private.Flags; - -/* - * ULONG - * NDIS_GET_PACKET_PROTOCOL_TYPE( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \ - ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK) - -/* - * PNDIS_PACKET_OOB_DATA - * NDIS_OOB_DATA_FROM_PACKET( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_OOB_DATA_FROM_PACKET(_Packet) \ - (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset) - -/* - * ULONG - * NDIS_GET_PACKET_HEADER_SIZE( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_HEADER_SIZE(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->HeaderSize - -/* - * NDIS_STATUS - * NDIS_GET_PACKET_STATUS( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_STATUS(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->Status - -/* - * ULONGLONG - * NDIS_GET_PACKET_TIME_TO_SEND( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeToSend - -/* - * ULONGLONG - * NDIS_GET_PACKET_TIME_SENT( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_TIME_SENT(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeSent - -/* - * ULONGLONG - * NDIS_GET_PACKET_TIME_RECEIVED( - * IN PNDIS_PACKET Packet); - */ -#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeReceived - -/* - * VOID - * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO( - * IN PNDIS_PACKET Packet, - * IN PPVOID pMediaSpecificInfo, - * IN PUINT pSizeMediaSpecificInfo); - */ -#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ - _pMediaSpecificInfo, \ - _pSizeMediaSpecificInfo) \ -{ \ - if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) || \ - !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO)) \ - { \ - *(_pMediaSpecificInfo) = NULL; \ - *(_pSizeMediaSpecificInfo) = 0; \ - } \ - else \ - { \ - *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation; \ - *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo; \ - } \ -} - -/* - * VOID - * NDIS_SET_PACKET_HEADER_SIZE( - * IN PNDIS_PACKET Packet, - * IN UINT HdrSize); - */ -#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize) - -/* - * VOID - * NDIS_SET_PACKET_STATUS( - * IN PNDIS_PACKET Packet, - * IN NDIS_STATUS Status); - */ -#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status) - -/* - * VOID - * NDIS_SET_PACKET_TIME_TO_SEND( - * IN PNDIS_PACKET Packet, - * IN ULONGLONG TimeToSend); - */ -#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend) - -/* - * VOID - * NDIS_SET_PACKET_TIME_SENT( - * IN PNDIS_PACKET Packet, - * IN ULONGLONG TimeSent); - */ -#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent) - -/* - * VOID - * NDIS_SET_PACKET_TIME_RECEIVED( - * IN PNDIS_PACKET Packet, - * IN ULONGLONG TimeReceived); - */ -#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived) - -/* - * VOID - * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO( - * IN PNDIS_PACKET Packet, - * IN PVOID MediaSpecificInfo, - * IN UINT SizeMediaSpecificInfo); - */ -#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ - _MediaSpecificInfo, \ - _SizeMediaSpecificInfo) \ -{ \ - if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) \ - { \ - (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \ - (_MediaSpecificInfo); \ - ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ - (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \ - (_SizeMediaSpecificInfo); \ - } \ -} - -/* - * VOID - * NdisSetPacketFlags( - * IN PNDIS_PACKET Packet, - * IN UINT Flags); - */ -#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags) - -/* - * VOID - * NdisClearPacketFlags( - * IN PNDIS_PACKET Packet, - * IN UINT Flags); - */ -#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags) - -#endif /* NDIS_LEGACY_DRIVER */ - -/* - * VOID - * NdisQueryPacket( - * IN PNDIS_PACKET Packet, - * OUT PUINT PhysicalBufferCount OPTIONAL, - * OUT PUINT BufferCount OPTIONAL, - * OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, - * OUT PUINT TotalPacketLength OPTIONAL); - */ -static __inline -VOID -NdisQueryPacket( - IN PNDIS_PACKET Packet, - OUT PUINT PhysicalBufferCount OPTIONAL, - OUT PUINT BufferCount OPTIONAL, - OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, - OUT PUINT TotalPacketLength OPTIONAL) -{ - if (FirstBuffer) - *FirstBuffer = Packet->Private.Head; - if (TotalPacketLength || BufferCount || PhysicalBufferCount) - { - if (!Packet->Private.ValidCounts) - { - UINT Offset; - UINT PacketLength; - PNDIS_BUFFER NdisBuffer; - UINT PhysicalBufferCount = 0; - UINT TotalPacketLength = 0; - UINT Count = 0; - - for (NdisBuffer = Packet->Private.Head; - NdisBuffer != (PNDIS_BUFFER)NULL; - NdisBuffer = NdisBuffer->Next) - { - PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer); - NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength); - TotalPacketLength += PacketLength; - Count++; - } - Packet->Private.PhysicalCount = PhysicalBufferCount; - Packet->Private.TotalLength = TotalPacketLength; - Packet->Private.Count = Count; - Packet->Private.ValidCounts = TRUE; - } - - if (PhysicalBufferCount) - *PhysicalBufferCount = Packet->Private.PhysicalCount; - - if (BufferCount) - *BufferCount = Packet->Private.Count; - - if (TotalPacketLength) - *TotalPacketLength = Packet->Private.TotalLength; - } -} - -/* - * VOID - * NdisQueryPacketLength( - * IN PNDIS_PACKET Packet, - * OUT PUINT PhysicalBufferCount OPTIONAL, - * OUT PUINT BufferCount OPTIONAL, - * OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, - * OUT PUINT TotalPacketLength OPTIONAL); - */ -static __inline -VOID -NdisQueryPacketLength( - IN PNDIS_PACKET Packet, - OUT PUINT TotalPacketLength OPTIONAL) -{ - if (!(Packet)->Private.ValidCounts) \ - NdisQueryPacket(Packet, NULL, NULL, NULL, TotalPacketLength); \ - else \ - *(TotalPacketLength) = (Packet)->Private.TotalLength; \ -} - - -/* - * VOID - * NdisRecalculatePacketCounts( - * IN OUT PNDIS_PACKET Packet); - */ -#define NdisRecalculatePacketCounts(Packet) \ -{ \ - PNDIS_BUFFER _Buffer = (Packet)->Private.Head; \ - if (_Buffer != NULL) \ - { \ - while (_Buffer->Next != NULL) \ - { \ - _Buffer = _Buffer->Next; \ - } \ - (Packet)->Private.Tail = _Buffer; \ - } \ - (Packet)->Private.ValidCounts = FALSE; \ -} - - -/* - * VOID - * NdisReinitializePacket( - * IN OUT PNDIS_PACKET Packet); - */ -#define NdisReinitializePacket(Packet) \ -{ \ - (Packet)->Private.Head = (PNDIS_BUFFER)NULL; \ - (Packet)->Private.ValidCounts = FALSE; \ -} - -/* - * VOID - * NdisSetSendFlags( - * IN PNDIS_PACKET Packet, - * IN UINT Flags); - */ -#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags) - - - -/* Memory management routines */ - -NDISAPI -VOID -NTAPI -NdisCreateLookaheadBufferFromSharedMemory( - IN PVOID pSharedMemory, - IN UINT LookaheadLength, - OUT PVOID *pLookaheadBuffer); - -NDISAPI -VOID -NTAPI -NdisDestroyLookaheadBufferFromSharedMemory( - IN PVOID pLookaheadBuffer); - -#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_PPC) - -/* - * VOID - * NdisMoveMappedMemory( - * OUT PVOID Destination, - * IN PVOID Source, - * IN ULONG Length); - */ -#define NdisMoveMappedMemory(Destination, Source, Length) \ - RtlCopyMemory(Destination, Source, Length) - -/* - * VOID - * NdisZeroMappedMemory( - * IN PVOID Destination, - * IN ULONG Length); - */ -#define NdisZeroMappedMemory(Destination, Length) \ - RtlZeroMemory(Destination, Length) - -#else - -#define NdisMoveMappedMemory(Destination, Source, Length) \ -{ \ - PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \ - while (_Dest < _End) \ - *_Dest++ = _Src++; \ -} - -#define NdisZeroMappedMemory(Destination, Length) \ -{ \ - PUCHAR _Dest = Destination, _End = _Dest + Length; \ - while (_Dest < _End) \ - *_Dest++ = 0; \ -} - -#endif /* _M_IX86 or _M_AMD64 */ - -/* - * VOID - * NdisMoveFromMappedMemory( - * OUT PVOID Destination, - * IN PVOID Source, - * IN ULONG Length); - */ -#define NdisMoveFromMappedMemory(Destination, Source, Length) \ - NdisMoveMappedMemory(Destination, Source, Length) - -/* - * VOID - * NdisMoveToMappedMemory( - * OUT PVOID Destination, - * IN PVOID Source, - * IN ULONG Length); - */ -#define NdisMoveToMappedMemory(Destination, Source, Length) \ - NdisMoveMappedMemory(Destination, Source, Length) - -/* - * VOID - * NdisMUpdateSharedMemory( - * IN NDIS_HANDLE MiniportAdapterHandle, - * IN ULONG Length, - * IN PVOID VirtualAddress, - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \ - NdisUpdateSharedMemory(_H, _L, _V, _P) - -NDISAPI -NDIS_STATUS -NTAPI -NdisAllocateMemory( - OUT PVOID *VirtualAddress, - IN UINT Length, - IN UINT MemoryFlags, - IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); - -NDISAPI -VOID -NTAPI -NdisFreeMemory( - IN PVOID VirtualAddress, - IN UINT Length, - IN UINT MemoryFlags); - -NDISAPI -VOID -NTAPI -NdisImmediateReadSharedMemory( - IN NDIS_HANDLE WrapperConfigurationContext, - IN ULONG SharedMemoryAddress, - OUT PUCHAR Buffer, - IN ULONG Length); - -NDISAPI -VOID -NTAPI -NdisImmediateWriteSharedMemory( - IN NDIS_HANDLE WrapperConfigurationContext, - IN ULONG SharedMemoryAddress, - IN PUCHAR Buffer, - IN ULONG Length); - -NDISAPI -VOID -NTAPI -NdisMAllocateSharedMemory( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - OUT PVOID *VirtualAddress, - OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMAllocateSharedMemoryAsync( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - IN PVOID Context); - -#if defined(NDIS50) - -#define NdisUpdateSharedMemory(NdisAdapterHandle, \ - Length, \ - VirtualAddress, \ - PhysicalAddress) - -#else - -NDISAPI -VOID -NTAPI -NdisUpdateSharedMemory( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG Length, - IN PVOID VirtualAddress, - IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - -#endif /* defined(NDIS50) */ - -/* - * ULONG - * NdisGetPhysicalAddressHigh( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define NdisGetPhysicalAddressHigh(PhysicalAddress) \ - ((PhysicalAddress).HighPart) - -/* - * VOID - * NdisSetPhysicalAddressHigh( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - * IN ULONG Value); - */ -#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \ - ((PhysicalAddress).HighPart) = (Value) - -/* - * ULONG - * NdisGetPhysicalAddressLow( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - */ -#define NdisGetPhysicalAddressLow(PhysicalAddress) \ - ((PhysicalAddress).LowPart) - - -/* - * VOID - * NdisSetPhysicalAddressLow( - * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - * IN ULONG Value); - */ -#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \ - ((PhysicalAddress).LowPart) = (Value) - -/* - * VOID - * NDIS_PHYSICAL_ADDRESS_CONST( - * IN ULONG Low, - * IN LONG High); - */ -#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High) \ - { {(ULONG)(Low), (LONG)(High)} } - -/* - * ULONG - * NdisEqualMemory( - * IN CONST VOID *Source1, - * IN CONST VOID *Source2, - * IN ULONG Length); - */ -#define NdisEqualMemory(Source1, Source2, Length) \ - RtlEqualMemory(Source1, Source2, Length) - -/* - * VOID - * NdisFillMemory( - * IN PVOID Destination, - * IN ULONG Length, - * IN UCHAR Fill); - */ -#define NdisFillMemory(Destination, Length, Fill) \ - RtlFillMemory(Destination, Length, Fill) - -/* - * VOID - * NdisMoveMemory( - * OUT PVOID Destination, - * IN PVOID Source, - * IN ULONG Length); - */ -#define NdisMoveMemory(Destination, Source, Length) \ - RtlCopyMemory(Destination, Source, Length) - - -/* - * VOID - * NdisRetrieveUlong( - * IN PULONG DestinationAddress, - * IN PULONG SourceAddress); - */ -#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \ - RtlRetrieveUlong(DestinationAddress, SourceAddress) - - -/* - * VOID - * NdisStoreUlong( - * IN PULONG DestinationAddress, - * IN ULONG Value); - */ -#define NdisStoreUlong(DestinationAddress, Value) \ - RtlStoreUlong(DestinationAddress, Value) - - -/* - * VOID - * NdisZeroMemory( - * IN PVOID Destination, - * IN ULONG Length) - */ -#define NdisZeroMemory(Destination, Length) \ - RtlZeroMemory(Destination, Length) - -typedef VOID -(NTAPI *NDIS_BLOCK_INITIALIZER) ( - IN PUCHAR Block, - IN SIZE_T NumberOfBytes - ); - -/* Configuration routines */ - -NDISAPI -VOID -NTAPI -NdisOpenConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE ConfigurationHandle, - IN NDIS_HANDLE WrapperConfigurationContext); - -NDISAPI -VOID -NTAPI -NdisReadNetworkAddress( - OUT PNDIS_STATUS Status, - OUT PVOID *NetworkAddress, - OUT PUINT NetworkAddressLength, - IN NDIS_HANDLE ConfigurationHandle); - -NDISAPI -VOID -NTAPI -NdisReadEisaSlotInformation( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, - OUT PUINT SlotNumber, - OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData); - -NDISAPI -VOID -NTAPI -NdisReadEisaSlotInformationEx( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, - OUT PUINT SlotNumber, - OUT PNDIS_EISA_FUNCTION_INFORMATION *EisaData, - OUT PUINT NumberOfFunctions); - -NDISAPI -ULONG -NTAPI -NdisReadPciSlotInformation( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG SlotNumber, - IN ULONG Offset, - IN PVOID Buffer, - IN ULONG Length); - -NDISAPI -ULONG -NTAPI -NdisWritePciSlotInformation( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG SlotNumber, - IN ULONG Offset, - IN PVOID Buffer, - IN ULONG Length); - - - -/* String management routines */ - -NDISAPI -NDIS_STATUS -NTAPI -NdisAnsiStringToUnicodeString( - IN OUT PNDIS_STRING DestinationString, - IN PNDIS_ANSI_STRING SourceString); - -/* - * BOOLEAN - * NdisEqualString( - * IN PNDIS_STRING String1, - * IN PNDIS_STRING String2, - * IN BOOLEAN CaseInsensitive); - */ -#define NdisEqualString(_String1, _String2, _CaseInsensitive) \ - RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive) - -NDISAPI -VOID -NTAPI -NdisInitAnsiString( - IN OUT PNDIS_ANSI_STRING DestinationString, - IN PCSTR SourceString); - -NDISAPI -VOID -NTAPI -NdisInitUnicodeString( - IN OUT PNDIS_STRING DestinationString, - IN PCWSTR SourceString); - -NDISAPI -NDIS_STATUS -NTAPI -NdisUnicodeStringToAnsiString( - IN OUT PNDIS_ANSI_STRING DestinationString, - IN PNDIS_STRING SourceString); - -#define NdisFreeString(_s) NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0) -#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer) - - -/* Spin lock reoutines */ - -/* -NDISAPI -VOID -NTAPI -NdisAllocateSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock) - -/* -NDISAPI -VOID -NTAPI -NdisFreeSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisFreeSpinLock(_SpinLock) - -/* -NDISAPI -VOID -NTAPI -NdisAcquireSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql) - -/* -NDISAPI -VOID -NTAPI -NdisReleaseSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql) - -/* -NDISAPI -VOID -NTAPI -NdisDprAcquireSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock) - -/* -NDISAPI -VOID -NTAPI -NdisDprReleaseSpinLock( - IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock) - -/* I/O routines */ - -/* - * VOID - * NdisRawReadPortBufferUchar( - * IN ULONG Port, - * OUT PUCHAR Buffer, - * IN ULONG Length); - */ -#define NdisRawReadPortBufferUchar(Port, Buffer, Length) \ - READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length)) - -/* - * VOID - * NdisRawReadPortBufferUlong( - * IN ULONG Port, - * OUT PULONG Buffer, - * IN ULONG Length); - */ -#define NdisRawReadPortBufferUlong(Port, Buffer, Length) \ - READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length)) - -/* - * VOID - * NdisRawReadPortBufferUshort( - * IN ULONG Port, - * OUT PUSHORT Buffer, - * IN ULONG Length); - */ -#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \ - READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length)) - - -/* - * VOID - * NdisRawReadPortUchar( - * IN ULONG Port, - * OUT PUCHAR Data); - */ -#define NdisRawReadPortUchar(Port, Data) \ - *(Data) = READ_PORT_UCHAR((PUCHAR)(Port)) - -/* - * VOID - * NdisRawReadPortUlong( - * IN ULONG Port, - * OUT PULONG Data); - */ -#define NdisRawReadPortUlong(Port, Data) \ - *(Data) = READ_PORT_ULONG((PULONG)(Port)) - -/* - * VOID - * NdisRawReadPortUshort( - * IN ULONG Port, - * OUT PUSHORT Data); - */ -#define NdisRawReadPortUshort(Port, Data) \ - *(Data) = READ_PORT_USHORT((PUSHORT)(Port)) - - -/* - * VOID - * NdisRawWritePortBufferUchar( - * IN ULONG Port, - * IN PUCHAR Buffer, - * IN ULONG Length); - */ -#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \ - WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length)) - -/* - * VOID - * NdisRawWritePortBufferUlong( - * IN ULONG Port, - * IN PULONG Buffer, - * IN ULONG Length); - */ -#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \ - WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length)) - -/* - * VOID - * NdisRawWritePortBufferUshort( - * IN ULONG Port, - * IN PUSHORT Buffer, - * IN ULONG Length); - */ -#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \ - WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length)) - - -/* - * VOID - * NdisRawWritePortUchar( - * IN ULONG Port, - * IN UCHAR Data); - */ -#define NdisRawWritePortUchar(Port, Data) \ - WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data)) - -/* - * VOID - * NdisRawWritePortUlong( - * IN ULONG Port, - * IN ULONG Data); - */ -#define NdisRawWritePortUlong(Port, Data) \ - WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data)) - -/* - * VOID - * NdisRawWritePortUshort( - * IN ULONG Port, - * IN USHORT Data); - */ -#define NdisRawWritePortUshort(Port, Data) \ - WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data)) - - -/* - * VOID - * NdisReadRegisterUchar( - * IN PUCHAR Register, - * OUT PUCHAR Data); - */ -#define NdisReadRegisterUchar(Register, Data) \ - *(Data) = *(Register) - -/* - * VOID - * NdisReadRegisterUlong( - * IN PULONG Register, - * OUT PULONG Data); - */ -#define NdisReadRegisterUlong(Register, Data) \ - *(Data) = *(Register) - -/* - * VOID - * NdisReadRegisterUshort( - * IN PUSHORT Register, - * OUT PUSHORT Data); - */ -#define NdisReadRegisterUshort(Register, Data) \ - *(Data) = *(Register) - -/* - * VOID - * NdisReadRegisterUchar( - * IN PUCHAR Register, - * IN UCHAR Data); - */ -#define NdisWriteRegisterUchar(Register, Data) \ - WRITE_REGISTER_UCHAR((Register), (Data)) - -/* - * VOID - * NdisReadRegisterUlong( - * IN PULONG Register, - * IN ULONG Data); - */ -#define NdisWriteRegisterUlong(Register, Data) \ - WRITE_REGISTER_ULONG((Register), (Data)) - -/* - * VOID - * NdisReadRegisterUshort( - * IN PUSHORT Register, - * IN USHORT Data); - */ -#define NdisWriteRegisterUshort(Register, Data) \ - WRITE_REGISTER_USHORT((Register), (Data)) - - -/* Linked lists */ - -/* - * VOID - * NdisInitializeListHead( - * IN PLIST_ENTRY ListHead); - */ -#define NdisInitializeListHead(_ListHead) \ - InitializeListHead(_ListHead) - -/* - * PLIST_ENTRY - * NdisInterlockedInsertHeadList( - * IN PLIST_ENTRY ListHead, - * IN PLIST_ENTRY ListEntry, - * IN PNDIS_SPIN_LOCK SpinLock); - */ -#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \ - ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) - -/* - * PLIST_ENTRY - * NdisInterlockedInsertTailList( - * IN PLIST_ENTRY ListHead, - * IN PLIST_ENTRY ListEntry, - * IN PNDIS_SPIN_LOCK SpinLock); - */ -#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \ - ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) - -/* - * PLIST_ENTRY - * NdisInterlockedRemoveHeadList( - * IN PLIST_ENTRY ListHead, - * IN PNDIS_SPIN_LOCK SpinLock); -*/ -#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \ - ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock) - -/* - * VOID - * NdisInitializeSListHead( - * IN PSLIST_HEADER SListHead); - */ -#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead) - -/* - * USHORT NdisQueryDepthSList( - * IN PSLIST_HEADER SListHead); - */ -#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead) - -#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \ - ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock) - -#define NdisInterlockedPopEntryList(ListHead, Lock) \ - ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock) - -/* Interlocked routines */ - -/* - * LONG - * NdisInterlockedDecrement( - * IN PLONG Addend); - */ -#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend) - -/* - * LONG - * NdisInterlockedIncrement( - * IN PLONG Addend); - */ -#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend) - -/* - * VOID - * NdisInterlockedAddUlong( - * IN PULONG Addend, - * IN ULONG Increment, - * IN PNDIS_SPIN_LOCK SpinLock); - */ -#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \ - ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock) - - - -/* Miscellaneous routines */ - -NDISAPI -VOID -NTAPI -NdisCloseConfiguration( - IN NDIS_HANDLE ConfigurationHandle); - -NDISAPI -VOID -NTAPI -NdisReadConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING Keyword, - IN NDIS_PARAMETER_TYPE ParameterType); - -NDISAPI -VOID -NTAPI -NdisWriteConfiguration( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, - IN PNDIS_STRING Keyword, - IN PNDIS_CONFIGURATION_PARAMETER ParameterValue); - -NDISAPI -VOID -__cdecl -NdisWriteErrorLogEntry( - IN NDIS_HANDLE NdisAdapterHandle, - IN NDIS_ERROR_CODE ErrorCode, - IN ULONG NumberOfErrorValues, - IN ...); - -/* - * VOID - * NdisStallExecution( - * IN UINT MicrosecondsToStall) - */ -#define NdisStallExecution KeStallExecutionProcessor - -/* -NDISAPI -VOID -NTAPI -NdisGetCurrentSystemTime( - IN PLARGE_INTEGER pSystemTime); -*/ -#define NdisGetCurrentSystemTime KeQuerySystemTime - -NDISAPI -CCHAR -NTAPI -NdisSystemProcessorCount(VOID); - -NDISAPI -VOID -NTAPI -NdisGetCurrentProcessorCpuUsage( - OUT PULONG pCpuUsage); - - - -/* NDIS helper macros */ - -/* - * VOID - * NDIS_INIT_FUNCTION(FunctionName) - */ -#define NDIS_INIT_FUNCTION(FunctionName) \ - alloc_text(init, FunctionName) - -/* - * VOID - * NDIS_PAGABLE_FUNCTION(FunctionName) - */ -#define NDIS_PAGEABLE_FUNCTION(FunctionName) \ - alloc_text(page, FunctionName) - -#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION - - -/* NDIS 4.0 extensions */ - -NDISAPI -VOID -NTAPI -NdisMFreeSharedMemory( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - IN PVOID VirtualAddress, - IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); - -NDISAPI -VOID -NTAPI -NdisMWanIndicateReceive( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisLinkContext, - IN PUCHAR PacketBuffer, - IN UINT PacketSize); - -NDISAPI -VOID -NTAPI -NdisMWanIndicateReceiveComplete( - IN NDIS_HANDLE MiniportAdapterHandle); - -NDISAPI -VOID -NTAPI -NdisMWanSendComplete( - IN NDIS_HANDLE MiniportAdapterHandle, - IN PNDIS_WAN_PACKET Packet, - IN NDIS_STATUS Status); - -NDISAPI -NDIS_STATUS -NTAPI -NdisPciAssignResources( - IN NDIS_HANDLE NdisMacHandle, - IN NDIS_HANDLE NdisWrapperHandle, - IN NDIS_HANDLE WrapperConfigurationContext, - IN ULONG SlotNumber, - OUT PNDIS_RESOURCE_LIST *AssignedResources); - - -/* NDIS 5.0 extensions */ - -NDISAPI -VOID -NTAPI -NdisAcquireReadWriteLock( - IN PNDIS_RW_LOCK Lock, - IN BOOLEAN fWrite, - IN PLOCK_STATE LockState); - -NDISAPI -NDIS_STATUS -NTAPI -NdisAllocateMemoryWithTag( - OUT PVOID *VirtualAddress, - IN UINT Length, - IN ULONG Tag); - -NDISAPI -VOID -NTAPI -NdisAllocatePacketPoolEx( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE PoolHandle, - IN UINT NumberOfDescriptors, - IN UINT NumberOfOverflowDescriptors, - IN UINT ProtocolReservedLength); - -NDISAPI -VOID -NTAPI -NdisSetPacketPoolProtocolId( - IN NDIS_HANDLE PacketPoolHandle, - IN UINT ProtocolId); - -NDISAPI -VOID -NTAPI -NdisCompletePnPEvent( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNET_PNP_EVENT NetPnPEvent); - -NDISAPI -VOID -NTAPI -NdisGetCurrentProcessorCounts( - OUT PULONG pIdleCount, - OUT PULONG pKernelAndUser, - OUT PULONG pIndex); - -NDISAPI -VOID -NTAPI -NdisGetDriverHandle( - IN PNDIS_HANDLE NdisBindingHandle, - OUT PNDIS_HANDLE NdisDriverHandle); - -NDISAPI -PNDIS_PACKET -NTAPI -NdisGetReceivedPacket( - IN PNDIS_HANDLE NdisBindingHandle, - IN PNDIS_HANDLE MacContext); - -NDISAPI -VOID -NTAPI -NdisGetSystemUpTime( - OUT PULONG pSystemUpTime); - -NDISAPI -VOID -NTAPI -NdisInitializeReadWriteLock( - IN PNDIS_RW_LOCK Lock); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMDeregisterDevice( - IN NDIS_HANDLE NdisDeviceHandle); - -NDISAPI -VOID -NTAPI -NdisMGetDeviceProperty( - IN NDIS_HANDLE MiniportAdapterHandle, - IN OUT PDEVICE_OBJECT *PhysicalDeviceObject OPTIONAL, - IN OUT PDEVICE_OBJECT *FunctionalDeviceObject OPTIONAL, - IN OUT PDEVICE_OBJECT *NextDeviceObject OPTIONAL, - IN OUT PCM_RESOURCE_LIST *AllocatedResources OPTIONAL, - IN OUT PCM_RESOURCE_LIST *AllocatedResourcesTranslated OPTIONAL); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMInitializeScatterGatherDma( - IN NDIS_HANDLE MiniportAdapterHandle, - IN BOOLEAN Dma64BitAddresses, - IN ULONG MaximumPhysicalMapping); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMPromoteMiniport( - IN NDIS_HANDLE MiniportAdapterHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMQueryAdapterInstanceName( - OUT PNDIS_STRING AdapterInstanceName, - IN NDIS_HANDLE MiniportAdapterHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMRegisterDevice( - IN NDIS_HANDLE NdisWrapperHandle, - IN PNDIS_STRING DeviceName, - IN PNDIS_STRING SymbolicName, - IN PDRIVER_DISPATCH MajorFunctions[], - OUT PDEVICE_OBJECT *pDeviceObject, - OUT NDIS_HANDLE *NdisDeviceHandle); - -NDISAPI -VOID -NTAPI -NdisMRegisterUnloadHandler( - IN NDIS_HANDLE NdisWrapperHandle, - IN PDRIVER_UNLOAD UnloadHandler); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMRemoveMiniport( - IN NDIS_HANDLE MiniportAdapterHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMSetMiniportSecondary( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE PrimaryMiniportAdapterHandle); - -NDISAPI -VOID -NTAPI -NdisOpenConfigurationKeyByIndex( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN ULONG Index, - OUT PNDIS_STRING KeyName, - OUT PNDIS_HANDLE KeyHandle); - -NDISAPI -VOID -NTAPI -NdisOpenConfigurationKeyByName( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING SubKeyName, - OUT PNDIS_HANDLE SubKeyHandle); - -NDISAPI -UINT -NTAPI -NdisPacketPoolUsage( - IN NDIS_HANDLE PoolHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisQueryAdapterInstanceName( - OUT PNDIS_STRING AdapterInstanceName, - IN NDIS_HANDLE NdisBindingHandle); - -NDISAPI -ULONG -NTAPI -NdisReadPcmciaAttributeMemory( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG Offset, - IN PVOID Buffer, - IN ULONG Length); - -NDISAPI -VOID -NTAPI -NdisReleaseReadWriteLock( - IN PNDIS_RW_LOCK Lock, - IN PLOCK_STATE LockState); - -NDISAPI -NDIS_STATUS -NTAPI -NdisWriteEventLogEntry( - IN PVOID LogHandle, - IN NDIS_STATUS EventCode, - IN ULONG UniqueEventValue, - IN USHORT NumStrings, - IN PVOID StringsList OPTIONAL, - IN ULONG DataSize, - IN PVOID Data OPTIONAL); - -NDISAPI -ULONG -NTAPI -NdisWritePcmciaAttributeMemory( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG Offset, - IN PVOID Buffer, - IN ULONG Length); - - -/* Connectionless services */ - -NDISAPI -NDIS_STATUS -NTAPI -NdisClAddParty( - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE ProtocolPartyContext, - IN OUT PCO_CALL_PARAMETERS CallParameters, - OUT PNDIS_HANDLE NdisPartyHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClCloseAddressFamily( - IN NDIS_HANDLE NdisAfHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClCloseCall( - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN PVOID Buffer OPTIONAL, - IN UINT Size); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClDeregisterSap( - IN NDIS_HANDLE NdisSapHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClDropParty( - IN NDIS_HANDLE NdisPartyHandle, - IN PVOID Buffer OPTIONAL, - IN UINT Size); - -NDISAPI -VOID -NTAPI -NdisClIncomingCallComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClMakeCall( - IN NDIS_HANDLE NdisVcHandle, - IN OUT PCO_CALL_PARAMETERS CallParameters, - IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, - OUT PNDIS_HANDLE NdisPartyHandle OPTIONAL); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClModifyCallQoS( - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - - -NDISAPI -NDIS_STATUS -NTAPI -NdisClOpenAddressFamily( - IN NDIS_HANDLE NdisBindingHandle, - IN PCO_ADDRESS_FAMILY AddressFamily, - IN NDIS_HANDLE ProtocolAfContext, - IN PNDIS_CLIENT_CHARACTERISTICS ClCharacteristics, - IN UINT SizeOfClCharacteristics, - OUT PNDIS_HANDLE NdisAfHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisClRegisterSap( - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE ProtocolSapContext, - IN PCO_SAP Sap, - OUT PNDIS_HANDLE NdisSapHandle); - - -/* Call Manager services */ - -NDISAPI -NDIS_STATUS -NTAPI -NdisCmActivateVc( - IN NDIS_HANDLE NdisVcHandle, - IN OUT PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisCmAddPartyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisPartyHandle, - IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisCmCloseAddressFamilyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisAfHandle); - -NDISAPI -VOID -NTAPI -NdisCmCloseCallComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL); - -NDISAPI -NDIS_STATUS -NTAPI -NdisCmDeactivateVc( - IN NDIS_HANDLE NdisVcHandle); - -NDISAPI -VOID -NTAPI -NdisCmDeregisterSapComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisSapHandle); - -NDISAPI -VOID -NTAPI -NdisCmDispatchCallConnected( - IN NDIS_HANDLE NdisVcHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisCmDispatchIncomingCall( - IN NDIS_HANDLE NdisSapHandle, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisCmDispatchIncomingCallQoSChange( - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisCmDispatchIncomingCloseCall( - IN NDIS_STATUS CloseStatus, - IN NDIS_HANDLE NdisVcHandle, - IN PVOID Buffer OPTIONAL, - IN UINT Size); - -NDISAPI -VOID -NTAPI -NdisCmDispatchIncomingDropParty( - IN NDIS_STATUS DropStatus, - IN NDIS_HANDLE NdisPartyHandle, - IN PVOID Buffer OPTIONAL, - IN UINT Size); - -NDISAPI -VOID -NTAPI -NdisCmDropPartyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisPartyHandle); - -NDISAPI -VOID -NTAPI -NdisCmMakeCallComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisCmModifyCallQoSComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisCmOpenAddressFamilyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE CallMgrAfContext); - -NDISAPI -NDIS_STATUS -NTAPI -NdisCmRegisterAddressFamily( - IN NDIS_HANDLE NdisBindingHandle, - IN PCO_ADDRESS_FAMILY AddressFamily, - IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, - IN UINT SizeOfCmCharacteristics); - -NDISAPI -VOID -NTAPI -NdisCmRegisterSapComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisSapHandle, - IN NDIS_HANDLE CallMgrSapContext); - - -NDISAPI -NDIS_STATUS -NTAPI -NdisMCmActivateVc( - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMCmCreateVc( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE MiniportVcContext, - OUT PNDIS_HANDLE NdisVcHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMCmDeactivateVc( - IN NDIS_HANDLE NdisVcHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMCmDeleteVc( - IN NDIS_HANDLE NdisVcHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMCmRegisterAddressFamily( - IN NDIS_HANDLE MiniportAdapterHandle, - IN PCO_ADDRESS_FAMILY AddressFamily, - IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, - IN UINT SizeOfCmCharacteristics); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMCmRequest( - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); - - -/* Connection-oriented services */ - -NDISAPI -NDIS_STATUS -NTAPI -NdisCoCreateVc( - IN NDIS_HANDLE NdisBindingHandle, - IN NDIS_HANDLE NdisAfHandle OPTIONAL, - IN NDIS_HANDLE ProtocolVcContext, - IN OUT PNDIS_HANDLE NdisVcHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisCoDeleteVc( - IN NDIS_HANDLE NdisVcHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisCoRequest( - IN NDIS_HANDLE NdisBindingHandle, - IN NDIS_HANDLE NdisAfHandle OPTIONAL, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); - -NDISAPI -VOID -NTAPI -NdisCoRequestComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN PNDIS_REQUEST NdisRequest); - -NDISAPI -VOID -NTAPI -NdisCoSendPackets( - IN NDIS_HANDLE NdisVcHandle, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); - -NDISAPI -VOID -NTAPI -NdisMCoActivateVcComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - -NDISAPI -VOID -NTAPI -NdisMCoDeactivateVcComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle); - -NDISAPI -VOID -NTAPI -NdisMCoIndicateReceivePacket( - IN NDIS_HANDLE NdisVcHandle, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); - -NDISAPI -VOID -NTAPI -NdisMCoIndicateStatus( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer OPTIONAL, - IN ULONG StatusBufferSize); - -NDISAPI -VOID -NTAPI -NdisMCoReceiveComplete( - IN NDIS_HANDLE MiniportAdapterHandle); - -NDISAPI -VOID -NTAPI -NdisMCoRequestComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE MiniportAdapterHandle, - IN PNDIS_REQUEST Request); - -NDISAPI -VOID -NTAPI -NdisMCoSendComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PNDIS_PACKET Packet); - - -/* NDIS 5.0 extensions for intermediate drivers */ - -NDISAPI -VOID -NTAPI -NdisIMAssociateMiniport( - IN NDIS_HANDLE DriverHandle, - IN NDIS_HANDLE ProtocolHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisIMCancelInitializeDeviceInstance( - IN NDIS_HANDLE DriverHandle, - IN PNDIS_STRING DeviceInstance); - -NDISAPI -VOID -NTAPI -NdisIMCopySendCompletePerPacketInfo( - IN PNDIS_PACKET DstPacket, - IN PNDIS_PACKET SrcPacket); - -NDISAPI -VOID -NTAPI -NdisIMCopySendPerPacketInfo( - IN PNDIS_PACKET DstPacket, - IN PNDIS_PACKET SrcPacket); - -NDISAPI -VOID -NTAPI -NdisIMDeregisterLayeredMiniport( - IN NDIS_HANDLE DriverHandle); - -NDISAPI -NDIS_HANDLE -NTAPI -NdisIMGetBindingContext( - IN NDIS_HANDLE NdisBindingHandle); - -NDISAPI -NDIS_HANDLE -NTAPI -NdisIMGetDeviceContext( - IN NDIS_HANDLE MiniportAdapterHandle); - -NDISAPI -NDIS_STATUS -NTAPI -NdisIMInitializeDeviceInstanceEx( - IN NDIS_HANDLE DriverHandle, - IN PNDIS_STRING DriverInstance, - IN NDIS_HANDLE DeviceContext OPTIONAL); - -NDISAPI -PSINGLE_LIST_ENTRY -NTAPI -NdisInterlockedPopEntrySList( - IN PSLIST_HEADER ListHead, - IN PKSPIN_LOCK Lock); - -NDISAPI -PSINGLE_LIST_ENTRY -NTAPI -NdisInterlockedPushEntrySList( - IN PSLIST_HEADER ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock); - -NDISAPI -VOID -NTAPI -NdisQueryBufferSafe( - IN PNDIS_BUFFER Buffer, - OUT PVOID *VirtualAddress OPTIONAL, - OUT PUINT Length, - IN UINT Priority); - /* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */ typedef BOOLEAN @@ -4356,32 +2233,6 @@ typedef struct _NDIS_MINIPORT_CHARACTERISTICS { } NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; #endif - -typedef NDIS_STATUS -(NTAPI *SEND_HANDLER)( - IN NDIS_HANDLE MacBindingHandle, - IN PNDIS_PACKET Packet); - -typedef NDIS_STATUS -(NTAPI *TRANSFER_DATA_HANDLER)( - IN NDIS_HANDLE MacBindingHandle, - IN NDIS_HANDLE MacReceiveContext, - IN UINT ByteOffset, - IN UINT BytesToTransfer, - OUT PNDIS_PACKET Packet, - OUT PUINT BytesTransferred); - -typedef NDIS_STATUS -(NTAPI *RESET_HANDLER)( - IN NDIS_HANDLE MacBindingHandle); - -typedef NDIS_STATUS -(NTAPI *REQUEST_HANDLER)( - IN NDIS_HANDLE MacBindingHandle, - IN PNDIS_REQUEST NdisRequest); - - - /* Structures available only to full MAC drivers */ typedef BOOLEAN @@ -4395,19 +2246,17 @@ typedef VOID IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); - - -typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK, *PNDIS_MINIPORT_BLOCK; +typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, *PNDIS_WRAPPER_HANDLE; typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK; -typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK; +typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK; typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK; -typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST; - -// -// FIXME: Should be typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER; -// -typedef PVOID ETH_FILTER, *PETH_FILTER; - +typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK,*PNDIS_MINIPORT_BLOCK; +typedef struct _NDIS_OFFLOAD NDIS_OFFLOAD, *PNDIS_OFFLOAD; +typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST; +typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER; +#if NDIS_SUPPORT_NDIS6 +typedef USHORT NET_FRAME_TYPE, *PNET_FRAME_TYPE; +#endif typedef struct _NDIS_MINIPORT_INTERRUPT { PKINTERRUPT InterruptObject; @@ -4844,20 +2693,44 @@ struct _NDIS_MINIPORT_BLOCK { #endif /* _NDIS_ */ }; +#if NDIS_LEGACY_DRIVER -/* Handler prototypes for NDIS_OPEN_BLOCK */ +typedef NDIS_STATUS +(NTAPI *WAN_SEND_HANDLER)( + IN NDIS_HANDLE MacBindingHandle, + IN NDIS_HANDLE LinkHandle, + IN PVOID Packet); -typedef NDIS_STATUS (NTAPI *WAN_SEND_HANDLER)( - IN NDIS_HANDLE MacBindingHandle, - IN NDIS_HANDLE LinkHandle, - IN PVOID Packet); +typedef VOID +(NTAPI *SEND_PACKETS_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); -/* NDIS 4.0 extension */ +typedef NDIS_STATUS +(NTAPI *SEND_HANDLER)( + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_PACKET Packet); -typedef VOID (NTAPI *SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); +typedef NDIS_STATUS +(NTAPI *TRANSFER_DATA_HANDLER)( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred); + +typedef NDIS_STATUS +(NTAPI *RESET_HANDLER)( + IN NDIS_HANDLE NdisBindingHandle); + +typedef NDIS_STATUS +(NTAPI *REQUEST_HANDLER)( + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_REQUEST NdisRequest); + +#endif /* NDIS_LEGACY_DRIVER */ #if defined(NDIS_WRAPPER) #define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S \ @@ -4931,6 +2804,2359 @@ struct _NDIS_OPEN_BLOCK #endif }; +NDISAPI +VOID +NTAPI +NdisInitializeTimer( + PNDIS_TIMER Timer, + PNDIS_TIMER_FUNCTION TimerFunction, + PVOID FunctionContext); + +NDISAPI +VOID +NTAPI +NdisCancelTimer( + PNDIS_TIMER Timer, + PBOOLEAN TimerCancelled); + +NDISAPI +VOID +NTAPI +NdisSetTimer( + PNDIS_TIMER Timer, + UINT MillisecondsToDelay); + +NDISAPI +VOID +NTAPI +NdisSetPeriodicTimer( + PNDIS_TIMER NdisTimer, + UINT MillisecondsPeriod); + +NDISAPI +VOID +NTAPI +NdisSetTimerEx( + PNDIS_TIMER NdisTimer, + UINT MillisecondsToDelay, + PVOID FunctionContext); + +NDISAPI +PVOID +NTAPI +NdisGetRoutineAddress( + PNDIS_STRING NdisRoutineName); + +NDISAPI +UINT +NTAPI +NdisGetVersion(VOID); + +#if NDIS_LEGACY_DRIVER + +NDISAPI +VOID +NTAPI +NdisAllocateBuffer( + OUT PNDIS_STATUS Status, + OUT PNDIS_BUFFER *Buffer, + IN NDIS_HANDLE PoolHandle OPTIONAL, + IN PVOID VirtualAddress, + IN UINT Length); + +NDISAPI +VOID +NTAPI +NdisAllocateBufferPool( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE PoolHandle, + IN UINT NumberOfDescriptors); + +NDISAPI +VOID +NTAPI +NdisFreeBufferPool( + IN NDIS_HANDLE PoolHandle); + +/* +NDISAPI +VOID +NTAPI +NdisFreeBuffer( + IN PNDIS_BUFFER Buffer); +*/ +#define NdisFreeBuffer IoFreeMdl + +NDISAPI +VOID +NTAPI +NdisAllocatePacketPool( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE PoolHandle, + IN UINT NumberOfDescriptors, + IN UINT ProtocolReservedLength); + +NDISAPI +VOID +NTAPI +NdisAllocatePacketPoolEx( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE PoolHandle, + IN UINT NumberOfDescriptors, + IN UINT NumberOfOverflowDescriptors, + IN UINT ProtocolReservedLength); + +NDISAPI +VOID +NTAPI +NdisSetPacketPoolProtocolId( + IN NDIS_HANDLE PacketPoolHandle, + IN UINT ProtocolId); + +NDISAPI +UINT +NTAPI +NdisPacketPoolUsage( + IN NDIS_HANDLE PoolHandle); + +NDISAPI +UINT +NTAPI +NdisPacketSize( + IN UINT ProtocolReservedSize); + +NDISAPI +NDIS_HANDLE +NTAPI +NdisGetPoolFromPacket( + IN PNDIS_PACKET Packet); + +NDISAPI +NTAPI +PNDIS_PACKET_STACK +NdisIMGetCurrentPacketStack( + IN PNDIS_PACKET Packet, + OUT BOOLEAN * StacksRemaining); + +NDISAPI +VOID +NTAPI +NdisFreePacketPool( + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +NTAPI +NdisFreePacket( + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +NTAPI +NdisDprFreePacket( + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +NTAPI +NdisDprFreePacketNonInterlocked( + IN PNDIS_PACKET Packet); + +NDISAPI +VOID +NTAPI +NdisAllocatePacket( + OUT PNDIS_STATUS Status, + OUT PNDIS_PACKET *Packet, + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +NTAPI +NdisDprAllocatePacket( + OUT PNDIS_STATUS Status, + OUT PNDIS_PACKET *Packet, + IN NDIS_HANDLE PoolHandle); + +NDISAPI +VOID +NTAPI +NdisDprAllocatePacketNonInterlocked( + OUT PNDIS_STATUS Status, + OUT PNDIS_PACKET *Packet, + IN NDIS_HANDLE PoolHandle); + +/* + * VOID + * NdisReinitializePacket( + * IN OUT PNDIS_PACKET Packet); + */ +#define NdisReinitializePacket(Packet) { \ + (Packet)->Private.Head = (PNDIS_BUFFER)NULL; \ + (Packet)->Private.ValidCounts = FALSE; \ +} + +/* +NDISAPI +VOID +NTAPI +NdisQueryBuffer( + IN PNDIS_BUFFER Buffer, + OUT PVOID *VirtualAddress OPTIONAL, + OUT PUINT Length); +*/ +#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) { \ + if (ARGUMENT_PRESENT(_VirtualAddress)) { \ + *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \ + } \ + *(_Length) = MmGetMdlByteCount(_Buffer); \ +} + +NDISAPI +VOID +NTAPI +NdisGetFirstBufferFromPacket( + IN PNDIS_PACKET _Packet, + OUT PNDIS_BUFFER *_FirstBuffer, + OUT PVOID *_FirstBufferVA, + OUT PUINT _FirstBufferLength, + OUT PUINT _TotalBufferLength); + +/* + * VOID + * NdisGetFirstBufferFromPacketSafe( + * IN PNDIS_PACKET _Packet, + * OUT PNDIS_BUFFER * _FirstBuffer, + * OUT PVOID * _FirstBufferVA, + * OUT PUINT _FirstBufferLength, + * OUT PUINT _TotalBufferLength), + * IN MM_PAGE_PRIORITY _Priority) + */ +#define NdisGetFirstBufferFromPacketSafe(_Packet, \ + _FirstBuffer, \ + _FirstBufferVA, \ + _FirstBufferLength, \ + _TotalBufferLength, \ + _Priority) \ +{ \ + PNDIS_BUFFER _Buffer; \ + \ + _Buffer = (_Packet)->Private.Head; \ + *(_FirstBuffer) = _Buffer; \ + if (_Buffer != NULL) { \ + *(_FirstBufferVA) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \ + *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer); \ + _Buffer = _Buffer->Next; \ + *(_TotalBufferLength) = *(_FirstBufferLength); \ + while (_Buffer != NULL) { \ + *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer); \ + _Buffer = _Buffer->Next; \ + } \ + } \ + else { \ + *(_FirstBufferVA) = 0; \ + *(_FirstBufferLength) = 0; \ + *(_TotalBufferLength) = 0; \ + } \ +} + +/* + * VOID + * NdisRecalculatePacketCounts( + * IN OUT PNDIS_PACKET Packet); + */ +#define NdisRecalculatePacketCounts(Packet) { \ + PNDIS_BUFFER _Buffer = (Packet)->Private.Head; \ + if (_Buffer != NULL) { \ + while (_Buffer->Next != NULL) { \ + _Buffer = _Buffer->Next; \ + } \ + (Packet)->Private.Tail = _Buffer; \ + } \ + (Packet)->Private.ValidCounts = FALSE; \ +} + +/* + * VOID + * NdisChainBufferAtFront( + * IN OUT PNDIS_PACKET Packet, + * IN OUT PNDIS_BUFFER Buffer) + */ +#define NdisChainBufferAtFront(Packet, \ + Buffer) \ +{ \ + PNDIS_BUFFER _NdisBuffer = (Buffer); \ + \ + while (_NdisBuffer->Next != NULL) \ + _NdisBuffer = _NdisBuffer->Next; \ + \ + if ((Packet)->Private.Head == NULL) \ + (Packet)->Private.Tail = _NdisBuffer; \ + \ + _NdisBuffer->Next = (Packet)->Private.Head; \ + (Packet)->Private.Head = (Buffer); \ + (Packet)->Private.ValidCounts = FALSE; \ +} + +/* + * VOID + * NdisChainBufferAtBack( + * IN OUT PNDIS_PACKET Packet, + * IN OUT PNDIS_BUFFER Buffer) + */ +#define NdisChainBufferAtBack(Packet, \ + Buffer) \ +{ \ + PNDIS_BUFFER NdisBuffer = (Buffer); \ + \ + while (NdisBuffer->Next != NULL) \ + NdisBuffer = NdisBuffer->Next; \ + \ + NdisBuffer->Next = NULL; \ + \ + if ((Packet)->Private.Head != NULL) \ + (Packet)->Private.Tail->Next = (Buffer); \ + else \ + (Packet)->Private.Head = (Buffer); \ + \ + (Packet)->Private.Tail = NdisBuffer; \ + (Packet)->Private.ValidCounts = FALSE; \ +} + +NDISAPI +VOID +NTAPI +NdisUnchainBufferAtFront( + IN OUT PNDIS_PACKET Packet, + OUT PNDIS_BUFFER *Buffer); + +NDISAPI +VOID +NTAPI +NdisUnchainBufferAtBack( + IN OUT PNDIS_PACKET Packet, + OUT PNDIS_BUFFER *Buffer); + +NDISAPI +VOID +NTAPI +NdisCopyFromPacketToPacket( + IN PNDIS_PACKET Destination, + IN UINT DestinationOffset, + IN UINT BytesToCopy, + IN PNDIS_PACKET Source, + IN UINT SourceOffset, + OUT PUINT BytesCopied); + +NDISAPI +VOID +NTAPI +NdisCopyFromPacketToPacketSafe( + IN PNDIS_PACKET Destination, + IN UINT DestinationOffset, + IN UINT BytesToCopy, + IN PNDIS_PACKET Source, + IN UINT SourceOffset, + OUT PUINT BytesCopied, + IN MM_PAGE_PRIORITY Priority); + +NDISAPI +NDIS_STATUS +NTAPI +NdisAllocateMemory( + OUT PVOID *VirtualAddress, + IN UINT Length, + IN UINT MemoryFlags, + IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); + +#define NdisInitializeWorkItem(_WI_, _R_, _C_) { \ + (_WI_)->Context = _C_; \ + (_WI_)->Routine = _R_; \ +} + +NDISAPI +NDIS_STATUS +NTAPI +NdisScheduleWorkItem( + IN PNDIS_WORK_ITEM WorkItem); + +NDISAPI +VOID +NTAPI +NdisSetPacketStatus( + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN NDIS_HANDLE Handle, + IN ULONG Code); + +#endif /* NDIS_LEGACY_DRIVER */ + +NDISAPI +VOID +NTAPI +NdisOpenFile( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE FileHandle, + OUT PUINT FileLength, + IN PNDIS_STRING FileName, + IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); + +NDISAPI +VOID +NTAPI +NdisCloseFile( + IN NDIS_HANDLE FileHandle); + +NDISAPI +VOID +NTAPI +NdisMapFile( + OUT PNDIS_STATUS Status, + OUT PVOID *MappedBuffer, + IN NDIS_HANDLE FileHandle); + +NDISAPI +VOID +NTAPI +NdisUnmapFile( + IN NDIS_HANDLE FileHandle); + +NDISAPI +ULONG +NTAPI +NdisGetSharedDataAlignment(VOID); + +#define NdisFlushBuffer(Buffer,WriteToDevice) \ + KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE) + +NDISAPI +VOID +NTAPI +NdisCopyBuffer( + OUT PNDIS_STATUS Status, + OUT PNDIS_BUFFER *Buffer, + IN NDIS_HANDLE PoolHandle, + IN PVOID MemoryDescriptor, + IN UINT Offset, + IN UINT Length); + +/* + * VOID + * NdisCopyLookaheadData( + * IN PVOID Destination, + * IN PVOID Source, + * IN ULONG Length, + * IN ULONG ReceiveFlags); + */ + +#if defined(_M_IX86) || defined(_M_AMD64) +#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \ + RtlCopyMemory(Destination, Source, Length) +#else +#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \ + { \ + if ((MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \ + { \ + RtlCopyMemory(_Destination, _Source, _Length); \ + } \ + else \ + { \ + PUCHAR _Src = (PUCHAR)(Source); \ + PUCHAR _Dest = (PUCHAR)(Destination); \ + PUCHAR _End = _Dest + (Length); \ + while (_Dest < _End) \ + *_Dest++ = *_Src++; \ + } \ + } +#endif + +NDISAPI +VOID +NTAPI +NdisReturnPackets( + IN PNDIS_PACKET *PacketsToReturn, + IN UINT NumberOfPackets); + +/* +NDISAPI +VOID +NTAPI +NdisAdjustBufferLength( + IN PNDIS_BUFFER Buffer, + IN UINT Length); +*/ +#define NdisAdjustBufferLength(Buffer, Length) \ + (((Buffer)->ByteCount) = (Length)) + +#if NDIS_SUPPORT_NDIS6 +#define NdisAdjustMdlLength(_Mdl, _Length) \ + (((_Mdl)->ByteCount) = (_Length)) +#endif + +NDISAPI +ULONG +NTAPI +NdisBufferLength( + IN PNDIS_BUFFER Buffer); + +NDISAPI +PVOID +NTAPI +NdisBufferVirtualAddress( + IN PNDIS_BUFFER Buffer); + +NDISAPI +ULONG +NTAPI +NDIS_BUFFER_TO_SPAN_PAGES( + IN PNDIS_BUFFER Buffer); + +/* +NDISAPI +VOID +NTAPI +NdisGetBufferPhysicalArraySize( + IN PNDIS_BUFFER Buffer, + OUT PUINT ArraySize); +*/ +#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \ + (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer)) + +/* +NDISAPI +VOID +NTAPI +NdisQueryBufferOffset( + IN PNDIS_BUFFER Buffer, + OUT PUINT Offset, + OUT PUINT Length); +*/ +#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) { \ + *(_Offset) = MmGetMdlByteOffset(_Buffer); \ + *(_Length) = MmGetMdlByteCount(_Buffer); \ +} + +/* + * PVOID + * NDIS_BUFFER_LINKAGE( + * IN PNDIS_BUFFER Buffer); + */ +#define NDIS_BUFFER_LINKAGE(Buffer)(Buffer)->Next; + +/* + * VOID + * NdisGetNextBuffer( + * IN PNDIS_BUFFER CurrentBuffer, + * OUT PNDIS_BUFFER * NextBuffer) + */ +#define NdisGetNextBuffer(CurrentBuffer, \ + NextBuffer) \ +{ \ + *(NextBuffer) = (CurrentBuffer)->Next; \ +} + +#if NDIS_LEGACY_DRIVER + +#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head) +#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail) +#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts) + +/* + * UINT + * NdisGetPacketFlags( + * IN PNDIS_PACKET Packet); + */ +#define NdisGetPacketFlags(Packet)(Packet)->Private.Flags; + +/* + * ULONG + * NDIS_GET_PACKET_PROTOCOL_TYPE( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \ + ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK) + +/* + * PNDIS_PACKET_OOB_DATA + * NDIS_OOB_DATA_FROM_PACKET( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_OOB_DATA_FROM_PACKET(_Packet) \ + (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset) + +/* + * ULONG + * NDIS_GET_PACKET_HEADER_SIZE( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_HEADER_SIZE(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->HeaderSize + +/* + * NDIS_STATUS + * NDIS_GET_PACKET_STATUS( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_STATUS(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->Status + +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_TO_SEND( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeToSend + +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_SENT( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_SENT(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeSent + +/* + * ULONGLONG + * NDIS_GET_PACKET_TIME_RECEIVED( + * IN PNDIS_PACKET Packet); + */ +#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeReceived + +/* + * VOID + * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO( + * IN PNDIS_PACKET Packet, + * IN PPVOID pMediaSpecificInfo, + * IN PUINT pSizeMediaSpecificInfo); + */ +#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ + _pMediaSpecificInfo, \ + _pSizeMediaSpecificInfo) \ +{ \ + if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) || \ + !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO)) \ + { \ + *(_pMediaSpecificInfo) = NULL; \ + *(_pSizeMediaSpecificInfo) = 0; \ + } \ + else \ + { \ + *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation; \ + *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo; \ + } \ +} + +/* + * VOID + * NDIS_SET_PACKET_HEADER_SIZE( + * IN PNDIS_PACKET Packet, + * IN UINT HdrSize); + */ +#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize) + +/* + * VOID + * NDIS_SET_PACKET_STATUS( + * IN PNDIS_PACKET Packet, + * IN NDIS_STATUS Status); + */ +#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status) + +/* + * VOID + * NDIS_SET_PACKET_TIME_TO_SEND( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeToSend); + */ +#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend) + +/* + * VOID + * NDIS_SET_PACKET_TIME_SENT( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeSent); + */ +#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent) + +/* + * VOID + * NDIS_SET_PACKET_TIME_RECEIVED( + * IN PNDIS_PACKET Packet, + * IN ULONGLONG TimeReceived); + */ +#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived) + +/* + * VOID + * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO( + * IN PNDIS_PACKET Packet, + * IN PVOID MediaSpecificInfo, + * IN UINT SizeMediaSpecificInfo); + */ +#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \ + _MediaSpecificInfo, \ + _SizeMediaSpecificInfo) \ +{ \ + if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) \ + { \ + (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \ + (_MediaSpecificInfo); \ + ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \ + (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \ + (_SizeMediaSpecificInfo); \ + } \ +} + +/* + * VOID + * NdisSetPacketFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags) + +/* + * VOID + * NdisClearPacketFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags) + +/* + * VOID + * NdisQueryPacket( + * IN PNDIS_PACKET Packet, + * OUT PUINT PhysicalBufferCount OPTIONAL, + * OUT PUINT BufferCount OPTIONAL, + * OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, + * OUT PUINT TotalPacketLength OPTIONAL); + */ +static __inline +VOID +NdisQueryPacket( + IN PNDIS_PACKET Packet, + OUT PUINT PhysicalBufferCount OPTIONAL, + OUT PUINT BufferCount OPTIONAL, + OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, + OUT PUINT TotalPacketLength OPTIONAL) +{ + if (FirstBuffer) + *FirstBuffer = Packet->Private.Head; + if (TotalPacketLength || BufferCount || PhysicalBufferCount) { + if (!Packet->Private.ValidCounts) { + UINT Offset; + UINT PacketLength; + PNDIS_BUFFER NdisBuffer; + UINT PhysicalBufferCount = 0; + UINT TotalPacketLength = 0; + UINT Count = 0; + + for (NdisBuffer = Packet->Private.Head; + NdisBuffer != (PNDIS_BUFFER)NULL; + NdisBuffer = NdisBuffer->Next) { + PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer); + NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength); + TotalPacketLength += PacketLength; + Count++; + } + Packet->Private.PhysicalCount = PhysicalBufferCount; + Packet->Private.TotalLength = TotalPacketLength; + Packet->Private.Count = Count; + Packet->Private.ValidCounts = TRUE; + } + + if (PhysicalBufferCount) + *PhysicalBufferCount = Packet->Private.PhysicalCount; + + if (BufferCount) + *BufferCount = Packet->Private.Count; + + if (TotalPacketLength) + *TotalPacketLength = Packet->Private.TotalLength; + } +} + +/* + * VOID + * NdisQueryPacketLength( + * IN PNDIS_PACKET Packet, + * OUT PUINT PhysicalBufferCount OPTIONAL, + * OUT PUINT BufferCount OPTIONAL, + * OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, + * OUT PUINT TotalPacketLength OPTIONAL); + */ +#define NdisQueryPacketLength(_Packet, \ + _TotalPacketLength) \ +{ \ + if (!(_Packet)->Private.ValidCounts) { \ + NdisQueryPacket(_Packet, NULL, NULL, NULL, _TotalPacketLength); \ + } \ + else *(_TotalPacketLength) = (_Packet)->Private.TotalLength; \ +} + +#endif /* NDIS_LEGACY_DRIVER */ + +/* + * VOID + * NdisSetSendFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags) + +/* Memory management routines */ + +/* +NDISAPI +VOID +NTAPI +NdisCreateLookaheadBufferFromSharedMemory( + IN PVOID pSharedMemory, + IN UINT LookaheadLength, + OUT PVOID *pLookaheadBuffer); +*/ +#define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) ((*(_B)) = (_S)) + +NDISAPI +VOID +NTAPI +NdisDestroyLookaheadBufferFromSharedMemory( + IN PVOID pLookaheadBuffer); + +#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_PPC) + +/* + * VOID + * NdisMoveMappedMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveMappedMemory(Destination, Source, Length) \ + RtlCopyMemory(Destination, Source, Length) + +/* + * VOID + * NdisZeroMappedMemory( + * IN PVOID Destination, + * IN ULONG Length); + */ +#define NdisZeroMappedMemory(Destination, Length) \ + RtlZeroMemory(Destination, Length) + +#else + +#define NdisMoveMappedMemory(Destination, Source, Length) \ +{ \ + PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \ + while (_Dest < _End) \ + *_Dest++ = _Src++; \ +} + +#define NdisZeroMappedMemory(Destination, Length) \ +{ \ + PUCHAR _Dest = Destination, _End = _Dest + Length; \ + while (_Dest < _End) \ + *_Dest++ = 0; \ +} + +#endif /* _M_IX86 or _M_AMD64 */ + +/* + * VOID + * NdisMoveFromMappedMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveFromMappedMemory(Destination, Source, Length) \ + NdisMoveMappedMemory(Destination, Source, Length) + +/* + * VOID + * NdisMoveToMappedMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveToMappedMemory(Destination, Source, Length) \ + NdisMoveMappedMemory(Destination, Source, Length) + +/* + * VOID + * NdisMUpdateSharedMemory( + * IN NDIS_HANDLE MiniportAdapterHandle, + * IN ULONG Length, + * IN PVOID VirtualAddress, + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \ + NdisUpdateSharedMemory(_H, _L, _V, _P) + +NDISAPI +VOID +NTAPI +NdisFreeMemory( + IN PVOID VirtualAddress, + IN UINT Length, + IN UINT MemoryFlags); + +NDISAPI +VOID +NTAPI +NdisFreeMemoryWithTag( + IN PVOID VirtualAddress, + IN ULONG Tag); + +NDISAPI +VOID +NTAPI +NdisImmediateReadSharedMemory( + IN NDIS_HANDLE WrapperConfigurationContext, + IN ULONG SharedMemoryAddress, + OUT PUCHAR Buffer, + IN ULONG Length); + +NDISAPI +VOID +NTAPI +NdisImmediateWriteSharedMemory( + IN NDIS_HANDLE WrapperConfigurationContext, + IN ULONG SharedMemoryAddress, + IN PUCHAR Buffer, + IN ULONG Length); + +NDISAPI +VOID +NTAPI +NdisMAllocateSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMAllocateSharedMemoryAsync( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID Context); + +#if defined(NDIS50) + +#define NdisUpdateSharedMemory(NdisAdapterHandle, \ + Length, \ + VirtualAddress, \ + PhysicalAddress) + +#else + +NDISAPI +VOID +NTAPI +NdisUpdateSharedMemory( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG Length, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + +#endif /* defined(NDIS50) */ + +/* + * ULONG + * NdisGetPhysicalAddressHigh( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define NdisGetPhysicalAddressHigh(PhysicalAddress) \ + ((PhysicalAddress).HighPart) + +/* + * VOID + * NdisSetPhysicalAddressHigh( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + * IN ULONG Value); + */ +#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \ + ((PhysicalAddress).HighPart) = (Value) + +/* + * ULONG + * NdisGetPhysicalAddressLow( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define NdisGetPhysicalAddressLow(PhysicalAddress) \ + ((PhysicalAddress).LowPart) + + +/* + * VOID + * NdisSetPhysicalAddressLow( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + * IN ULONG Value); + */ +#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \ + ((PhysicalAddress).LowPart) = (Value) + +/* + * VOID + * NDIS_PHYSICAL_ADDRESS_CONST( + * IN ULONG Low, + * IN LONG High); + */ +#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High) \ + { {(ULONG)(Low), (LONG)(High)} } + +/* + * ULONG + * NdisEqualMemory( + * IN CONST VOID *Source1, + * IN CONST VOID *Source2, + * IN ULONG Length); + */ +#define NdisEqualMemory(Source1, Source2, Length) \ + RtlEqualMemory(Source1, Source2, Length) + +/* + * VOID + * NdisFillMemory( + * IN PVOID Destination, + * IN ULONG Length, + * IN UCHAR Fill); + */ +#define NdisFillMemory(Destination, Length, Fill) \ + RtlFillMemory(Destination, Length, Fill) + +/* + * VOID + * NdisMoveMemory( + * OUT PVOID Destination, + * IN PVOID Source, + * IN ULONG Length); + */ +#define NdisMoveMemory(Destination, Source, Length) \ + RtlCopyMemory(Destination, Source, Length) + + +/* + * VOID + * NdisRetrieveUlong( + * IN PULONG DestinationAddress, + * IN PULONG SourceAddress); + */ +#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \ + RtlRetrieveUlong(DestinationAddress, SourceAddress) + + +/* + * VOID + * NdisStoreUlong( + * IN PULONG DestinationAddress, + * IN ULONG Value); + */ +#define NdisStoreUlong(DestinationAddress, Value) \ + RtlStoreUlong(DestinationAddress, Value) + + +/* + * VOID + * NdisZeroMemory( + * IN PVOID Destination, + * IN ULONG Length) + */ +#define NdisZeroMemory(Destination, Length) \ + RtlZeroMemory(Destination, Length) + +typedef VOID +(NTAPI *NDIS_BLOCK_INITIALIZER) ( + IN PUCHAR Block, + IN SIZE_T NumberOfBytes + ); + +/* Configuration routines */ + +#if NDIS_LEGACY_DRIVER +NDISAPI +VOID +NTAPI +NdisOpenConfiguration( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE ConfigurationHandle, + IN NDIS_HANDLE WrapperConfigurationContext); +#endif + +NDISAPI +VOID +NTAPI +NdisReadNetworkAddress( + OUT PNDIS_STATUS Status, + OUT PVOID *NetworkAddress, + OUT PUINT NetworkAddressLength, + IN NDIS_HANDLE ConfigurationHandle); + +NDISAPI +VOID +NTAPI +NdisReadEisaSlotInformation( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + OUT PUINT SlotNumber, + OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData); + +NDISAPI +VOID +NTAPI +NdisReadEisaSlotInformationEx( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + OUT PUINT SlotNumber, + OUT PNDIS_EISA_FUNCTION_INFORMATION *EisaData, + OUT PUINT NumberOfFunctions); + +#if NDIS_LEGACY_MINIPORT + +NDISAPI +ULONG +NTAPI +NdisReadPciSlotInformation( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG SlotNumber, + IN ULONG Offset, + OUT PVOID Buffer, + IN ULONG Length); + +NDISAPI +ULONG +NTAPI +NdisWritePciSlotInformation( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG SlotNumber, + IN ULONG Offset, + IN PVOID Buffer, + IN ULONG Length); + +NDISAPI +ULONG +NTAPI +NdisReadPcmciaAttributeMemory( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG Offset, + OUT PVOID Buffer, + IN ULONG Length); + +NDISAPI +ULONG +NTAPI +NdisWritePcmciaAttributeMemory( + IN NDIS_HANDLE NdisAdapterHandle, + IN ULONG Offset, + IN PVOID Buffer, + IN ULONG Length); + +#endif /* NDIS_LEGACY_MINIPORT */ + +/* String management routines */ + +/* +NDISAPI +NDIS_STATUS +NTAPI +NdisAnsiStringToUnicodeString( + IN OUT PNDIS_STRING DestinationString, + IN PNDIS_ANSI_STRING SourceString); +*/ +#define NdisAnsiStringToUnicodeString(_us, _as) RtlAnsiStringToUnicodeString(_us, _as, FALSE) + +/* + * BOOLEAN + * NdisEqualString( + * IN PNDIS_STRING String1, + * IN PNDIS_STRING String2, + * IN BOOLEAN CaseInsensitive); + */ +#define NdisEqualString RtlEqualString + +#define NdisEqualUnicodeString RtlEqualUnicodeString + +/* +NDISAPI +VOID +NTAPI +NdisInitAnsiString( + IN OUT PNDIS_ANSI_STRING DestinationString, + IN PCSTR SourceString); +*/ +#define NdisInitAnsiString RtlInitString + +NDISAPI +VOID +NTAPI +NdisInitUnicodeString( + IN OUT PNDIS_STRING DestinationString, + IN PCWSTR SourceString); + +/* +NDISAPI +NDIS_STATUS +NTAPI +NdisUnicodeStringToAnsiString( + IN OUT PNDIS_ANSI_STRING DestinationString, + IN PNDIS_STRING SourceString); +*/ +#define NdisUnicodeStringToAnsiString(_as, _us) RtlUnicodeStringToAnsiString(_as, _us, FALSE) + +#define NdisFreeString(_s) NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0) +#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer) + +/* Spin lock reoutines */ + +/* +NDISAPI +VOID +NTAPI +NdisAllocateSpinLock( + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock) + +/* +NDISAPI +VOID +NTAPI +NdisFreeSpinLock( + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisFreeSpinLock(_SpinLock) + +/* +NDISAPI +VOID +NTAPI +NdisAcquireSpinLock( + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql) + +/* +NDISAPI +VOID +NTAPI +NdisReleaseSpinLock( + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql) + +/* +NDISAPI +VOID +NTAPI +NdisDprAcquireSpinLock( + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock) + +/* +NDISAPI +VOID +NTAPI +NdisDprReleaseSpinLock( + IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock) + +/* I/O routines */ + +/* + * VOID + * NdisRawReadPortBufferUchar( + * IN ULONG Port, + * OUT PUCHAR Buffer, + * IN ULONG Length); + */ +#define NdisRawReadPortBufferUchar(Port, Buffer, Length) \ + READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length)) + +/* + * VOID + * NdisRawReadPortBufferUlong( + * IN ULONG Port, + * OUT PULONG Buffer, + * IN ULONG Length); + */ +#define NdisRawReadPortBufferUlong(Port, Buffer, Length) \ + READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length)) + +/* + * VOID + * NdisRawReadPortBufferUshort( + * IN ULONG Port, + * OUT PUSHORT Buffer, + * IN ULONG Length); + */ +#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \ + READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length)) + +/* + * VOID + * NdisRawReadPortUchar( + * IN ULONG Port, + * OUT PUCHAR Data); + */ +#define NdisRawReadPortUchar(Port, Data) \ + *(Data) = READ_PORT_UCHAR((PUCHAR)(Port)) + +/* + * VOID + * NdisRawReadPortUlong( + * IN ULONG Port, + * OUT PULONG Data); + */ +#define NdisRawReadPortUlong(Port, Data) \ + *(Data) = READ_PORT_ULONG((PULONG)(Port)) + +/* + * VOID + * NdisRawReadPortUshort( + * IN ULONG Port, + * OUT PUSHORT Data); + */ +#define NdisRawReadPortUshort(Port, Data) \ + *(Data) = READ_PORT_USHORT((PUSHORT)(Port)) + +/* + * VOID + * NdisRawWritePortBufferUchar( + * IN ULONG Port, + * IN PUCHAR Buffer, + * IN ULONG Length); + */ +#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \ + WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length)) + +/* + * VOID + * NdisRawWritePortBufferUlong( + * IN ULONG Port, + * IN PULONG Buffer, + * IN ULONG Length); + */ +#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \ + WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length)) + +/* + * VOID + * NdisRawWritePortBufferUshort( + * IN ULONG Port, + * IN PUSHORT Buffer, + * IN ULONG Length); + */ +#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \ + WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length)) + +/* + * VOID + * NdisRawWritePortUchar( + * IN ULONG Port, + * IN UCHAR Data); + */ +#define NdisRawWritePortUchar(Port, Data) \ + WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data)) + +/* + * VOID + * NdisRawWritePortUlong( + * IN ULONG Port, + * IN ULONG Data); + */ +#define NdisRawWritePortUlong(Port, Data) \ + WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data)) + +/* + * VOID + * NdisRawWritePortUshort( + * IN ULONG Port, + * IN USHORT Data); + */ +#define NdisRawWritePortUshort(Port, Data) \ + WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data)) + + +/* + * VOID + * NdisReadRegisterUchar( + * IN PUCHAR Register, + * OUT PUCHAR Data); + */ +#define NdisReadRegisterUchar(Register, Data) \ + *(Data) = *(Register) + +/* + * VOID + * NdisReadRegisterUlong( + * IN PULONG Register, + * OUT PULONG Data); + */ +#define NdisReadRegisterUlong(Register, Data) \ + *(Data) = *(Register) + +/* + * VOID + * NdisReadRegisterUshort( + * IN PUSHORT Register, + * OUT PUSHORT Data); + */ +#define NdisReadRegisterUshort(Register, Data) \ + *(Data) = *(Register) + +/* + * VOID + * NdisReadRegisterUchar( + * IN PUCHAR Register, + * IN UCHAR Data); + */ +#define NdisWriteRegisterUchar(Register, Data) \ + WRITE_REGISTER_UCHAR((Register), (Data)) + +/* + * VOID + * NdisReadRegisterUlong( + * IN PULONG Register, + * IN ULONG Data); + */ +#define NdisWriteRegisterUlong(Register, Data) \ + WRITE_REGISTER_ULONG((Register), (Data)) + +/* + * VOID + * NdisReadRegisterUshort( + * IN PUSHORT Register, + * IN USHORT Data); + */ +#define NdisWriteRegisterUshort(Register, Data) \ + WRITE_REGISTER_USHORT((Register), (Data)) + + +/* Linked lists */ + +/* + * VOID + * NdisInitializeListHead( + * IN PLIST_ENTRY ListHead); + */ +#define NdisInitializeListHead InitializeListHead + +/* + * PLIST_ENTRY + * NdisInterlockedInsertHeadList( + * IN PLIST_ENTRY ListHead, + * IN PLIST_ENTRY ListEntry, + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \ + ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) + +/* + * PLIST_ENTRY + * NdisInterlockedInsertTailList( + * IN PLIST_ENTRY ListHead, + * IN PLIST_ENTRY ListEntry, + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \ + ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) + +/* + * PLIST_ENTRY + * NdisInterlockedRemoveHeadList( + * IN PLIST_ENTRY ListHead, + * IN PNDIS_SPIN_LOCK SpinLock); +*/ +#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \ + ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock) + +/* + * VOID + * NdisInitializeSListHead( + * IN PSLIST_HEADER SListHead); + */ +#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead) + +/* + * USHORT NdisQueryDepthSList( + * IN PSLIST_HEADER SListHead); + */ +#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead) + +#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \ + ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock) + +#define NdisInterlockedPopEntryList(ListHead, Lock) \ + ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock) + +/* Non-paged lookaside lists */ + +#define NdisInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D) \ + ExInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D) +#define NdisDeleteNPagedLookasideList(_L) ExDeleteNPagedLookasideList(_L) +#define NdisAllocateFromNPagedLookasideList(_L) ExAllocateFromNPagedLookasideList(_L) +#define NdisFreeToNPagedLookasideList(_L, _E) ExFreeToNPagedLookasideList(_L, _E) + +/* Interlocked routines */ + +/* + * LONG + * NdisInterlockedDecrement( + * IN PLONG Addend); + */ +#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend) + +/* + * LONG + * NdisInterlockedIncrement( + * IN PLONG Addend); + */ +#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend) + +/* + * VOID + * NdisInterlockedAddUlong( + * IN PULONG Addend, + * IN ULONG Increment, + * IN PNDIS_SPIN_LOCK SpinLock); + */ +#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \ + ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock) + +/* Miscellaneous routines */ + +NDISAPI +VOID +NTAPI +NdisCloseConfiguration( + IN NDIS_HANDLE ConfigurationHandle); + +NDISAPI +VOID +NTAPI +NdisReadConfiguration( + OUT PNDIS_STATUS Status, + OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue, + IN NDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING Keyword, + IN NDIS_PARAMETER_TYPE ParameterType); + +NDISAPI +VOID +NTAPI +NdisWriteConfiguration( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + IN PNDIS_STRING Keyword, + IN PNDIS_CONFIGURATION_PARAMETER ParameterValue); + +NDISAPI +VOID +__cdecl +NdisWriteErrorLogEntry( + IN NDIS_HANDLE NdisAdapterHandle, + IN NDIS_ERROR_CODE ErrorCode, + IN ULONG NumberOfErrorValues, + IN ...); + +NDISAPI +VOID +NTAPI +NdisInitializeString( + OUT PNDIS_STRING Destination, + IN PUCHAR Source); + +/* + * VOID + * NdisStallExecution( + * IN UINT MicrosecondsToStall) + */ +#define NdisStallExecution KeStallExecutionProcessor + +/* +NDISAPI +VOID +NTAPI +NdisGetCurrentSystemTime( + IN PLARGE_INTEGER pSystemTime); +*/ +#define NdisGetCurrentSystemTime KeQuerySystemTime + +#if NDIS_SUPPORT_60_COMPATIBLE_API +NDISAPI +CCHAR +NTAPI +NdisSystemProcessorCount(VOID); +#endif + +NDISAPI +VOID +NTAPI +NdisGetCurrentProcessorCpuUsage( + OUT PULONG pCpuUsage); + +/* NDIS helper macros */ + +/* + * VOID + * NDIS_INIT_FUNCTION(FunctionName) + */ +#define NDIS_INIT_FUNCTION(FunctionName) \ + alloc_text(init, FunctionName) + +/* + * VOID + * NDIS_PAGABLE_FUNCTION(FunctionName) + */ +#define NDIS_PAGEABLE_FUNCTION(FunctionName) \ + alloc_text(page, FunctionName) + +#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION + + +/* NDIS 4.0 extensions */ + +NDISAPI +VOID +NTAPI +NdisMFreeSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + +NDISAPI +VOID +NTAPI +NdisMWanIndicateReceive( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisLinkContext, + IN PUCHAR PacketBuffer, + IN UINT PacketSize); + +NDISAPI +VOID +NTAPI +NdisMWanIndicateReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +VOID +NTAPI +NdisMWanSendComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_WAN_PACKET Packet, + IN NDIS_STATUS Status); + +NDISAPI +NDIS_STATUS +NTAPI +NdisPciAssignResources( + IN NDIS_HANDLE NdisMacHandle, + IN NDIS_HANDLE NdisWrapperHandle, + IN NDIS_HANDLE WrapperConfigurationContext, + IN ULONG SlotNumber, + OUT PNDIS_RESOURCE_LIST *AssignedResources); + + +/* NDIS 5.0 extensions */ + +NDISAPI +NDIS_STATUS +NTAPI +NdisAllocateMemoryWithTag( + OUT PVOID *VirtualAddress, + IN UINT Length, + IN ULONG Tag); + +NDISAPI +VOID +NTAPI +NdisCompletePnPEvent( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNET_PNP_EVENT NetPnPEvent); + +NDISAPI +VOID +NTAPI +NdisGetCurrentProcessorCounts( + OUT PULONG pIdleCount, + OUT PULONG pKernelAndUser, + OUT PULONG pIndex); + +NDISAPI +VOID +NTAPI +NdisGetDriverHandle( + IN PNDIS_HANDLE NdisBindingHandle, + OUT PNDIS_HANDLE NdisDriverHandle); + +NDISAPI +PNDIS_PACKET +NTAPI +NdisGetReceivedPacket( + IN PNDIS_HANDLE NdisBindingHandle, + IN PNDIS_HANDLE MacContext); + +#if NDIS_LEGACY_DRIVER +NDISAPI +VOID +NTAPI +NdisGetSystemUpTime( + OUT PULONG pSystemUpTime); +#endif + +#if NDIS_SUPPORT_60_COMPATIBLE_API + +NDISAPI +VOID +NTAPI +NdisAcquireReadWriteLock( + IN OUT PNDIS_RW_LOCK Lock, + IN BOOLEAN fWrite, + OUT PLOCK_STATE LockState); + +NDISAPI +VOID +NTAPI +NdisInitializeReadWriteLock( + OUT PNDIS_RW_LOCK Lock); + +NDISAPI +VOID +NTAPI +NdisReleaseReadWriteLock( + IN OUT PNDIS_RW_LOCK Lock, + IN PLOCK_STATE LockState); + +#if NDIS_SUPPORT_NDIS6 + +NDISAPI +VOID +NTAPI +NdisDprAcquireReadWriteLock( + IN PNDIS_RW_LOCK Lock, + IN BOOLEAN fWrite, + IN PLOCK_STATE LockState); + +NDISAPI +VOID +NTAPI +NdisDprReleaseReadWriteLock( + IN PNDIS_RW_LOCK Lock, + IN PLOCK_STATE LockState); + +#endif /* NDIS_SUPPORT_NDIS6 */ + +#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */ + +NDISAPI +NDIS_STATUS +NTAPI +NdisMDeregisterDevice( + IN NDIS_HANDLE NdisDeviceHandle); + +NDISAPI +VOID +NTAPI +NdisMGetDeviceProperty( + IN NDIS_HANDLE MiniportAdapterHandle, + IN OUT PDEVICE_OBJECT *PhysicalDeviceObject OPTIONAL, + IN OUT PDEVICE_OBJECT *FunctionalDeviceObject OPTIONAL, + IN OUT PDEVICE_OBJECT *NextDeviceObject OPTIONAL, + IN OUT PCM_RESOURCE_LIST *AllocatedResources OPTIONAL, + IN OUT PCM_RESOURCE_LIST *AllocatedResourcesTranslated OPTIONAL); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMInitializeScatterGatherDma( + IN NDIS_HANDLE MiniportAdapterHandle, + IN BOOLEAN Dma64BitAddresses, + IN ULONG MaximumPhysicalMapping); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMPromoteMiniport( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMQueryAdapterInstanceName( + OUT PNDIS_STRING AdapterInstanceName, + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMRegisterDevice( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_STRING DeviceName, + IN PNDIS_STRING SymbolicName, + IN PDRIVER_DISPATCH MajorFunctions[], + OUT PDEVICE_OBJECT *pDeviceObject, + OUT NDIS_HANDLE *NdisDeviceHandle); + +NDISAPI +VOID +NTAPI +NdisMRegisterUnloadHandler( + IN NDIS_HANDLE NdisWrapperHandle, + IN PDRIVER_UNLOAD UnloadHandler); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMRemoveMiniport( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMSetMiniportSecondary( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE PrimaryMiniportAdapterHandle); + +NDISAPI +VOID +NTAPI +NdisOpenConfigurationKeyByIndex( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ConfigurationHandle, + IN ULONG Index, + OUT PNDIS_STRING KeyName, + OUT PNDIS_HANDLE KeyHandle); + +NDISAPI +VOID +NTAPI +NdisOpenConfigurationKeyByName( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING SubKeyName, + OUT PNDIS_HANDLE SubKeyHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisQueryAdapterInstanceName( + OUT PNDIS_STRING AdapterInstanceName, + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisWriteEventLogEntry( + IN PVOID LogHandle, + IN NDIS_STATUS EventCode, + IN ULONG UniqueEventValue, + IN USHORT NumStrings, + IN PVOID StringsList OPTIONAL, + IN ULONG DataSize, + IN PVOID Data OPTIONAL); + +/* Connectionless services */ + +NDISAPI +NDIS_STATUS +NTAPI +NdisClAddParty( + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE ProtocolPartyContext, + IN OUT PCO_CALL_PARAMETERS CallParameters, + OUT PNDIS_HANDLE NdisPartyHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClCloseAddressFamily( + IN NDIS_HANDLE NdisAfHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClCloseCall( + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClDeregisterSap( + IN NDIS_HANDLE NdisSapHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClDropParty( + IN NDIS_HANDLE NdisPartyHandle, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +VOID +NTAPI +NdisClIncomingCallComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClMakeCall( + IN NDIS_HANDLE NdisVcHandle, + IN OUT PCO_CALL_PARAMETERS CallParameters, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, + OUT PNDIS_HANDLE NdisPartyHandle OPTIONAL); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClModifyCallQoS( + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + + +NDISAPI +NDIS_STATUS +NTAPI +NdisClOpenAddressFamily( + IN NDIS_HANDLE NdisBindingHandle, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN NDIS_HANDLE ProtocolAfContext, + IN PNDIS_CLIENT_CHARACTERISTICS ClCharacteristics, + IN UINT SizeOfClCharacteristics, + OUT PNDIS_HANDLE NdisAfHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisClRegisterSap( + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE ProtocolSapContext, + IN PCO_SAP Sap, + OUT PNDIS_HANDLE NdisSapHandle); + + +/* Call Manager services */ + +NDISAPI +NDIS_STATUS +NTAPI +NdisCmActivateVc( + IN NDIS_HANDLE NdisVcHandle, + IN OUT PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisCmAddPartyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisPartyHandle, + IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisCmCloseAddressFamilyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisAfHandle); + +NDISAPI +VOID +NTAPI +NdisCmCloseCallComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL); + +NDISAPI +NDIS_STATUS +NTAPI +NdisCmDeactivateVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +VOID +NTAPI +NdisCmDeregisterSapComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisSapHandle); + +NDISAPI +VOID +NTAPI +NdisCmDispatchCallConnected( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisCmDispatchIncomingCall( + IN NDIS_HANDLE NdisSapHandle, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisCmDispatchIncomingCallQoSChange( + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisCmDispatchIncomingCloseCall( + IN NDIS_STATUS CloseStatus, + IN NDIS_HANDLE NdisVcHandle, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +VOID +NTAPI +NdisCmDispatchIncomingDropParty( + IN NDIS_STATUS DropStatus, + IN NDIS_HANDLE NdisPartyHandle, + IN PVOID Buffer OPTIONAL, + IN UINT Size); + +NDISAPI +VOID +NTAPI +NdisCmDropPartyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisPartyHandle); + +NDISAPI +VOID +NTAPI +NdisCmMakeCallComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisCmModifyCallQoSComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisCmOpenAddressFamilyComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE CallMgrAfContext); + +NDISAPI +NDIS_STATUS +NTAPI +NdisCmRegisterAddressFamily( + IN NDIS_HANDLE NdisBindingHandle, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, + IN UINT SizeOfCmCharacteristics); + +NDISAPI +VOID +NTAPI +NdisCmRegisterSapComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisSapHandle, + IN NDIS_HANDLE CallMgrSapContext); + + +NDISAPI +NDIS_STATUS +NTAPI +NdisMCmActivateVc( + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMCmCreateVc( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE MiniportVcContext, + OUT PNDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMCmDeactivateVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMCmDeleteVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMCmRegisterAddressFamily( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PCO_ADDRESS_FAMILY AddressFamily, + IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, + IN UINT SizeOfCmCharacteristics); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMCmRequest( + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + + +/* Connection-oriented services */ + +NDISAPI +NDIS_STATUS +NTAPI +NdisCoCreateVc( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE NdisAfHandle OPTIONAL, + IN NDIS_HANDLE ProtocolVcContext, + IN OUT PNDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisCoDeleteVc( + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisCoRequest( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE NdisAfHandle OPTIONAL, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + +NDISAPI +VOID +NTAPI +NdisCoRequestComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisAfHandle, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_HANDLE NdisPartyHandle OPTIONAL, + IN PNDIS_REQUEST NdisRequest); + +NDISAPI +VOID +NTAPI +NdisCoSendPackets( + IN NDIS_HANDLE NdisVcHandle, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +NDISAPI +VOID +NTAPI +NdisMCoActivateVcComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PCO_CALL_PARAMETERS CallParameters); + +NDISAPI +VOID +NTAPI +NdisMCoDeactivateVcComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle); + +NDISAPI +VOID +NTAPI +NdisMCoIndicateReceivePacket( + IN NDIS_HANDLE NdisVcHandle, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +NDISAPI +VOID +NTAPI +NdisMCoIndicateStatus( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE NdisVcHandle OPTIONAL, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer OPTIONAL, + IN ULONG StatusBufferSize); + +NDISAPI +VOID +NTAPI +NdisMCoReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +VOID +NTAPI +NdisMCoRequestComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_REQUEST Request); + +NDISAPI +VOID +NTAPI +NdisMCoSendComplete( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisVcHandle, + IN PNDIS_PACKET Packet); + + +/* NDIS 5.0 extensions for intermediate drivers */ + +NDISAPI +VOID +NTAPI +NdisIMAssociateMiniport( + IN NDIS_HANDLE DriverHandle, + IN NDIS_HANDLE ProtocolHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisIMCancelInitializeDeviceInstance( + IN NDIS_HANDLE DriverHandle, + IN PNDIS_STRING DeviceInstance); + +NDISAPI +VOID +NTAPI +NdisIMCopySendCompletePerPacketInfo( + IN PNDIS_PACKET DstPacket, + IN PNDIS_PACKET SrcPacket); + +NDISAPI +VOID +NTAPI +NdisIMCopySendPerPacketInfo( + IN PNDIS_PACKET DstPacket, + IN PNDIS_PACKET SrcPacket); + +NDISAPI +VOID +NTAPI +NdisIMDeregisterLayeredMiniport( + IN NDIS_HANDLE DriverHandle); + +NDISAPI +NDIS_HANDLE +NTAPI +NdisIMGetBindingContext( + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +NDIS_HANDLE +NTAPI +NdisIMGetDeviceContext( + IN NDIS_HANDLE MiniportAdapterHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisIMInitializeDeviceInstanceEx( + IN NDIS_HANDLE DriverHandle, + IN PNDIS_STRING DriverInstance, + IN NDIS_HANDLE DeviceContext OPTIONAL); + +/* +NDISAPI +PSINGLE_LIST_ENTRY +NTAPI +NdisInterlockedPopEntrySList( + IN PSLIST_HEADER ListHead, + IN PKSPIN_LOCK Lock); +*/ +#define NdisInterlockedPopEntrySList(SListHead, Lock) \ + ExInterlockedPopEntrySList(SListHead, &(Lock)->SpinLock) + +/* +NDISAPI +PSINGLE_LIST_ENTRY +NTAPI +NdisInterlockedPushEntrySList( + IN PSLIST_HEADER ListHead, + IN PSINGLE_LIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock); +*/ +#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock) \ + ExInterlockedPushEntrySList(SListHead, SListEntry, &(Lock)->SpinLock) + +#define NdisInterlockedFlushSList(SListHead) ExInterlockedFlushSList(SListHead) + +/* +NDISAPI +VOID +NTAPI +NdisQueryBufferSafe( + IN PNDIS_BUFFER Buffer, + OUT PVOID *VirtualAddress OPTIONAL, + OUT PUINT Length, + IN UINT Priority); +*/ +#define NdisQueryBufferSafe(_Buffer, _VirtualAddress, _Length, _Priority) { \ + if (ARGUMENT_PRESENT(_VirtualAddress)) { \ + *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \ + } \ + *(_Length) = MmGetMdlByteCount(_Buffer); \ +} + /* Routines for NDIS miniport drivers */ #if NDIS_SUPPORT_NDIS6 @@ -5467,36 +5693,32 @@ NdisMUnmapIoSpace( IN PVOID VirtualAddress, IN UINT Length); - - /* Event functions */ NDISAPI VOID NTAPI NdisInitializeEvent( - IN PNDIS_EVENT Event); + OUT PNDIS_EVENT Event); NDISAPI VOID NTAPI NdisSetEvent( - IN PNDIS_EVENT Event); + IN PNDIS_EVENT Event); NDISAPI VOID NTAPI NdisResetEvent( - IN PNDIS_EVENT Event); + IN PNDIS_EVENT Event); NDISAPI BOOLEAN NTAPI NdisWaitEvent( - IN PNDIS_EVENT Event, - IN UINT Timeout); - - + IN PNDIS_EVENT Event, + IN UINT Timeout); /* NDIS intermediate miniport structures */ @@ -5504,8 +5726,6 @@ typedef VOID (NTAPI *W_MINIPORT_CALLBACK)( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID CallbackContext); - - /* Routines for intermediate miniport drivers */ NDISAPI @@ -5552,12 +5772,15 @@ NdisSetupDmaTransfer( IN ULONG Length, IN BOOLEAN WriteToDevice); +/* NDISAPI NTSTATUS NTAPI NdisUpcaseUnicodeString( - OUT PUNICODE_STRING DestinationString, - IN PUNICODE_STRING SourceString); + OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString); +*/ +#define NdisUpcaseUnicodeString(_d, _s) RtlUpcaseUnicodeString(_d, _s, FALSE) /* Routines for NDIS protocol drivers */ @@ -5667,12 +5890,6 @@ NdisRegisterProtocol( IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, IN UINT CharacteristicsLength); -NDISAPI -NDIS_STATUS -NTAPI -NdisScheduleWorkItem( - IN PNDIS_WORK_ITEM WorkItem); - /* Obsoleted in Windows XP */ /* Prototypes for NDIS_MAC_CHARACTERISTICS */ From 3d5cb94c4af4329a699e4f460baf8350d655b40e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 23 Jul 2010 16:34:35 +0000 Subject: [PATCH 60/82] [NDIS] - Verify that each adapter has been initialized before passing it to the protocol's BindAdapter function - Also verify that each adapter has not already been bound to the protocol - Miniport drivers can now function without a reboot (needed to use 3rd-party NIC drivers on the live CD) svn path=/trunk/; revision=48212 --- .../drivers/network/ndis/include/protocol.h | 2 +- reactos/drivers/network/ndis/ndis/miniport.c | 2 +- reactos/drivers/network/ndis/ndis/protocol.c | 56 +++++++++++++++++-- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/network/ndis/include/protocol.h b/reactos/drivers/network/ndis/include/protocol.h index 171ecb6a4f2..a2fd5289e73 100644 --- a/reactos/drivers/network/ndis/include/protocol.h +++ b/reactos/drivers/network/ndis/include/protocol.h @@ -71,6 +71,6 @@ proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet); VOID NTAPI -ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics); +ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PPROTOCOL_BINDING Protocol); /* EOF */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index b1ca384cd8d..bfe41237f4d 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -2064,7 +2064,7 @@ NdisIPnPStartDevice( { ProtocolBinding = CONTAINING_RECORD(CurrentEntry, PROTOCOL_BINDING, ListEntry); - ndisBindMiniportsToProtocol(&NdisStatus, &ProtocolBinding->Chars); + ndisBindMiniportsToProtocol(&NdisStatus, ProtocolBinding); CurrentEntry = CurrentEntry->Flink; } diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index 381739165e4..f41017b1035 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -865,9 +865,39 @@ NdisOpenAdapter( *Status = NDIS_STATUS_SUCCESS; } +PADAPTER_BINDING +NTAPI +LocateAdapterBindingByName(IN PPROTOCOL_BINDING ProtocolBinding, IN PNDIS_STRING AdapterName) +{ + PLIST_ENTRY CurrentEntry; + PADAPTER_BINDING AdapterBinding; + KIRQL OldIrql; + + KeAcquireSpinLock(&ProtocolBinding->Lock, &OldIrql); + + CurrentEntry = ProtocolBinding->AdapterListHead.Flink; + + while (CurrentEntry != &ProtocolBinding->AdapterListHead) + { + AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, ProtocolListEntry); + + if (RtlCompareUnicodeString(AdapterName, &AdapterBinding->Adapter->NdisMiniportBlock.MiniportName, TRUE) == 0) + { + KeReleaseSpinLock(&ProtocolBinding->Lock, OldIrql); + return AdapterBinding; + } + + CurrentEntry = CurrentEntry->Flink; + } + + KeReleaseSpinLock(&ProtocolBinding->Lock, OldIrql); + + return NULL; +} + VOID NTAPI -ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics) +ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PPROTOCOL_BINDING Protocol) { /* * bind the protocol to all of its miniports @@ -883,6 +913,7 @@ ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTER WCHAR *DataPtr; HANDLE DriverKeyHandle = NULL; PKEY_VALUE_PARTIAL_INFORMATION KeyInformation = NULL; + PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics = &Protocol->Chars; RegistryPathStr = ExAllocatePoolWithTag(PagedPool, sizeof(SERVICES_KEY) + ProtocolCharacteristics->Name.Length + sizeof(LINKAGE_KEY), NDIS_TAG + __LINE__); if(!RegistryPathStr) @@ -952,6 +983,9 @@ ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTER } } + /* Assume success for now */ + *Status = NDIS_STATUS_SUCCESS; + for (DataPtr = (WCHAR *)KeyInformation->Data; *DataPtr != 0; DataPtr += wcslen(DataPtr) + 1) @@ -965,6 +999,20 @@ ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTER RtlInitUnicodeString(&DeviceName, DataPtr); /* we know this is 0-term */ + /* Make sure the adapter has started */ + if (!MiniLocateDevice(&DeviceName)) + { + /* It wasn't in the global miniport list, so skip the bind entry */ + continue; + } + + /* Make sure this device isn't already bound to this protocol */ + if (LocateAdapterBindingByName(Protocol, &DeviceName)) + { + /* It was already in this protocol's bound adapter list, so skip the bind entry */ + continue; + } + /* * RegistryPath should be: * \Registry\Machine\System\CurrentControlSet\Services\Nic1\Parameters\Tcpip @@ -1011,7 +1059,6 @@ ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PNDIS_PROTOCOL_CHARACTER } } - *Status = NDIS_STATUS_SUCCESS; ExFreePool(KeyInformation); } @@ -1111,7 +1158,7 @@ NdisRegisterProtocol( *NdisProtocolHandle = Protocol; - ndisBindMiniportsToProtocol(Status, &Protocol->Chars); + ndisBindMiniportsToProtocol(Status, Protocol); /* Should we only send this if ndisBindMiniportsToProtocol succeeds? */ PnPEvent = ProSetupPnPEvent(NetEventBindsComplete, NULL, 0); @@ -1252,10 +1299,9 @@ VOID NTAPI NdisReEnumerateProtocolBindings(IN NDIS_HANDLE NdisProtocolHandle) { - PPROTOCOL_BINDING Protocol = NdisProtocolHandle; NDIS_STATUS NdisStatus; - ndisBindMiniportsToProtocol(&NdisStatus, &Protocol->Chars); + ndisBindMiniportsToProtocol(&NdisStatus, NdisProtocolHandle); } From 00e8981795c962f860e411ab2841e2feb532123c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 23 Jul 2010 21:57:08 +0000 Subject: [PATCH 61/82] [DHCPCSVC] - Generate a link-local IP address if DHCP fails - Don't destroy the IP addresses in the registry svn path=/trunk/; revision=48213 --- reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c | 18 ++++++++++++++---- reactos/dll/win32/dhcpcsvc/include/rosdhcp.h | 6 +++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c b/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c index a27c7b667ad..3b60e1ad95d 100644 --- a/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c +++ b/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c @@ -574,8 +574,6 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { strcat(Buffer, "."); } RegSetValueExA(hkey, "DhcpSubnetMask", 0, REG_SZ, (LPBYTE)Buffer, strlen(Buffer)+1); - RegSetValueExA(hkey, "IPAddress", 0, REG_SZ, (LPBYTE)"0.0.0.0", 8); - RegSetValueExA(hkey, "SubnetMask", 0, REG_SZ, (LPBYTE)"0.0.0.0", 8); dwEnableDHCP = 1; RegSetValueExA(hkey, "EnableDHCP", 0, REG_DWORD, (LPBYTE)&dwEnableDHCP, sizeof(DWORD)); } @@ -614,7 +612,6 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { strcat(Buffer, "."); } RegSetValueExA(hkey, "DhcpDefaultGateway", 0, REG_SZ, (LPBYTE)Buffer, strlen(Buffer)+1); - RegSetValueExA(hkey, "DefaultGateway", 0, REG_SZ, (LPBYTE)"0.0.0.0", 8); } } @@ -1103,6 +1100,7 @@ void state_panic(void *ipp) { struct interface_info *ip = ipp; + PDHCP_ADAPTER Adapter = AdapterFindInfo(ip); time_t cur_time; time(&cur_time); @@ -1113,7 +1111,19 @@ state_panic(void *ipp) ip->client->state = S_INIT; add_timeout(cur_time + ip->client->config->retry_interval, state_init, ip); - /* XXX Take any failure actions necessary */ + + if (!Adapter->NteContext) + { + /* Generate an automatic private address */ + DbgPrint("DHCPCSVC: Failed to receive a response from a DHCP server. An automatic private address will be assigned.\n"); + + /* FIXME: The address generation code sucks */ + AddIPAddress(htonl(0xA9FE0000 | (rand() % 0xFFFF)), //169.254.X.X + htonl(0xFFFF0000), //255.255.0.0 + Adapter->IfMib.dwIndex, + &Adapter->NteContext, + &Adapter->NteInstance); + } } void diff --git a/reactos/dll/win32/dhcpcsvc/include/rosdhcp.h b/reactos/dll/win32/dhcpcsvc/include/rosdhcp.h index 8f8418690e1..09539de42bc 100644 --- a/reactos/dll/win32/dhcpcsvc/include/rosdhcp.h +++ b/reactos/dll/win32/dhcpcsvc/include/rosdhcp.h @@ -18,9 +18,9 @@ #undef IGNORE #undef ACCEPT #undef PREFER -#define DHCP_DISCOVER_INTERVAL 15 -#define DHCP_REBOOT_TIMEOUT 300 -#define DHCP_PANIC_TIMEOUT DHCP_REBOOT_TIMEOUT * 3 +#define DHCP_DISCOVER_INTERVAL 5 +#define DHCP_REBOOT_TIMEOUT 10 +#define DHCP_PANIC_TIMEOUT 20 #define DHCP_BACKOFF_MAX 300 #define DHCP_DEFAULT_LEASE_TIME 43200 /* 12 hours */ #define _PATH_DHCLIENT_PID "\\systemroot\\system32\\drivers\\etc\\dhclient.pid" From 63dfd0ccaa123e21d51bd958c96a558579fdc05a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 23 Jul 2010 22:30:27 +0000 Subject: [PATCH 62/82] [NETCFGX] - Create the DhcpEnabled value in the registry [TCPIP] - Apply the static IP address configuration data [DHCPCSVC] - Remove the static IP address code svn path=/trunk/; revision=48215 --- reactos/dll/win32/dhcpcsvc/dhcp/adapter.c | 70 ++++-------- reactos/dll/win32/netcfgx/netcfgx.c | 9 +- reactos/drivers/network/tcpip/datalink/lan.c | 111 ++++++++++++++++++- 3 files changed, 138 insertions(+), 52 deletions(-) diff --git a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c index 075e080026a..ad18dfa4976 100644 --- a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c +++ b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c @@ -102,7 +102,8 @@ HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) { "SYSTEM\\CurrentControlSet\\Control\\Class\\" "{4D36E972-E325-11CE-BFC1-08002BE10318}"; PCHAR TargetKeyNameStart = - "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"; + "SYSTEM\\CurrentControlSet\\Services\\"; + PCHAR TargetKeyNameEnd = "\\Parameters\\Tcpip"; PCHAR TargetKeyName = NULL; PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" ); PCHAR *EnumKeysTop = GetSubkeyNames( EnumKeyName, "" ); @@ -124,10 +125,10 @@ HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) { !strcmp( RootDevice, Adapter->DhclientInfo.name ) ) { TargetKeyName = (CHAR*) malloc( strlen( TargetKeyNameStart ) + - strlen( RootDevice ) + 1); + strlen( RootDevice ) + strlen( TargetKeyNameEnd ) + 1); if( !TargetKeyName ) goto cleanup; - sprintf( TargetKeyName, "%s%s", - TargetKeyNameStart, RootDevice ); + sprintf( TargetKeyName, "%s%s%s", + TargetKeyNameStart, RootDevice, TargetKeyNameEnd ); Error = RegCreateKeyExA( HKEY_LOCAL_MACHINE, TargetKeyName, 0, NULL, 0, KEY_READ, NULL, &OutKey, NULL ); break; } else { @@ -145,10 +146,8 @@ cleanup: } BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { - HKEY AdapterKey = NULL; - PCHAR IPAddress = NULL, Netmask = NULL, DefaultGateway = NULL; - NTSTATUS Status = STATUS_SUCCESS; - DWORD Error = ERROR_SUCCESS; + HKEY AdapterKey; + DWORD Error = ERROR_SUCCESS, DhcpEnabled; Adapter->DhclientState.config = &Adapter->DhclientConfig; strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr, @@ -156,54 +155,32 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { AdapterKey = FindAdapterKey( Adapter ); if( AdapterKey ) - IPAddress = RegReadString( AdapterKey, NULL, "IPAddress" ); + { + Error = RegQueryValueEx(AdapterKey, "DhcpEnabled", NULL, NULL, (LPBYTE)&DhcpEnabled, NULL); - if( IPAddress && strcmp( IPAddress, "0.0.0.0" ) ) { + if (Error != ERROR_SUCCESS) + DhcpEnabled = 1; + + CloseHandle(AdapterKey); + } + else + { + /* DHCP enabled by default */ + DhcpEnabled = 1; + } + + if( !DhcpEnabled ) { /* Non-automatic case */ - DH_DbgPrint - (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (static %s)\n", - Adapter->DhclientInfo.name, - Adapter->BindStatus, - IPAddress)); + DbgPrint("DHCPCSVC: Adapter Name: [%s] (static)\n", Adapter->DhclientInfo.name); Adapter->DhclientState.state = S_STATIC; - - Netmask = RegReadString( AdapterKey, NULL, "Subnetmask" ); - - Status = AddIPAddress( inet_addr( IPAddress ), - inet_addr( Netmask ? Netmask : "255.255.255.0" ), - Adapter->IfMib.dwIndex, - &Adapter->NteContext, - &Adapter->NteInstance ); - - DefaultGateway = RegReadString( AdapterKey, NULL, "DefaultGateway" ); - - if( DefaultGateway ) { - Adapter->RouterMib.dwForwardDest = 0; - Adapter->RouterMib.dwForwardMask = 0; - Adapter->RouterMib.dwForwardMetric1 = 1; - Adapter->RouterMib.dwForwardIfIndex = Adapter->IfMib.dwIndex; - Adapter->RouterMib.dwForwardNextHop = inet_addr(DefaultGateway); - Error = CreateIpForwardEntry( &Adapter->RouterMib ); - if( Error ) - warning("Failed to set default gateway %s: %ld\n", - DefaultGateway, Error); - } - - if( DefaultGateway ) free( DefaultGateway ); - if( Netmask ) free( Netmask ); } else { /* Automatic case */ - DH_DbgPrint - (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (dynamic)\n", - Adapter->DhclientInfo.name, - Adapter->BindStatus)); + DbgPrint("DHCPCSVC: Adapter Name: [%s] (dynamic)\n", Adapter->DhclientInfo.name); Adapter->DhclientInfo.client->state = S_INIT; } - if( IPAddress ) free( IPAddress ); - return TRUE; } @@ -350,7 +327,6 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) { ApiLock(); InsertTailList( &AdapterList, &Adapter->ListEntry ); - DbgPrint("DHCPCSVC: Discovered new adapter [%s]\n", Adapter->DhclientInfo.name); AdapterCount++; SetEvent(AdapterStateChangedEvent); ApiUnlock(); diff --git a/reactos/dll/win32/netcfgx/netcfgx.c b/reactos/dll/win32/netcfgx/netcfgx.c index 175e208ddaf..d0df4513f75 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.c +++ b/reactos/dll/win32/netcfgx/netcfgx.c @@ -336,7 +336,7 @@ InstallNetDevice( HKEY hNetworkKey = NULL; HKEY hLinkageKey = NULL; HKEY hConnectionKey = NULL; - DWORD dwShowIcon, dwLength; + DWORD dwShowIcon, dwLength, dwValue; /* Get Instance ID */ if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength)) @@ -422,6 +422,13 @@ InstallNetDevice( DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); goto cleanup; } + dwValue = 1; + rc = RegSetValueExW(hKey, L"DhcpEnabled", 0, REG_DWORD, (const BYTE*)&dwValue, sizeof(DWORD)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } RegCloseKey(hKey); hKey = NULL; diff --git a/reactos/drivers/network/tcpip/datalink/lan.c b/reactos/drivers/network/tcpip/datalink/lan.c index 890330e202d..165ec6b1937 100644 --- a/reactos/drivers/network/tcpip/datalink/lan.c +++ b/reactos/drivers/network/tcpip/datalink/lan.c @@ -946,9 +946,17 @@ BOOLEAN BindAdapter( PIP_INTERFACE IF; NDIS_STATUS NdisStatus; LLIP_BIND_INFO BindInfo; - IP_ADDRESS DefaultMask; - ULONG Lookahead = LOOKAHEAD_SIZE; + IP_ADDRESS DefaultMask, Router; + ULONG Lookahead = LOOKAHEAD_SIZE, Unused; NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE ParameterHandle; + PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo; + UNICODE_STRING IPAddress = RTL_CONSTANT_STRING(L"IPAddress"); + UNICODE_STRING Netmask = RTL_CONSTANT_STRING(L"SubnetMask"); + UNICODE_STRING Gateway = RTL_CONSTANT_STRING(L"DefaultGateway"); + UNICODE_STRING RegistryDataU; + ANSI_STRING RegistryDataA; TI_DbgPrint(DEBUG_DATALINK, ("Called.\n")); @@ -1001,10 +1009,105 @@ BOOLEAN BindAdapter( TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n", &IF->Description)); + DbgPrint("Opening %wZ\n", RegistryPath); + + InitializeObjectAttributes(&ObjectAttributes, + RegistryPath, + OBJ_CASE_INSENSITIVE, + 0, + NULL); + AddrInitIPv4(&DefaultMask, 0); - IF->Unicast = DefaultMask; - IF->Netmask = DefaultMask; + Status = ZwOpenKey(&ParameterHandle, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + IF->Unicast = DefaultMask; + IF->Netmask = DefaultMask; + } + else + { + KeyValueInfo = ExAllocatePool(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR)); + if (!KeyValueInfo) + { + ZwClose(ParameterHandle); + IPDestroyInterface(IF); + return FALSE; + } + + RegistryDataU.MaximumLength = 16 + sizeof(WCHAR); + RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data; + + Status = ZwQueryValueKey(ParameterHandle, + &IPAddress, + KeyValuePartialInformation, + KeyValueInfo, + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + &Unused); + if (NT_SUCCESS(Status)) + { + RegistryDataU.Length = KeyValueInfo->DataLength; + + RtlUnicodeStringToAnsiString(&RegistryDataA, + &RegistryDataU, + TRUE); + + AddrInitIPv4(&IF->Unicast, inet_addr(RegistryDataA.Buffer)); + + RtlFreeAnsiString(&RegistryDataA); + + } + else + { + IF->Unicast = DefaultMask; + } + + Status = ZwQueryValueKey(ParameterHandle, + &Netmask, + KeyValuePartialInformation, + KeyValueInfo, + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + &Unused); + if (NT_SUCCESS(Status)) + { + RegistryDataU.Length = KeyValueInfo->DataLength; + + RtlUnicodeStringToAnsiString(&RegistryDataA, + &RegistryDataU, + TRUE); + + AddrInitIPv4(&IF->Netmask, inet_addr(RegistryDataA.Buffer)); + + RtlFreeAnsiString(&RegistryDataA); + } + else + { + IF->Netmask = DefaultMask; + } + + Status = ZwQueryValueKey(ParameterHandle, + &Gateway, + KeyValuePartialInformation, + KeyValueInfo, + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + &Unused); + if (NT_SUCCESS(Status)) + { + RegistryDataU.Length = KeyValueInfo->DataLength; + + RtlUnicodeStringToAnsiString(&RegistryDataA, + &RegistryDataU, + TRUE); + + AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer)); + + RtlFreeAnsiString(&RegistryDataA); + + if (!AddrIsUnspecified(&Router)) RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, IF, 1); + } + + ZwClose(ParameterHandle); + } IF->Broadcast.Type = IP_ADDRESS_V4; IF->Broadcast.Address.IPv4Address = From 59081046c2d929253cb6a3934a9894deaa8cc2c1 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 23 Jul 2010 22:33:09 +0000 Subject: [PATCH 63/82] - Remove some debug info that I forgot about svn path=/trunk/; revision=48216 --- reactos/drivers/network/tcpip/datalink/lan.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/drivers/network/tcpip/datalink/lan.c b/reactos/drivers/network/tcpip/datalink/lan.c index 165ec6b1937..7b186d936eb 100644 --- a/reactos/drivers/network/tcpip/datalink/lan.c +++ b/reactos/drivers/network/tcpip/datalink/lan.c @@ -1009,8 +1009,6 @@ BOOLEAN BindAdapter( TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n", &IF->Description)); - DbgPrint("Opening %wZ\n", RegistryPath); - InitializeObjectAttributes(&ObjectAttributes, RegistryPath, OBJ_CASE_INSENSITIVE, From 56f8b1717a227d8613ae6ea6681e26821be71d2a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Jul 2010 22:40:13 +0000 Subject: [PATCH 64/82] [NTOSKRNL] Don't use freeldrhack on amd64 svn path=/trunk/; revision=48217 --- reactos/ntoskrnl/io/iomgr/arcname.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/ntoskrnl/io/iomgr/arcname.c b/reactos/ntoskrnl/io/iomgr/arcname.c index 798219b8764..003c9bfc8ca 100644 --- a/reactos/ntoskrnl/io/iomgr/arcname.c +++ b/reactos/ntoskrnl/io/iomgr/arcname.c @@ -354,7 +354,9 @@ IopAssignArcNamesToCdrom(IN PLOADER_PARAMETER_BLOCK LoaderBlock, /* Now calculate the checksum */ for (i = 0; i < 2048 / sizeof(ULONG); i++) CheckSum += Buffer[i]; +#ifndef _M_AMD64 if (KeRosLoaderBlock) goto freeldrhack; +#endif /* Search if this device is the actual boot CD */ for (NextEntry = ArcDiskInfo->DiskSignatureListHead.Flink; @@ -375,7 +377,9 @@ IopAssignArcNamesToCdrom(IN PLOADER_PARAMETER_BLOCK LoaderBlock, } goto checkbootcd; +#ifndef _M_AMD64 freeldrhack: +#endif /* * FIXME: In normal conditions, NTLDR/FreeLdr sends the *proper* CDROM * ARC Path name, and what happens here is a comparision of both checksums From c168961990c6717221c59c443353c8973a35ce01 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Jul 2010 23:23:51 +0000 Subject: [PATCH 65/82] [NDK] Update amd64/asm.h to MSVC compatible format svn path=/trunk/; revision=48218 --- reactos/include/ndk/amd64/asm.h | 525 ++++++++++++++++++-------------- 1 file changed, 293 insertions(+), 232 deletions(-) diff --git a/reactos/include/ndk/amd64/asm.h b/reactos/include/ndk/amd64/asm.h index 4538e0c820a..956619d4900 100644 --- a/reactos/include/ndk/amd64/asm.h +++ b/reactos/include/ndk/amd64/asm.h @@ -18,243 +18,279 @@ Author: #ifndef _ASM_AMD64_H #define _ASM_AMD64_H +#ifndef HEX + #ifdef _USE_ML + #define HEX(x) x##h + #else + #define HEX(val) 0x0##val + #endif +#endif #define SIZEOF_FX_SAVE_AREA 528 // HACK // // CPU Modes // -#define KernelMode 0x0 -#define UserMode 0x1 +#define KernelMode HEX(0) +#define UserMode HEX(1) // // CPU Types // -#define CPU_INTEL 0x1 -#define CPU_AMD 0x2 +#define CPU_INTEL HEX(1) +#define CPU_AMD HEX(2) // // KTSS Offsets // -#define KTSS64_RSP0 0x04 -#define KTSS64_RSP1 0x0c -#define KTSS64_RSP2 0x14 -#define KTSS64_IST 0x1c -#define KTSS64_IO_MAP_BASE 0x66 +#define KTSS64_RSP0 HEX(04) +#define KTSS64_RSP1 HEX(0c) +#define KTSS64_RSP2 HEX(14) +#define KTSS64_IST HEX(1c) +#define KTSS64_IO_MAP_BASE HEX(66) // // KTHREAD Offsets // -#define KTHREAD_DEBUG_ACTIVE 0x03 -#define KTHREAD_INITIAL_STACK 0x28 -#define KTHREAD_STACK_LIMIT 0x30 -#define KTHREAD_WAIT_IRQL 0x156 -#define KTHREAD_TEB 0x0B0+0x10 -#define KTHREAD_KERNEL_STACK 0x038 -#define KTHREAD_NPX_STATE 0x85 -#define KTHREAD_SERVICE_TABLE 0x1E8 -#define KTHREAD_PREVIOUS_MODE 0x137 -#define KTHREAD_TRAP_FRAME 0x1D8 -#define KTHREAD_CALLBACK_STACK 0x1E0 -#define KTHREAD_APCSTATE_PROCESS 0x068 -#define KPROCESS_DIRECTORY_TABLE_BASE 0x028 +#define KTHREAD_DEBUG_ACTIVE HEX(03) +#define KTHREAD_INITIAL_STACK HEX(28) +#define KTHREAD_STACK_LIMIT HEX(30) +#define KTHREAD_WAIT_IRQL HEX(156) // // KPRCB Offsets // -#define KPRCB_CurrentThread 0x08 +#define KPRCB_CurrentThread HEX(08) // // KPCR Offsets // -#define KPCR_TSS_BASE 0x08 -#define KPCR_SELF 0x18 -#define KPCR_STALL_SCALE_FACTOR 0x64 -#define KPCR_PRCB 0x180 +#define KPCR_TSS_BASE HEX(08) +#define KPCR_SELF HEX(18) +#define KPCR_STALL_SCALE_FACTOR HEX(64) +#define KPCR_PRCB HEX(180 // // KTRAP_FRAME Offsets // -#define KTRAP_FRAME_P1Home 0x00 -#define KTRAP_FRAME_P2Home 0x08 -#define KTRAP_FRAME_P3Home 0x10 -#define KTRAP_FRAME_P4Home 0x18 -#define KTRAP_FRAME_P5 0x20 -#define KTRAP_FRAME_PreviousMode 0x28 -#define KTRAP_FRAME_PreviousIrql 0x29 -#define KTRAP_FRAME_FaultIndicator 0x2A -#define KTRAP_FRAME_ExceptionActive 0x2B -#define KTRAP_FRAME_MxCsr 0x2C -#define KTRAP_FRAME_Rax 0x30 -#define KTRAP_FRAME_Rcx 0x38 -#define KTRAP_FRAME_Rdx 0x40 -#define KTRAP_FRAME_R8 0x48 -#define KTRAP_FRAME_R9 0x50 -#define KTRAP_FRAME_R10 0x58 -#define KTRAP_FRAME_R11 0x60 -#define KTRAP_FRAME_GsBase 0x68 -#define KTRAP_FRAME_Xmm0 0x70 -#define KTRAP_FRAME_Xmm1 0x80 -#define KTRAP_FRAME_Xmm2 0x90 -#define KTRAP_FRAME_Xmm3 0xA0 -#define KTRAP_FRAME_Xmm4 0xB0 -#define KTRAP_FRAME_Xmm5 0xC0 -#define KTRAP_FRAME_FaultAddress 0xD0 -#define KTRAP_FRAME_Dr0 0xD8 -#define KTRAP_FRAME_Dr1 0xE0 -#define KTRAP_FRAME_Dr2 0xE8 -#define KTRAP_FRAME_Dr3 0xF0 -#define KTRAP_FRAME_Dr6 0xF8 -#define KTRAP_FRAME_Dr7 0x100 -#define KTRAP_FRAME_DebugControl 0x108 -#define KTRAP_FRAME_LastBranchToRip 0x110 -#define KTRAP_FRAME_LastBranchFromRip 0x118 -#define KTRAP_FRAME_LastExceptionToRip 0x120 -#define KTRAP_FRAME_LastExceptionFromRip 0x128 -#define KTRAP_FRAME_SegDs 0x130 -#define KTRAP_FRAME_SegEs 0x132 -#define KTRAP_FRAME_SegFs 0x134 -#define KTRAP_FRAME_SegGs 0x136 -#define KTRAP_FRAME_TrapFrame 0x138 -#define KTRAP_FRAME_Rbx 0x140 -#define KTRAP_FRAME_Rdi 0x148 -#define KTRAP_FRAME_Rsi 0x150 -#define KTRAP_FRAME_Rbp 0x158 -#define KTRAP_FRAME_ErrorCode 0x160 -#define KTRAP_FRAME_Rip 0x168 -#define KTRAP_FRAME_SegCs 0x170 -#define KTRAP_FRAME_Logging 0x173 -#define KTRAP_FRAME_EFlags 0x178 -#define KTRAP_FRAME_Rsp 0x180 -#define KTRAP_FRAME_SegSs 0x188 -#define KTRAP_FRAME_CodePatchCycle 0x18c -#define SIZE_KTRAP_FRAME 0x190 -#define KTRAP_FRAME_ALIGN 0x10 -#define KTRAP_FRAME_LENGTH 0x190 +#define KTRAP_FRAME_P1Home HEX(00) +#define KTRAP_FRAME_P2Home HEX(08) +#define KTRAP_FRAME_P3Home HEX(10) +#define KTRAP_FRAME_P4Home HEX(18) +#define KTRAP_FRAME_P5 HEX(20) +#define KTRAP_FRAME_PreviousMode HEX(28) +#define KTRAP_FRAME_PreviousIrql HEX(29) +#define KTRAP_FRAME_FaultIndicator HEX(2A) +#define KTRAP_FRAME_ExceptionActive HEX(2B) +#define KTRAP_FRAME_MxCsr HEX(2C) +#define KTRAP_FRAME_Rax HEX(30) +#define KTRAP_FRAME_Rcx HEX(38) +#define KTRAP_FRAME_Rdx HEX(40) +#define KTRAP_FRAME_R8 HEX(48) +#define KTRAP_FRAME_R9 HEX(50) +#define KTRAP_FRAME_R10 HEX(58) +#define KTRAP_FRAME_R11 HEX(60) +#define KTRAP_FRAME_GsBase HEX(68) +#define KTRAP_FRAME_Xmm0 HEX(70) +#define KTRAP_FRAME_Xmm1 HEX(80) +#define KTRAP_FRAME_Xmm2 HEX(90) +#define KTRAP_FRAME_Xmm3 HEX(A0) +#define KTRAP_FRAME_Xmm4 HEX(B0) +#define KTRAP_FRAME_Xmm5 HEX(C0) +#define KTRAP_FRAME_FaultAddress HEX(D0) +#define KTRAP_FRAME_Dr0 HEX(D8) +#define KTRAP_FRAME_Dr1 HEX(E0) +#define KTRAP_FRAME_Dr2 HEX(E8) +#define KTRAP_FRAME_Dr3 HEX(F0) +#define KTRAP_FRAME_Dr6 HEX(F8) +#define KTRAP_FRAME_Dr7 HEX(100) +#define KTRAP_FRAME_DebugControl HEX(108) +#define KTRAP_FRAME_LastBranchToRip HEX(110) +#define KTRAP_FRAME_LastBranchFromRip HEX(118) +#define KTRAP_FRAME_LastExceptionToRip HEX(120) +#define KTRAP_FRAME_LastExceptionFromRip HEX(128) +#define KTRAP_FRAME_SegDs HEX(130) +#define KTRAP_FRAME_SegEs HEX(132) +#define KTRAP_FRAME_SegFs HEX(134) +#define KTRAP_FRAME_SegGs HEX(136) +#define KTRAP_FRAME_TrapFrame HEX(138) +#define KTRAP_FRAME_Rbx HEX(140) +#define KTRAP_FRAME_Rdi HEX(148) +#define KTRAP_FRAME_Rsi HEX(150) +#define KTRAP_FRAME_Rbp HEX(158) +#define KTRAP_FRAME_ErrorCode HEX(160) +#define KTRAP_FRAME_Rip HEX(168) +#define KTRAP_FRAME_SegCs HEX(170) +#define KTRAP_FRAME_Logging HEX(173) +#define KTRAP_FRAME_EFlags HEX(178) +#define KTRAP_FRAME_Rsp HEX(180) +#define KTRAP_FRAME_SegSs HEX(188) +#define KTRAP_FRAME_CodePatchCycle HEX(18c) +#define SIZE_KTRAP_FRAME HEX(190) +#define KTRAP_FRAME_ALIGN HEX(10) +#define KTRAP_FRAME_LENGTH HEX(190) // // CONTEXT Offsets // #define CONTEXT_P1Home 0 -#define CONTEXT_P2Home 0x08 -#define CONTEXT_P3Home 0x10 -#define CONTEXT_P4Home 0x18 -#define CONTEXT_P5Home 0x20 -#define CONTEXT_P6Home 0x28 -#define CONTEXT_ContextFlags 0x30 -#define CONTEXT_MxCsr 0x34 -#define CONTEXT_SegCs 0x38 -#define CONTEXT_SegDs 0x3a -#define CONTEXT_SegEs 0x3c -#define CONTEXT_SegFs 0x3e -#define CONTEXT_SegGs 0x40 -#define CONTEXT_SegSs 0x42 -#define CONTEXT_EFlags 0x44 -#define CONTEXT_Dr0 0x48 -#define CONTEXT_Dr1 0x50 -#define CONTEXT_Dr2 0x58 -#define CONTEXT_Dr3 0x60 -#define CONTEXT_Dr6 0x68 -#define CONTEXT_Dr7 0x70 -#define CONTEXT_Rax 0x78 -#define CONTEXT_Rcx 0x80 -#define CONTEXT_Rdx 0x88 -#define CONTEXT_Rbx 0x90 -#define CONTEXT_Rsp 0x98 -#define CONTEXT_Rbp 0xa0 -#define CONTEXT_Rsi 0xa8 -#define CONTEXT_Rdi 0xb0 -#define CONTEXT_R8 0xb8 -#define CONTEXT_R9 0xc0 -#define CONTEXT_R10 0xc8 -#define CONTEXT_R11 0xd0 -#define CONTEXT_R12 0xd8 -#define CONTEXT_R13 0xe0 -#define CONTEXT_R14 0xe8 -#define CONTEXT_R15 0xf0 -#define CONTEXT_Rip 0xf8 -#define CONTEXT_Header 0x100 -#define CONTEXT_Legacy 0x120 -#define CONTEXT_Xmm0 0x1a0 -#define CONTEXT_Xmm1 0x1b0 -#define CONTEXT_Xmm2 0x1c0 -#define CONTEXT_Xmm3 0x1d0 -#define CONTEXT_Xmm4 0x1e0 -#define CONTEXT_Xmm5 0x1f0 -#define CONTEXT_Xmm6 0x200 -#define CONTEXT_Xmm7 0x210 -#define CONTEXT_Xmm8 0x220 -#define CONTEXT_Xmm9 0x230 -#define CONTEXT_Xmm10 0x240 -#define CONTEXT_Xmm11 0x250 -#define CONTEXT_Xmm12 0x260 -#define CONTEXT_Xmm13 0x270 -#define CONTEXT_Xmm14 0x280 -#define CONTEXT_Xmm15 0x290 -#define CONTEXT_VectorRegister 0x300 -#define CONTEXT_VectorControl 0x4a0 -#define CONTEXT_DebugControl 0x4a8 -#define CONTEXT_LastBranchToRip 0x4b0 -#define CONTEXT_LastBranchFromRip 0x4b8 -#define CONTEXT_LastExceptionToRip 0x4c0 -#define CONTEXT_LastExceptionFromRip 0x4c8 +#define CONTEXT_P2Home HEX(08) +#define CONTEXT_P3Home HEX(10) +#define CONTEXT_P4Home HEX(18) +#define CONTEXT_P5Home HEX(20) +#define CONTEXT_P6Home HEX(28) +#define CONTEXT_ContextFlags HEX(30) +#define CONTEXT_MxCsr HEX(34) +#define CONTEXT_SegCs HEX(38) +#define CONTEXT_SegDs HEX(3a) +#define CONTEXT_SegEs HEX(3c) +#define CONTEXT_SegFs HEX(3e) +#define CONTEXT_SegGs HEX(40) +#define CONTEXT_SegSs HEX(42) +#define CONTEXT_EFlags HEX(44) +#define CONTEXT_Dr0 HEX(48) +#define CONTEXT_Dr1 HEX(50) +#define CONTEXT_Dr2 HEX(58) +#define CONTEXT_Dr3 HEX(60) +#define CONTEXT_Dr6 HEX(68) +#define CONTEXT_Dr7 HEX(70) +#define CONTEXT_Rax HEX(78) +#define CONTEXT_Rcx HEX(80) +#define CONTEXT_Rdx HEX(88) +#define CONTEXT_Rbx HEX(90) +#define CONTEXT_Rsp HEX(98) +#define CONTEXT_Rbp HEX(a0) +#define CONTEXT_Rsi HEX(a8) +#define CONTEXT_Rdi HEX(b0) +#define CONTEXT_R8 HEX(b8) +#define CONTEXT_R9 HEX(c0) +#define CONTEXT_R10 HEX(c8) +#define CONTEXT_R11 HEX(d0) +#define CONTEXT_R12 HEX(d8) +#define CONTEXT_R13 HEX(e0) +#define CONTEXT_R14 HEX(e8) +#define CONTEXT_R15 HEX(f0) +#define CONTEXT_Rip HEX(f8) +#define CONTEXT_Header HEX(100) +#define CONTEXT_Legacy HEX(120) +#define CONTEXT_Xmm0 HEX(1a0) +#define CONTEXT_Xmm1 HEX(1b0) +#define CONTEXT_Xmm2 HEX(1c0) +#define CONTEXT_Xmm3 HEX(1d0) +#define CONTEXT_Xmm4 HEX(1e0) +#define CONTEXT_Xmm5 HEX(1f0) +#define CONTEXT_Xmm6 HEX(200) +#define CONTEXT_Xmm7 HEX(210) +#define CONTEXT_Xmm8 HEX(220) +#define CONTEXT_Xmm9 HEX(230) +#define CONTEXT_Xmm10 HEX(240) +#define CONTEXT_Xmm11 HEX(250) +#define CONTEXT_Xmm12 HEX(260) +#define CONTEXT_Xmm13 HEX(270) +#define CONTEXT_Xmm14 HEX(280) +#define CONTEXT_Xmm15 HEX(290) +#define CONTEXT_VectorRegister HEX(300) +#define CONTEXT_VectorControl HEX(4a0) +#define CONTEXT_DebugControl HEX(4a8) +#define CONTEXT_LastBranchToRip HEX(4b0) +#define CONTEXT_LastBranchFromRip HEX(4b8) +#define CONTEXT_LastExceptionToRip HEX(4c0) +#define CONTEXT_LastExceptionFromRip HEX(4c8) + +// +// KEXCEPTION_FRAME offsets +// +#define KEXCEPTION_FRAME_P1Home HEX(000) +#define KEXCEPTION_FRAME_P2Home HEX(008) +#define KEXCEPTION_FRAME_P3Home HEX(010) +#define KEXCEPTION_FRAME_P4Home HEX(018) +#define KEXCEPTION_FRAME_P5 HEX(020) +#define KEXCEPTION_FRAME_InitialStack HEX(028) +#define KEXCEPTION_FRAME_Xmm6 HEX(030) +#define KEXCEPTION_FRAME_Xmm7 HEX(040) +#define KEXCEPTION_FRAME_Xmm8 HEX(050) +#define KEXCEPTION_FRAME_Xmm9 HEX(060) +#define KEXCEPTION_FRAME_Xmm10 HEX(070) +#define KEXCEPTION_FRAME_Xmm11 HEX(080) +#define KEXCEPTION_FRAME_Xmm12 HEX(090) +#define KEXCEPTION_FRAME_Xmm13 HEX(0A0) +#define KEXCEPTION_FRAME_Xmm14 HEX(0B0) +#define KEXCEPTION_FRAME_Xmm15 HEX(0C0) +#define KEXCEPTION_FRAME_TrapFrame HEX(0D0) +#define KEXCEPTION_FRAME_CallbackStack HEX(0D8) +#define KEXCEPTION_FRAME_OutputBuffer HEX(0E0) +#define KEXCEPTION_FRAME_OutputLength HEX(0E8) +#define KEXCEPTION_FRAME_MxCsr HEX(0F0) +#define KEXCEPTION_FRAME_Rbp HEX(0F8) +#define KEXCEPTION_FRAME_Rbx HEX(100) +#define KEXCEPTION_FRAME_Rdi HEX(108) +#define KEXCEPTION_FRAME_Rsi HEX(110) +#define KEXCEPTION_FRAME_R12 HEX(118) +#define KEXCEPTION_FRAME_R13 HEX(120) +#define KEXCEPTION_FRAME_R14 HEX(128) +#define KEXCEPTION_FRAME_R15 HEX(130) +#define KEXCEPTION_FRAME_Return HEX(138) +#define SIZE_KEXCEPTION_FRAME HEX(140) + // // EXCEPTION_RECORD Offsets // -#define EXCEPTION_RECORD_ExceptionCode 0x00 -#define EXCEPTION_RECORD_ExceptionFlags 0x04 -#define EXCEPTION_RECORD_ExceptionRecord 0x08 -#define EXCEPTION_RECORD_ExceptionAddress 0x10 -#define EXCEPTION_RECORD_NumberParameters 0x18 -#define EXCEPTION_RECORD_ExceptionInformation 0x20 -#define SIZE_EXCEPTION_RECORD 0x98 +#define EXCEPTION_RECORD_ExceptionCode HEX(00) +#define EXCEPTION_RECORD_ExceptionFlags HEX(04) +#define EXCEPTION_RECORD_ExceptionRecord HEX(08) +#define EXCEPTION_RECORD_ExceptionAddress HEX(10) +#define EXCEPTION_RECORD_NumberParameters HEX(18) +#define EXCEPTION_RECORD_ExceptionInformation HEX(20) +#define SIZE_EXCEPTION_RECORD HEX(98) // // CR0 // -#define CR0_PE 0x1 -#define CR0_MP 0x2 -#define CR0_EM 0x4 -#define CR0_TS 0x8 -#define CR0_ET 0x10 -#define CR0_NE 0x20 -#define CR0_WP 0x10000 -#define CR0_AM 0x40000 -#define CR0_NW 0x20000000 -#define CR0_CD 0x40000000 -#define CR0_PG 0x80000000 +#define CR0_PE HEX(1) +#define CR0_MP HEX(2) +#define CR0_EM HEX(4) +#define CR0_TS HEX(8) +#define CR0_ET HEX(10) +#define CR0_NE HEX(20) +#define CR0_WP HEX(10000) +#define CR0_AM HEX(40000) +#define CR0_NW HEX(20000000) +#define CR0_CD HEX(40000000) +#define CR0_PG HEX(80000000) +#ifdef _ASM_ // // CR4 // -#define CR4_VME 0x1 -#define CR4_PVI 0x2 -#define CR4_TSD 0x4 -#define CR4_DE 0x8 -#define CR4_PSE 0x10 -#define CR4_PAE 0x20 -#define CR4_MCE 0x40 -#define CR4_PGE 0x80 -#define CR4_FXSR 0x200 -#define CR4_XMMEXCPT 0x400 +#define CR4_VME HEX(1) +#define CR4_PVI HEX(2) +#define CR4_TSD HEX(4) +#define CR4_DE HEX(8) +#define CR4_PSE HEX(10) +#define CR4_PAE HEX(20) +#define CR4_MCE HEX(40) +#define CR4_PGE HEX(80) +#define CR4_FXSR HEX(200) +#define CR4_XMMEXCPT HEX(400) +#endif // // Generic Definitions // -#define PRIMARY_VECTOR_BASE 0x30 -#define MAXIMUM_IDTVECTOR 0xFF +#define PRIMARY_VECTOR_BASE HEX(30) +#define MAXIMUM_IDTVECTOR HEX(FF) // // Usermode callout frame definitions // -#define CBSTACK_STACK 0x0 -#define CBSTACK_TRAP_FRAME 0x8 -#define CBSTACK_CALLBACK_STACK 0x10 -#define CBSTACK_RBP 0x18 -#define CBSTACK_RESULT 0x20 -#define CBSTACK_RESULT_LENGTH 0x28 +#define CBSTACK_STACK HEX(0) +#define CBSTACK_TRAP_FRAME HEX(8) +#define CBSTACK_CALLBACK_STACK HEX(10) +#define CBSTACK_RBP HEX(18) +#define CBSTACK_RESULT HEX(20) +#define CBSTACK_RESULT_LENGTH HEX(28) /* Following ones are ASM only! ***********************************************/ @@ -269,55 +305,80 @@ Author: // // EFLAGS // -#define EFLAGS_TF 0x100 -#define EFLAGS_INTERRUPT_MASK 0x200 -#define EFLAGS_NESTED_TASK 0x4000 -#define EFLAGS_V86_MASK 0x20000 -#define EFLAGS_ALIGN_CHECK 0x40000 -#define EFLAGS_VIF 0x80000 -#define EFLAGS_VIP 0x100000 -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 +#define EFLAGS_TF HEX(100) +#define EFLAGS_INTERRUPT_MASK HEX(200) +#define EFLAGS_NESTED_TASK HEX(4000) +#define EFLAGS_V86_MASK HEX(20000) +#define EFLAGS_ALIGN_CHECK HEX(40000) +#define EFLAGS_VIF HEX(80000) +#define EFLAGS_VIP HEX(100000) +#define EFLAG_SIGN HEX(8000) +#define EFLAG_ZERO HEX(4000) #define EFLAG_SELECT (EFLAG_SIGN + EFLAG_ZERO) -#define EFLAGS_USER_SANITIZE 0x3F4DD7 +#define EFLAGS_USER_SANITIZE HEX(3F4DD7) // -// NTSTATUS and Bugcheck Codes +// Exception codes // -#define STATUS_ACCESS_VIOLATION 0xC0000005 -#define STATUS_IN_PAGE_ERROR 0xC0000006 -#define STATUS_GUARD_PAGE_VIOLATION 0x80000001 -#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096 -#define STATUS_STACK_OVERFLOW 0xC00000FD -#define KI_EXCEPTION_ACCESS_VIOLATION 0x10000004 -#define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C -#define STATUS_NO_CALLBACK_ACTIVE 0xC0000258 -#define STATUS_CALLBACK_POP_STACK 0xC0000423 -#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C -#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D -#define STATUS_INVALID_LOCK_SEQUENCE 0xC000001E -#define STATUS_BREAKPOINT 0x80000003 -#define STATUS_SINGLE_STEP 0x80000004 -#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094 -#define STATUS_INTEGER_OVERFLOW 0xC0000095 -#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D -#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E -#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F -#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090 -#define STATUS_FLOAT_OVERFLOW 0xC0000091 -#define STATUS_FLOAT_STACK_CHECK 0xC0000092 -#define STATUS_FLOAT_UNDERFLOW 0xC0000093 -#define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4 -#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5 -#define APC_INDEX_MISMATCH 0x01 -#define IRQL_NOT_GREATER_OR_EQUAL 0x09 -#define IRQL_NOT_LESS_OR_EQUAL 0x0A -#define TRAP_CAUSE_UNKNOWN 0x12 -#define KMODE_EXCEPTION_NOT_HANDLED 0x13 -#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A -#define UNEXPECTED_KERNEL_MODE_TRAP 0x7F -#define ATTEMPTED_SWITCH_FROM_DPC 0xB8 -#define HARDWARE_INTERRUPT_STORM 0xF2 +#define EXCEPTION_DIVIDED_BY_ZERO HEX(00000) +#define EXCEPTION_DEBUG HEX(00001) +#define EXCEPTION_NMI HEX(00002) +#define EXCEPTION_INT3 HEX(00003) +#define EXCEPTION_BOUND_CHECK HEX(00005) +#define EXCEPTION_INVALID_OPCODE HEX(00006) +#define EXCEPTION_NPX_NOT_AVAILABLE HEX(00007) +#define EXCEPTION_DOUBLE_FAULT HEX(00008) +#define EXCEPTION_NPX_OVERRUN HEX(00009) +#define EXCEPTION_INVALID_TSS HEX(0000A) +#define EXCEPTION_SEGMENT_NOT_PRESENT HEX(0000B) +#define EXCEPTION_STACK_FAULT HEX(0000C) +#define EXCEPTION_GP_FAULT HEX(0000D) +#define EXCEPTION_RESERVED_TRAP HEX(0000F) +#define EXCEPTION_NPX_ERROR HEX(00010) +#define EXCEPTION_ALIGNMENT_CHECK HEX(00011) + +// +// NTSTATUS values +// +#define STATUS_ACCESS_VIOLATION HEX(C0000005) +#define STATUS_IN_PAGE_ERROR HEX(C0000006) +#define STATUS_GUARD_PAGE_VIOLATION HEX(80000001) +#define STATUS_PRIVILEGED_INSTRUCTION HEX(C0000096) +#define STATUS_STACK_OVERFLOW HEX(C00000FD) +#define KI_EXCEPTION_ACCESS_VIOLATION HEX(10000004) +#define STATUS_INVALID_SYSTEM_SERVICE HEX(C000001C) +#define STATUS_NO_CALLBACK_ACTIVE HEX(C0000258) +#define STATUS_CALLBACK_POP_STACK HEX(C0000423) +#define STATUS_ARRAY_BOUNDS_EXCEEDED HEX(C000008C) +#define STATUS_ILLEGAL_INSTRUCTION HEX(C000001D) +#define STATUS_INVALID_LOCK_SEQUENCE HEX(C000001E) +#define STATUS_BREAKPOINT HEX(80000003) +#define STATUS_SINGLE_STEP HEX(80000004) +#define STATUS_INTEGER_DIVIDE_BY_ZERO HEX(C0000094) +#define STATUS_INTEGER_OVERFLOW HEX(C0000095) +#define STATUS_FLOAT_DENORMAL_OPERAND HEX(C000008D) +#define STATUS_FLOAT_DIVIDE_BY_ZERO HEX(C000008E) +#define STATUS_FLOAT_INEXACT_RESULT HEX(C000008F) +#define STATUS_FLOAT_INVALID_OPERATION HEX(C0000090) +#define STATUS_FLOAT_OVERFLOW HEX(C0000091) +#define STATUS_FLOAT_STACK_CHECK HEX(C0000092) +#define STATUS_FLOAT_UNDERFLOW HEX(C0000093) +#define STATUS_FLOAT_MULTIPLE_FAULTS HEX(C00002B4) +#define STATUS_FLOAT_MULTIPLE_TRAPS HEX(C00002B5) +#define STATUS_ASSERTION_FAILURE HEX(C0000420) + +// +// Bugcheck Codes +// +#define APC_INDEX_MISMATCH HEX(01) +#define IRQL_NOT_GREATER_OR_EQUAL HEX(09) +#define IRQL_NOT_LESS_OR_EQUAL HEX(0A) +#define TRAP_CAUSE_UNKNOWN HEX(12) +#define KMODE_EXCEPTION_NOT_HANDLED HEX(13) +#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE HEX(4A) +#define UNEXPECTED_KERNEL_MODE_TRAP HEX(7F) +#define ATTEMPTED_SWITCH_FROM_DPC HEX(B8) +#define HARDWARE_INTERRUPT_STORM HEX(F2) // // IRQL Levels @@ -335,24 +396,24 @@ Author: // // Quantum Decrements // -#define CLOCK_QUANTUM_DECREMENT 0x3 +#define CLOCK_QUANTUM_DECREMENT HEX(3) // // Machine types // -#define MACHINE_TYPE_ISA 0x0000 -#define MACHINE_TYPE_EISA 0x0001 -#define MACHINE_TYPE_MCA 0x0002 +#define MACHINE_TYPE_ISA HEX(0000) +#define MACHINE_TYPE_EISA HEX(0001) +#define MACHINE_TYPE_MCA HEX(0002) // // Kernel Feature Bits // -#define KF_RDTSC 0x00000002 +#define KF_RDTSC HEX(00000002) // // Kernel Stack Size // -#define KERNEL_STACK_SIZE 0x6000 +#define KERNEL_STACK_SIZE HEX(6000) #endif // __ASM__ From 19540dcad57e7a5f803e08a4e464e17e810b588b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Jul 2010 23:30:00 +0000 Subject: [PATCH 66/82] [NTOSKRNL] - Add KiGetLinkedTrapFrame for amd64 - Add MiAddressToPti - Fix MmCreateProcessAddressSpace, MmInitializeHandBuiltProcess prototype (ULONG -> ULONG_PTR) - #if out some C_ASSERTs for other architectures than x86 - #define InitializeSListHead to RtlInitializeSListHead on amd64 - Don't implement MiSyncARM3WithROS on amd64 - Implement RtlPcToFileHeader, RtlpGetStackLimits svn path=/trunk/; revision=48219 --- reactos/ntoskrnl/include/internal/amd64/ke.h | 3 ++ reactos/ntoskrnl/include/internal/amd64/mm.h | 11 ++++++ reactos/ntoskrnl/include/internal/mm.h | 4 +-- reactos/ntoskrnl/include/internal/ntoskrnl.h | 2 +- reactos/ntoskrnl/include/internal/rtl.h | 4 +++ reactos/ntoskrnl/mm/ARM3/mminit.c | 2 ++ reactos/ntoskrnl/rtl/libsupp.c | 37 ++++++++++++++++++++ 7 files changed, 60 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index deab4f4ff84..fc4fe24b494 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -96,6 +96,9 @@ extern ULONG KeI386CpuStep; #define KeGetTrapFramePc(TrapFrame) \ ((TrapFrame)->Rip) +#define KiGetLinkedTrapFrame(x) \ + (PKTRAP_FRAME)((x)->Rdx) + #define KeGetContextReturnRegister(Context) \ ((Context)->Rax) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index f0d43426b98..889c43e9684 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -102,6 +102,17 @@ _MiAddressToPte(PVOID Address) } #define MiAddressToPte(x) _MiAddressToPte((PVOID)(x)) +ULONG +FORCEINLINE +MiAddressToPti(PVOID Address) +{ + ULONG64 Pti = (ULONG64)Address >> PTI_SHIFT; + Pti &= PTI_MASK_AMD64; + return Pti; +} + +#define MiAddressToPteOffset(x) MiAddressToPti(x) + /* Convert a PTE into a corresponding address */ PVOID FORCEINLINE diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index f74a150e9d7..a7154de564d 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1407,14 +1407,14 @@ NTAPI MmCreateProcessAddressSpace( IN ULONG MinWs, IN PEPROCESS Dest, - IN PULONG DirectoryTableBase + IN PULONG_PTR DirectoryTableBase ); NTSTATUS NTAPI MmInitializeHandBuiltProcess( IN PEPROCESS Process, - IN PULONG DirectoryTableBase + IN PULONG_PTR DirectoryTableBase ); diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index 41d4843f30e..7aa74ef0e51 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -145,7 +145,7 @@ typedef struct _INFORMATION_CLASS_INFO #endif -#if defined (_M_IX86) || defined(_M_AMD64) +#ifdef _M_IX86 C_ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemCall) == 0x300); C_ASSERT(FIELD_OFFSET(KTHREAD, InitialStack) == KTHREAD_INITIAL_STACK); C_ASSERT(FIELD_OFFSET(KTHREAD, Teb) == KTHREAD_TEB); diff --git a/reactos/ntoskrnl/include/internal/rtl.h b/reactos/ntoskrnl/include/internal/rtl.h index 18489044fc9..4a2f0b4e541 100644 --- a/reactos/ntoskrnl/include/internal/rtl.h +++ b/reactos/ntoskrnl/include/internal/rtl.h @@ -1,5 +1,9 @@ #pragma once +#ifdef _WIN64 +#define InitializeSListHead RtlInitializeSListHead +#endif + NTSTATUS NTAPI RtlQueryAtomListInAtomTable( diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index f595ece9a0f..28358f1b53e 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -350,6 +350,7 @@ SIZE_T MmTotalCommitLimitMaximum; /* PRIVATE FUNCTIONS **********************************************************/ +#ifndef _M_AMD64 // // In Bavaria, this is probably a hate crime // @@ -372,6 +373,7 @@ MiSyncARM3WithROS(IN PVOID AddressStart, Pde++; } } +#endif PFN_NUMBER NTAPI diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index cbff1792b2c..aba04f1042e 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -28,6 +28,30 @@ SIZE_T RtlpAllocDeallocQueryBufferSize = 128; /* FUNCTIONS *****************************************************************/ +PVOID +NTAPI +RtlPcToFileHeader( + IN PVOID PcValue, + OUT PVOID *BaseOfImage) +{ + PLDR_DATA_TABLE_ENTRY LdrEntry; + BOOLEAN InSystem; + + /* Get the base for this file */ + if ((ULONG_PTR)PcValue > (ULONG_PTR)MmHighestUserAddress) + { + /* We are in kernel */ + *BaseOfImage = KiPcToFileHeader(PcValue, &LdrEntry, FALSE, &InSystem); + } + else + { + /* We are in user land */ + *BaseOfImage = KiRosPcToUserFileHeader(PcValue, &LdrEntry); + } + + return *BaseOfImage; +} + VOID NTAPI RtlInitializeRangeListPackage(VOID) @@ -417,6 +441,19 @@ RtlWalkFrameChain(OUT PVOID *Callers, #endif +#ifdef _AMD64_ +VOID +NTAPI +RtlpGetStackLimits( + OUT PULONG_PTR LowLimit, + OUT PULONG_PTR HighLimit) +{ + PKTHREAD CurrentThread = KeGetCurrentThread(); + *HighLimit = (ULONG_PTR)CurrentThread->InitialStack; + *LowLimit = (ULONG_PTR)CurrentThread->StackLimit; +} +#endif + /* RTL Atom Tables ************************************************************/ NTSTATUS From 66b4c2ff3e54ec4ef3391ee60ad1a5473c1d18d1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Jul 2010 23:50:26 +0000 Subject: [PATCH 67/82] [NTOSKRNL] Add missing declarations svn path=/trunk/; revision=48220 --- reactos/ntoskrnl/include/internal/ke.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index a5ff85a1017..5dac9165e65 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -1100,4 +1100,16 @@ KiSystemFatalException( IN PKTRAP_FRAME TrapFrame ); +PVOID +NTAPI +KiPcToFileHeader(IN PVOID Eip, + OUT PLDR_DATA_TABLE_ENTRY *LdrEntry, + IN BOOLEAN DriversOnly, + OUT PBOOLEAN InKernel); + +PVOID +NTAPI +KiRosPcToUserFileHeader(IN PVOID Eip, + OUT PLDR_DATA_TABLE_ENTRY *LdrEntry); + #include "ke_x.h" From 869cdbce37b71e5ee2f68bdc8c1189e52542bbc0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 24 Jul 2010 00:25:59 +0000 Subject: [PATCH 68/82] - Fix epic naming fail (DhcpEnabled -> EnableDHCP [DHCPCSVC]: Verify that the length is correct [TCPIP]: Make sure DHCP is enabled before reading IP information svn path=/trunk/; revision=48221 --- reactos/dll/win32/dhcpcsvc/dhcp/adapter.c | 6 +- reactos/dll/win32/netcfgx/netcfgx.c | 2 +- reactos/drivers/network/tcpip/datalink/lan.c | 125 +++++++++++-------- 3 files changed, 74 insertions(+), 59 deletions(-) diff --git a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c index ad18dfa4976..c0ba02db40e 100644 --- a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c +++ b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c @@ -147,7 +147,7 @@ cleanup: BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { HKEY AdapterKey; - DWORD Error = ERROR_SUCCESS, DhcpEnabled; + DWORD Error = ERROR_SUCCESS, DhcpEnabled, Length; Adapter->DhclientState.config = &Adapter->DhclientConfig; strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr, @@ -156,9 +156,9 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { AdapterKey = FindAdapterKey( Adapter ); if( AdapterKey ) { - Error = RegQueryValueEx(AdapterKey, "DhcpEnabled", NULL, NULL, (LPBYTE)&DhcpEnabled, NULL); + Error = RegQueryValueEx(AdapterKey, "EnableDHCP", NULL, NULL, (LPBYTE)&DhcpEnabled, &Length); - if (Error != ERROR_SUCCESS) + if (Error != ERROR_SUCCESS || Length != sizeof(DWORD)) DhcpEnabled = 1; CloseHandle(AdapterKey); diff --git a/reactos/dll/win32/netcfgx/netcfgx.c b/reactos/dll/win32/netcfgx/netcfgx.c index d0df4513f75..1fb9fc1ae34 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.c +++ b/reactos/dll/win32/netcfgx/netcfgx.c @@ -423,7 +423,7 @@ InstallNetDevice( goto cleanup; } dwValue = 1; - rc = RegSetValueExW(hKey, L"DhcpEnabled", 0, REG_DWORD, (const BYTE*)&dwValue, sizeof(DWORD)); + rc = RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (const BYTE*)&dwValue, sizeof(DWORD)); if (rc != ERROR_SUCCESS) { DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); diff --git a/reactos/drivers/network/tcpip/datalink/lan.c b/reactos/drivers/network/tcpip/datalink/lan.c index 7b186d936eb..2d449550bb0 100644 --- a/reactos/drivers/network/tcpip/datalink/lan.c +++ b/reactos/drivers/network/tcpip/datalink/lan.c @@ -955,6 +955,7 @@ BOOLEAN BindAdapter( UNICODE_STRING IPAddress = RTL_CONSTANT_STRING(L"IPAddress"); UNICODE_STRING Netmask = RTL_CONSTANT_STRING(L"SubnetMask"); UNICODE_STRING Gateway = RTL_CONSTANT_STRING(L"DefaultGateway"); + UNICODE_STRING EnableDhcp = RTL_CONSTANT_STRING(L"EnableDHCP"); UNICODE_STRING RegistryDataU; ANSI_STRING RegistryDataA; @@ -1033,77 +1034,91 @@ BOOLEAN BindAdapter( return FALSE; } - RegistryDataU.MaximumLength = 16 + sizeof(WCHAR); - RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data; - Status = ZwQueryValueKey(ParameterHandle, - &IPAddress, + &EnableDhcp, KeyValuePartialInformation, KeyValueInfo, - sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG), &Unused); - if (NT_SUCCESS(Status)) + if (NT_SUCCESS(Status) && KeyValueInfo->DataLength == sizeof(ULONG) && (*(PULONG)KeyValueInfo->Data) != 0) { - RegistryDataU.Length = KeyValueInfo->DataLength; + RegistryDataU.MaximumLength = 16 + sizeof(WCHAR); + RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data; - RtlUnicodeStringToAnsiString(&RegistryDataA, - &RegistryDataU, - TRUE); + Status = ZwQueryValueKey(ParameterHandle, + &IPAddress, + KeyValuePartialInformation, + KeyValueInfo, + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + &Unused); + if (NT_SUCCESS(Status)) + { + RegistryDataU.Length = KeyValueInfo->DataLength; - AddrInitIPv4(&IF->Unicast, inet_addr(RegistryDataA.Buffer)); + RtlUnicodeStringToAnsiString(&RegistryDataA, + &RegistryDataU, + TRUE); - RtlFreeAnsiString(&RegistryDataA); + AddrInitIPv4(&IF->Unicast, inet_addr(RegistryDataA.Buffer)); + RtlFreeAnsiString(&RegistryDataA); + + } + else + { + IF->Unicast = DefaultMask; + } + + Status = ZwQueryValueKey(ParameterHandle, + &Netmask, + KeyValuePartialInformation, + KeyValueInfo, + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + &Unused); + if (NT_SUCCESS(Status)) + { + RegistryDataU.Length = KeyValueInfo->DataLength; + + RtlUnicodeStringToAnsiString(&RegistryDataA, + &RegistryDataU, + TRUE); + + AddrInitIPv4(&IF->Netmask, inet_addr(RegistryDataA.Buffer)); + + RtlFreeAnsiString(&RegistryDataA); + } + else + { + IF->Netmask = DefaultMask; + } + + Status = ZwQueryValueKey(ParameterHandle, + &Gateway, + KeyValuePartialInformation, + KeyValueInfo, + sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), + &Unused); + if (NT_SUCCESS(Status)) + { + RegistryDataU.Length = KeyValueInfo->DataLength; + + RtlUnicodeStringToAnsiString(&RegistryDataA, + &RegistryDataU, + TRUE); + + AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer)); + + RtlFreeAnsiString(&RegistryDataA); + + if (!AddrIsUnspecified(&Router)) RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, IF, 1); + } } else { IF->Unicast = DefaultMask; - } - - Status = ZwQueryValueKey(ParameterHandle, - &Netmask, - KeyValuePartialInformation, - KeyValueInfo, - sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), - &Unused); - if (NT_SUCCESS(Status)) - { - RegistryDataU.Length = KeyValueInfo->DataLength; - - RtlUnicodeStringToAnsiString(&RegistryDataA, - &RegistryDataU, - TRUE); - - AddrInitIPv4(&IF->Netmask, inet_addr(RegistryDataA.Buffer)); - - RtlFreeAnsiString(&RegistryDataA); - } - else - { IF->Netmask = DefaultMask; } - Status = ZwQueryValueKey(ParameterHandle, - &Gateway, - KeyValuePartialInformation, - KeyValueInfo, - sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), - &Unused); - if (NT_SUCCESS(Status)) - { - RegistryDataU.Length = KeyValueInfo->DataLength; - - RtlUnicodeStringToAnsiString(&RegistryDataA, - &RegistryDataU, - TRUE); - - AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer)); - - RtlFreeAnsiString(&RegistryDataA); - - if (!AddrIsUnspecified(&Router)) RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, IF, 1); - } - ZwClose(ParameterHandle); } From bfc2638590cc7d53e7b8f5ae8375d46e82cfbc2f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 24 Jul 2010 01:12:13 +0000 Subject: [PATCH 69/82] [NTOSKRNL] Bring over all current amd64 specific code from the amd64 branch svn path=/trunk/; revision=48222 --- reactos/ntoskrnl/ex/amd64/fastinterlck.c | 114 + reactos/ntoskrnl/kd/amd64/kd.c | 23 + reactos/ntoskrnl/kd/amd64/kdmemsup.c | 217 ++ reactos/ntoskrnl/kdbg/amd64/dis-asm.h | 330 ++ reactos/ntoskrnl/kdbg/amd64/i386-dis.c | 4300 ++++++++++++++++++++++ reactos/ntoskrnl/kdbg/amd64/kdb.c | 111 + reactos/ntoskrnl/kdbg/amd64/kdb_help.S | 152 + reactos/ntoskrnl/ke/amd64/boot.S | 64 + reactos/ntoskrnl/ke/amd64/context.c | 250 ++ reactos/ntoskrnl/ke/amd64/cpu.c | 589 +++ reactos/ntoskrnl/ke/amd64/ctxswitch.S | 199 + reactos/ntoskrnl/ke/amd64/except.c | 299 ++ reactos/ntoskrnl/ke/amd64/interrupt.c | 62 + reactos/ntoskrnl/ke/amd64/irql.c | 45 + reactos/ntoskrnl/ke/amd64/kiinit.c | 502 +++ reactos/ntoskrnl/ke/amd64/spinlock.c | 196 + reactos/ntoskrnl/ke/amd64/stubs.c | 188 + reactos/ntoskrnl/ke/amd64/thrdini.c | 193 + reactos/ntoskrnl/ke/amd64/trap.S | 948 +++++ reactos/ntoskrnl/mm/amd64/init.c | 884 +++++ reactos/ntoskrnl/mm/amd64/page.c | 534 +++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 58 +- reactos/ntoskrnl/ps/amd64/psctx.c | 95 + 23 files changed, 10352 insertions(+), 1 deletion(-) create mode 100644 reactos/ntoskrnl/ex/amd64/fastinterlck.c create mode 100644 reactos/ntoskrnl/kd/amd64/kd.c create mode 100644 reactos/ntoskrnl/kd/amd64/kdmemsup.c create mode 100644 reactos/ntoskrnl/kdbg/amd64/dis-asm.h create mode 100644 reactos/ntoskrnl/kdbg/amd64/i386-dis.c create mode 100644 reactos/ntoskrnl/kdbg/amd64/kdb.c create mode 100644 reactos/ntoskrnl/kdbg/amd64/kdb_help.S create mode 100644 reactos/ntoskrnl/ke/amd64/boot.S create mode 100644 reactos/ntoskrnl/ke/amd64/context.c create mode 100644 reactos/ntoskrnl/ke/amd64/cpu.c create mode 100644 reactos/ntoskrnl/ke/amd64/ctxswitch.S create mode 100644 reactos/ntoskrnl/ke/amd64/except.c create mode 100644 reactos/ntoskrnl/ke/amd64/interrupt.c create mode 100644 reactos/ntoskrnl/ke/amd64/irql.c create mode 100644 reactos/ntoskrnl/ke/amd64/kiinit.c create mode 100644 reactos/ntoskrnl/ke/amd64/spinlock.c create mode 100644 reactos/ntoskrnl/ke/amd64/stubs.c create mode 100644 reactos/ntoskrnl/ke/amd64/thrdini.c create mode 100644 reactos/ntoskrnl/ke/amd64/trap.S create mode 100644 reactos/ntoskrnl/mm/amd64/init.c create mode 100644 reactos/ntoskrnl/mm/amd64/page.c create mode 100644 reactos/ntoskrnl/ps/amd64/psctx.c diff --git a/reactos/ntoskrnl/ex/amd64/fastinterlck.c b/reactos/ntoskrnl/ex/amd64/fastinterlck.c new file mode 100644 index 00000000000..b9ca32aab1b --- /dev/null +++ b/reactos/ntoskrnl/ex/amd64/fastinterlck.c @@ -0,0 +1,114 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/ex/fastinterlck.c + * PURPOSE: Portable Ex*Interlocked and REGISTER routines for amd64 + * PROGRAMMERS: ReactOS Portable Systems Group + * Timo Kreuzer + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef ExInterlockedAddLargeInteger +#undef ExInterlockedAddUlong +#undef ExInterlockedExtendZone +#undef ExInterlockedInsertHeadList +#undef ExInterlockedInsertTailList +#undef ExInterlockedPopEntryList +#undef ExInterlockedPushEntryList +#undef ExInterlockedRemoveHeadList +#undef ExpInterlockedFlushSList +#undef ExpInterlockedPopEntrySList +#undef ExpInterlockedPushEntrySList + +/* FUNCTIONS ******************************************************************/ + +LARGE_INTEGER +ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend, + IN LARGE_INTEGER Increment, + IN PKSPIN_LOCK Lock) +{ + LARGE_INTEGER Int; + Int.QuadPart = _InterlockedExchangeAdd64(&Addend->QuadPart, + Increment.QuadPart); + return Int; +} + +ULONG +ExInterlockedAddUlong(IN PULONG Addend, + IN ULONG Increment, + PKSPIN_LOCK Lock) +{ + return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment); +} + +PLIST_ENTRY +ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) +{ + KIRQL OldIrql; + PLIST_ENTRY OldHead = NULL; + KeAcquireSpinLock(Lock, &OldIrql); + if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink; + InsertHeadList(ListHead, ListEntry); + KeReleaseSpinLock(Lock, OldIrql); + return OldHead; +} + +PLIST_ENTRY +ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) +{ + KIRQL OldIrql; + PLIST_ENTRY OldHead = NULL; + KeAcquireSpinLock(Lock, &OldIrql); + if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink; + InsertTailList(ListHead, ListEntry); + KeReleaseSpinLock(Lock, OldIrql); + return OldHead; +} + +PSINGLE_LIST_ENTRY +ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock) +{ + KIRQL OldIrql; + PSINGLE_LIST_ENTRY FirstEntry; + KeAcquireSpinLock(Lock, &OldIrql); + FirstEntry = PopEntryList(ListHead); + KeReleaseSpinLock(Lock, OldIrql); + return FirstEntry; +} + +PSINGLE_LIST_ENTRY +ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead, + IN PSINGLE_LIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) +{ + KIRQL OldIrql; + PSINGLE_LIST_ENTRY OldHead = NULL; + KeAcquireSpinLock(Lock, &OldIrql); + OldHead = ListHead->Next; + PushEntryList(ListHead, ListEntry); + KeReleaseSpinLock(Lock, OldIrql); + return OldHead; +} + +PLIST_ENTRY +ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock) +{ + KIRQL OldIrql; + PLIST_ENTRY OldHead = NULL; + KeAcquireSpinLock(Lock, &OldIrql); + if (!IsListEmpty(ListHead)) OldHead = RemoveHeadList(ListHead); + KeReleaseSpinLock(Lock, OldIrql); + return OldHead; +} + diff --git a/reactos/ntoskrnl/kd/amd64/kd.c b/reactos/ntoskrnl/kd/amd64/kd.c new file mode 100644 index 00000000000..74694d21ee3 --- /dev/null +++ b/reactos/ntoskrnl/kd/amd64/kd.c @@ -0,0 +1,23 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/i386/cpu.c + * PURPOSE: Routines for CPU-level support + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable, + ULONG BootPhase) +{ + UNIMPLEMENTED; +} diff --git a/reactos/ntoskrnl/kd/amd64/kdmemsup.c b/reactos/ntoskrnl/kd/amd64/kdmemsup.c new file mode 100644 index 00000000000..75f19a1cbce --- /dev/null +++ b/reactos/ntoskrnl/kd/amd64/kdmemsup.c @@ -0,0 +1,217 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: ntoskrnl/kd/amd64/kdmemsup.c + * PURPOSE: Kernel Debugger Safe Memory Support + * + * PROGRAMMERS: arty + */ + +#include +#define NDEBUG +#include + +#define HIGH_PHYS_MASK 0x80000000 +#define PAGE_TABLE_MASK 0x3ff +#define BIG_PAGE_SIZE (1<<22) +#define CR4_PAGE_SIZE_BIT 0x10 +#define PDE_PRESENT_BIT 0x01 +#define PDE_W_BIT 0x02 +#define PDE_PWT_BIT 0x08 +#define PDE_PCD_BIT 0x10 +#define PDE_ACCESSED_BIT 0x20 +#define PDE_DIRTY_BIT 0x40 +#define PDE_PS_BIT 0x80 + +#define MI_KDBG_TMP_PAGE_1 (HYPER_SPACE + 0x400000 - PAGE_SIZE) +#define MI_KDBG_TMP_PAGE_0 (MI_KDBG_TMP_PAGE_1 - PAGE_SIZE) + +/* VARIABLES ***************************************************************/ + +static BOOLEAN KdpPhysAccess = FALSE; + +static +ULONG_PTR +KdpPhysMap(ULONG_PTR PhysAddr, LONG Len) +{ + MMPTE TempPte; + PMMPTE PointerPte; + ULONG_PTR VirtAddr; + + TempPte.u.Long = PDE_PRESENT_BIT | PDE_W_BIT | PDE_PWT_BIT | + PDE_PCD_BIT | PDE_ACCESSED_BIT | PDE_DIRTY_BIT; + + if ((PhysAddr & (PAGE_SIZE - 1)) + Len > PAGE_SIZE) + { + TempPte.u.Hard.PageFrameNumber = (PhysAddr >> PAGE_SHIFT) + 1; + PointerPte = MiAddressToPte((PVOID)MI_KDBG_TMP_PAGE_1); + *PointerPte = TempPte; + VirtAddr = (ULONG_PTR)PointerPte << 10; + KeInvalidateTlbEntry((PVOID)VirtAddr); + } + + TempPte.u.Hard.PageFrameNumber = PhysAddr >> PAGE_SHIFT; + PointerPte = MiAddressToPte((PVOID)MI_KDBG_TMP_PAGE_0); + *PointerPte = TempPte; + VirtAddr = (ULONG_PTR)PointerPte << 10; + KeInvalidateTlbEntry((PVOID)VirtAddr); + + return VirtAddr + (PhysAddr & (PAGE_SIZE - 1)); +} + +static +ULONGLONG +KdpPhysRead(ULONG_PTR PhysAddr, LONG Len) +{ + ULONG_PTR Addr; + ULONGLONG Result = 0; + + Addr = KdpPhysMap(PhysAddr, Len); + + switch (Len) + { + case 8: + Result = *((PULONGLONG)Addr); + break; + case 4: + Result = *((PULONG)Addr); + break; + case 2: + Result = *((PUSHORT)Addr); + break; + case 1: + Result = *((PUCHAR)Addr); + break; + } + + return Result; +} + +static +VOID +KdpPhysWrite(ULONG_PTR PhysAddr, LONG Len, ULONGLONG Value) +{ + ULONG_PTR Addr; + + Addr = KdpPhysMap(PhysAddr, Len); + + switch (Len) + { + case 8: + *((PULONGLONG)Addr) = Value; + break; + case 4: + *((PULONG)Addr) = Value; + break; + case 2: + *((PUSHORT)Addr) = Value; + break; + case 1: + *((PUCHAR)Addr) = Value; + break; + } +} + +BOOLEAN +NTAPI +KdpTranslateAddress(ULONG_PTR Addr, PULONG_PTR ResultAddr) +{ + ULONG_PTR CR3Value = __readcr3(); + ULONG_PTR CR4Value = __readcr4(); + ULONG_PTR PageDirectory = (CR3Value & ~(PAGE_SIZE-1)) + + ((Addr >> 22) * sizeof(ULONG)); + ULONG_PTR PageDirectoryEntry = KdpPhysRead(PageDirectory, sizeof(ULONG)); + + /* Not present -> fail */ + if (!(PageDirectoryEntry & PDE_PRESENT_BIT)) + { + return FALSE; + } + + /* Big Page? */ + if ((PageDirectoryEntry & PDE_PS_BIT) && (CR4Value & CR4_PAGE_SIZE_BIT)) + { + *ResultAddr = (PageDirectoryEntry & ~(BIG_PAGE_SIZE-1)) + + (Addr & (BIG_PAGE_SIZE-1)); + return TRUE; + } + else + { + ULONG_PTR PageTableAddr = + (PageDirectoryEntry & ~(PAGE_SIZE-1)) + + ((Addr >> PAGE_SHIFT) & PAGE_TABLE_MASK) * sizeof(ULONG); + ULONG_PTR PageTableEntry = KdpPhysRead(PageTableAddr, sizeof(ULONG)); + if (PageTableEntry & PDE_PRESENT_BIT) + { + *ResultAddr = (PageTableEntry & ~(PAGE_SIZE-1)) + + (Addr & (PAGE_SIZE-1)); + return TRUE; + } + } + + return FALSE; +} + +BOOLEAN +NTAPI +KdpSafeReadMemory(ULONG_PTR Addr, LONG Len, PVOID Value) +{ + ULONG_PTR ResultPhysAddr; + + if (!KdpPhysAccess) + { + memcpy(Value, (PVOID)Addr, Len); + return TRUE; + } + + memset(Value, 0, Len); + + if (!KdpTranslateAddress(Addr, &ResultPhysAddr)) + return FALSE; + + switch (Len) + { + case 8: + *((PULONGLONG)Value) = KdpPhysRead(ResultPhysAddr, Len); + break; + case 4: + *((PULONG)Value) = KdpPhysRead(ResultPhysAddr, Len); + break; + case 2: + *((PUSHORT)Value) = KdpPhysRead(ResultPhysAddr, Len); + break; + case 1: + *((PUCHAR)Value) = KdpPhysRead(ResultPhysAddr, Len); + break; + } + + return TRUE; +} + +BOOLEAN +NTAPI +KdpSafeWriteMemory(ULONG_PTR Addr, LONG Len, ULONGLONG Value) +{ + ULONG_PTR ResultPhysAddr; + + if (!KdpPhysAccess) + { + memcpy((PVOID)Addr, &Value, Len); + return TRUE; + } + + if (!KdpTranslateAddress(Addr, &ResultPhysAddr)) + return FALSE; + + KdpPhysWrite(ResultPhysAddr, Len, Value); + return TRUE; +} + +VOID +NTAPI +KdpEnableSafeMem(VOID) +{ + KdpPhysAccess = TRUE; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/kdbg/amd64/dis-asm.h b/reactos/ntoskrnl/kdbg/amd64/dis-asm.h new file mode 100644 index 00000000000..4052910d451 --- /dev/null +++ b/reactos/ntoskrnl/kdbg/amd64/dis-asm.h @@ -0,0 +1,330 @@ +/* Interface between the opcode library and its callers. + + Copyright 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This 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. + + You 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. + + Written by Cygnus Support, 1993. + + The opcode library (libopcodes.a) provides instruction decoders for + a large variety of instruction sets, callable with an identical + interface, for making instruction-processing programs more independent + of the instruction set being processed. */ + +#ifndef DIS_ASM_H +#define DIS_ASM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if 0 +/* #include */ +/* #include "bfd.h" */ +#endif + +typedef int (*fprintf_ftype) PARAMS((PTR, const char*, ...)); + +enum dis_insn_type { + dis_noninsn, /* Not a valid instruction */ + dis_nonbranch, /* Not a branch instruction */ + dis_branch, /* Unconditional branch */ + dis_condbranch, /* Conditional branch */ + dis_jsr, /* Jump to subroutine */ + dis_condjsr, /* Conditional jump to subroutine */ + dis_dref, /* Data reference instruction */ + dis_dref2 /* Two data references in instruction */ +}; + +/* This struct is passed into the instruction decoding routine, + and is passed back out into each callback. The various fields are used + for conveying information from your main routine into your callbacks, + for passing information into the instruction decoders (such as the + addresses of the callback functions), or for passing information + back from the instruction decoders to their callers. + + It must be initialized before it is first passed; this can be done + by hand, or using one of the initialization macros below. */ + +typedef struct disassemble_info { + fprintf_ftype fprintf_func; + PTR stream; + PTR application_data; + + /* Target description. We could replace this with a pointer to the bfd, + but that would require one. There currently isn't any such requirement + so to avoid introducing one we record these explicitly. */ + /* The bfd_flavour. This can be bfd_target_unknown_flavour. */ + enum bfd_flavour flavour; + /* The bfd_arch value. */ + enum bfd_architecture arch; + /* The bfd_mach value. */ + unsigned long mach; +#if 0 + enum bfd_endian endian; +#endif + /* An arch/mach-specific bitmask of selected instruction subsets, mainly + for processors with run-time-switchable instruction sets. The default, + zero, means that there is no constraint. CGEN-based opcodes ports + may use ISA_foo masks. */ + unsigned long insn_sets; + +#if 0 + /* Some targets need information about the current section to accurately + display insns. If this is NULL, the target disassembler function + will have to make its best guess. */ + asection *section; + + /* An array of pointers to symbols either at the location being disassembled + or at the start of the function being disassembled. The array is sorted + so that the first symbol is intended to be the one used. The others are + present for any misc. purposes. This is not set reliably, but if it is + not NULL, it is correct. */ + asymbol **symbols; + /* Number of symbols in array. */ + int num_symbols; +#endif + /* For use by the disassembler. + The top 16 bits are reserved for public use (and are documented here). + The bottom 16 bits are for the internal use of the disassembler. */ + unsigned long flags; +#define INSN_HAS_RELOC 0x80000000 + PTR private_data; + + /* Function used to get bytes to disassemble. MEMADDR is the + address of the stuff to be disassembled, MYADDR is the address to + put the bytes in, and LENGTH is the number of bytes to read. + INFO is a pointer to this struct. + Returns an errno value or 0 for success. */ + int (*read_memory_func) + PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, + struct disassemble_info *info)); + + /* Function which should be called if we get an error that we can't + recover from. STATUS is the errno value from read_memory_func and + MEMADDR is the address that we were trying to read. INFO is a + pointer to this struct. */ + void (*memory_error_func) + PARAMS ((int status, bfd_vma memaddr, struct disassemble_info *info)); + + /* Function called to print ADDR. */ + void (*print_address_func) + PARAMS ((bfd_vma addr, struct disassemble_info *info)); + + /* Function called to determine if there is a symbol at the given ADDR. + If there is, the function returns 1, otherwise it returns 0. + This is used by ports which support an overlay manager where + the overlay number is held in the top part of an address. In + some circumstances we want to include the overlay number in the + address, (normally because there is a symbol associated with + that address), but sometimes we want to mask out the overlay bits. */ + int (* symbol_at_address_func) + PARAMS ((bfd_vma addr, struct disassemble_info * info)); + + /* These are for buffer_read_memory. */ + bfd_byte *buffer; + bfd_vma buffer_vma; + unsigned int buffer_length; + + /* This variable may be set by the instruction decoder. It suggests + the number of bytes objdump should display on a single line. If + the instruction decoder sets this, it should always set it to + the same value in order to get reasonable looking output. */ + int bytes_per_line; + + /* the next two variables control the way objdump displays the raw data */ + /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */ + /* output will look like this: + 00: 00000000 00000000 + with the chunks displayed according to "display_endian". */ + int bytes_per_chunk; + enum bfd_endian display_endian; + + /* Number of octets per incremented target address + Normally one, but some DSPs have byte sizes of 16 or 32 bits. */ + unsigned int octets_per_byte; + + /* Results from instruction decoders. Not all decoders yet support + this information. This info is set each time an instruction is + decoded, and is only valid for the last such instruction. + + To determine whether this decoder supports this information, set + insn_info_valid to 0, decode an instruction, then check it. */ + + char insn_info_valid; /* Branch info has been set. */ + char branch_delay_insns; /* How many sequential insn's will run before + a branch takes effect. (0 = normal) */ + char data_size; /* Size of data reference in insn, in bytes */ + enum dis_insn_type insn_type; /* Type of instruction */ + bfd_vma target; /* Target address of branch or dref, if known; + zero if unknown. */ + bfd_vma target2; /* Second target address for dref2 */ + + /* Command line options specific to the target disassembler. */ + char * disassembler_options; + +} disassemble_info; + + +/* Standard disassemblers. Disassemble one instruction at the given + target address. Return number of octets processed. */ +typedef int (*disassembler_ftype) + PARAMS((bfd_vma, disassemble_info *)); + +extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386 PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_i386_att PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386_intel PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_ia64 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i370 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68hc11 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68hc12 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8001 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8002 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300h PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300s PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8500 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_arm PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_arm PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sparc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_avr PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_d10v PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_d30v PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_dlx PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_fr30 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i860 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_ip2k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m32r PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mcore PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mmix PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mn10200 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_mn10300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_msp430 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_ns32k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_openrisc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_or32 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_or32 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_pdp11 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_pj PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_rs6000 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_s390 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic30 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic4x PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic54x PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_tic80 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_v850 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_vax PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_w65 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_xstormy16 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh64 PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_sh64x_media PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_frv PARAMS ((bfd_vma, disassemble_info *)); +extern int print_insn_iq2000 PARAMS ((bfd_vma, disassemble_info *)); + +extern disassembler_ftype arc_get_disassembler PARAMS ((void *)); +extern disassembler_ftype cris_get_disassembler PARAMS ((bfd *)); + +extern void print_mips_disassembler_options PARAMS ((FILE *)); +extern void print_ppc_disassembler_options PARAMS ((FILE *)); +extern void print_arm_disassembler_options PARAMS ((FILE *)); +extern void parse_arm_disassembler_option PARAMS ((char *)); +extern int get_arm_regname_num_options PARAMS ((void)); +extern int set_arm_regname_option PARAMS ((int)); +extern int get_arm_regnames PARAMS ((int, const char **, const char **, const char ***)); + +/* Fetch the disassembler for a given BFD, if that support is available. */ +extern disassembler_ftype disassembler PARAMS ((bfd *)); + +/* Document any target specific options available from the disassembler. */ +extern void disassembler_usage PARAMS ((FILE *)); + + +/* This block of definitions is for particular callers who read instructions + into a buffer before calling the instruction decoder. */ + +/* Here is a function which callers may wish to use for read_memory_func. + It gets bytes from a buffer. */ +extern int buffer_read_memory + PARAMS ((bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *)); + +/* This function goes with buffer_read_memory. + It prints a message using info->fprintf_func and info->stream. */ +extern void perror_memory PARAMS ((int, bfd_vma, struct disassemble_info *)); + + +/* Just print the address in hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ +extern void generic_print_address + PARAMS ((bfd_vma, struct disassemble_info *)); + +/* Always true. */ +extern int generic_symbol_at_address + PARAMS ((bfd_vma, struct disassemble_info *)); + +/* Macro to initialize a disassemble_info struct. This should be called + by all applications creating such a struct. */ +#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \ + (INFO).flavour = bfd_target_unknown_flavour, \ + (INFO).arch = bfd_arch_unknown, \ + (INFO).mach = 0, \ + (INFO).insn_sets = 0, \ + (INFO).endian = BFD_ENDIAN_UNKNOWN, \ + (INFO).octets_per_byte = 1, \ + INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) + +/* Call this macro to initialize only the internal variables for the + disassembler. Architecture dependent things such as byte order, or machine + variant are not touched by this macro. This makes things much easier for + GDB which must initialize these things separately. */ + +#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \ + (INFO).fprintf_func = (fprintf_ftype)(FPRINTF_FUNC), \ + (INFO).stream = (PTR)(STREAM), \ + (INFO).section = NULL, \ + (INFO).symbols = NULL, \ + (INFO).num_symbols = 0, \ + (INFO).private_data = NULL, \ + (INFO).buffer = NULL, \ + (INFO).buffer_vma = 0, \ + (INFO).buffer_length = 0, \ + (INFO).read_memory_func = buffer_read_memory, \ + (INFO).memory_error_func = perror_memory, \ + (INFO).print_address_func = generic_print_address, \ + (INFO).symbol_at_address_func = generic_symbol_at_address, \ + (INFO).flags = 0, \ + (INFO).bytes_per_line = 0, \ + (INFO).bytes_per_chunk = 0, \ + (INFO).display_endian = BFD_ENDIAN_UNKNOWN, \ + (INFO).disassembler_options = NULL, \ + (INFO).insn_info_valid = 0 + +#ifdef __cplusplus +} +#endif + +#endif /* ! defined (DIS_ASM_H) */ diff --git a/reactos/ntoskrnl/kdbg/amd64/i386-dis.c b/reactos/ntoskrnl/kdbg/amd64/i386-dis.c new file mode 100644 index 00000000000..ac9d153d3dc --- /dev/null +++ b/reactos/ntoskrnl/kdbg/amd64/i386-dis.c @@ -0,0 +1,4300 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/kdbg/i386/i386-dis.c + * PURPOSE: No purpose listed. + * + * PROGRAMMERS: No programmer listed. + */ + +#include +#define NDEBUG +#include + +/* ReactOS compatibility stuff. */ +#define PARAMS(X) X +#define PTR void* +typedef enum bfd_flavour +{ + bfd_target_unknown_flavour, +} bfd_flavour; +typedef enum bfd_architecture +{ + bfd_arch_i386, +} bfd_arch; +typedef ULONG_PTR bfd_vma; +typedef unsigned char bfd_byte; +enum bfd_endian { BFD_ENDIAN_BIG, BIG_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; +typedef void* bfd; +typedef LONG_PTR bfd_signed_vma; +#define bfd_mach_x86_64_intel_syntax 0 +#define bfd_mach_x86_64 1 +#define bfd_mach_i386_i386_intel_syntax 2 +#define bfd_mach_i386_i386 3 +#define bfd_mach_i386_i8086 4 +#define abort() DbgBreakPoint(); +#define _(X) X +#define ATTRIBUTE_UNUSED +extern int sprintf(char *str, const char *format, ...); +#define sprintf_vma(BUF, VMA) sprintf(BUF, "%p", VMA) +#include +#define _INC_SETJMPEX +struct disassemble_info; + +int +print_insn_i386 (bfd_vma pc, struct disassemble_info *info); + +int +KdbpPrintDisasm(void* Ignored, const char* fmt, ...) +{ + va_list ap; + static char buffer[256]; + int ret; + + va_start(ap, fmt); + ret = vsprintf(buffer, fmt, ap); + DbgPrint("%s", buffer); + va_end(ap); + return(ret); +} + +int +KdbpNopPrintDisasm(void* Ignored, const char* fmt, ...) +{ + return(0); +} + +static int +KdbpReadMemory(ULONG_PTR Addr, unsigned char* Data, unsigned int Length, + struct disassemble_info * Ignored) +{ + return KdbpSafeReadMemory(Data, (void *)Addr, Length); /* 0 means no error */ +} + +static void +KdbpMemoryError(int Status, ULONG_PTR Addr, + struct disassemble_info * Ignored) +{ +} + +static void +KdbpPrintAddressInCode(ULONG_PTR Addr, struct disassemble_info * Ignored) +{ + if (!KdbSymPrintAddress((void*)Addr)) + { + DbgPrint("<%p>", Addr); + } +} + +static void +KdbpNopPrintAddress(ULONG_PTR Addr, struct disassemble_info * Ignored) +{ +} + +#include "dis-asm.h" + +LONG +KdbpGetInstLength(IN ULONG_PTR Address) +{ + disassemble_info info; + + info.fprintf_func = KdbpNopPrintDisasm; + info.stream = NULL; + info.application_data = NULL; + info.flavour = bfd_target_unknown_flavour; + info.arch = bfd_arch_i386; + info.mach = bfd_mach_x86_64; + info.insn_sets = 0; + info.flags = 0; + info.read_memory_func = KdbpReadMemory; + info.memory_error_func = KdbpMemoryError; + info.print_address_func = KdbpNopPrintAddress; + info.symbol_at_address_func = NULL; + info.buffer = NULL; + info.buffer_vma = info.buffer_length = 0; + info.bytes_per_chunk = 0; + info.display_endian = BIG_ENDIAN_LITTLE; + info.disassembler_options = NULL; + + return(print_insn_i386(Address, &info)); +} + +LONG +KdbpDisassemble(IN ULONG_PTR Address, IN ULONG IntelSyntax) +{ + disassemble_info info; + + info.fprintf_func = KdbpPrintDisasm; + info.stream = NULL; + info.application_data = NULL; + info.flavour = bfd_target_unknown_flavour; + info.arch = bfd_arch_i386; + info.mach = IntelSyntax ? bfd_mach_i386_i386_intel_syntax : bfd_mach_i386_i386; + info.insn_sets = 0; + info.flags = 0; + info.read_memory_func = KdbpReadMemory; + info.memory_error_func = KdbpMemoryError; + info.print_address_func = KdbpPrintAddressInCode; + info.symbol_at_address_func = NULL; + info.buffer = NULL; + info.buffer_vma = info.buffer_length = 0; + info.bytes_per_chunk = 0; + info.display_endian = BIG_ENDIAN_LITTLE; + info.disassembler_options = NULL; + + return(print_insn_i386(Address, &info)); +} + +/* Print i386 instructions for GDB, the GNU debugger. + Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2001 + Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This 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. + +You 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. +*/ + +/* + * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) + * July 1988 + * modified by John Hassey (hassey@dg-rtp.dg.com) + * x86-64 support added by Jan Hubicka (jh@suse.cz) + */ + +/* + * The main tables describing the instructions is essentially a copy + * of the "Opcode Map" chapter (Appendix A) of the Intel 80386 + * Programmers Manual. Usually, there is a capital letter, followed + * by a small letter. The capital letter tell the addressing mode, + * and the small letter tells about the operand size. Refer to + * the Intel manual for details. + */ + +#include "dis-asm.h" +#if 0 +#include "sysdep.h" +#include "opintl.h" +#endif + +#define MAXLEN 20 + +#include + +#ifndef UNIXWARE_COMPAT +/* Set non-zero for broken, compatible instructions. Set to zero for + non-broken opcodes. */ +#define UNIXWARE_COMPAT 1 +#endif + +static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *)); +static void ckprefix PARAMS ((void)); +static const char *prefix_name PARAMS ((int, int)); +static int print_insn PARAMS ((bfd_vma, disassemble_info *)); +static void dofloat PARAMS ((int)); +static void OP_ST PARAMS ((int, int)); +static void OP_STi PARAMS ((int, int)); +static int putop PARAMS ((const char *, int)); +static void oappend PARAMS ((const char *)); +static void append_seg PARAMS ((void)); +static void OP_indirE PARAMS ((int, int)); +static void print_operand_value PARAMS ((char *, int, bfd_vma)); +static void OP_E PARAMS ((int, int)); +static void OP_G PARAMS ((int, int)); +static bfd_vma get64 PARAMS ((void)); +static bfd_signed_vma get32 PARAMS ((void)); +static bfd_signed_vma get32s PARAMS ((void)); +static int get16 PARAMS ((void)); +static void set_op PARAMS ((bfd_vma, int)); +static void OP_REG PARAMS ((int, int)); +static void OP_IMREG PARAMS ((int, int)); +static void OP_I PARAMS ((int, int)); +static void OP_I64 PARAMS ((int, int)); +static void OP_sI PARAMS ((int, int)); +static void OP_J PARAMS ((int, int)); +static void OP_SEG PARAMS ((int, int)); +static void OP_DIR PARAMS ((int, int)); +static void OP_OFF PARAMS ((int, int)); +static void OP_OFF64 PARAMS ((int, int)); +static void ptr_reg PARAMS ((int, int)); +static void OP_ESreg PARAMS ((int, int)); +static void OP_DSreg PARAMS ((int, int)); +static void OP_C PARAMS ((int, int)); +static void OP_D PARAMS ((int, int)); +static void OP_T PARAMS ((int, int)); +static void OP_Rd PARAMS ((int, int)); +static void OP_MMX PARAMS ((int, int)); +static void OP_XMM PARAMS ((int, int)); +static void OP_EM PARAMS ((int, int)); +static void OP_EX PARAMS ((int, int)); +static void OP_MS PARAMS ((int, int)); +static void OP_XS PARAMS ((int, int)); +static void OP_3DNowSuffix PARAMS ((int, int)); +static void OP_SIMD_Suffix PARAMS ((int, int)); +static void SIMD_Fixup PARAMS ((int, int)); +static void BadOp PARAMS ((void)); + +struct dis_private { + /* Points to first byte not fetched. */ + bfd_byte *max_fetched; + bfd_byte the_buffer[MAXLEN]; + bfd_vma insn_start; + int orig_sizeflag; + jmp_buf bailout; +}; + +/* The opcode for the fwait instruction, which we treat as a prefix + when we can. */ +#define FWAIT_OPCODE (0x9b) + +/* Set to 1 for 64bit mode disassembly. */ +static int mode_64bit = 1; + +/* Flags for the prefixes for the current instruction. See below. */ +static int prefixes; + +/* REX prefix the current instruction. See below. */ +static int rex; +/* Bits of REX we've already used. */ +static int rex_used; +#define REX_MODE64 8 +#define REX_EXTX 4 +#define REX_EXTY 2 +#define REX_EXTZ 1 +/* Mark parts used in the REX prefix. When we are testing for + empty prefix (for 8bit register REX extension), just mask it + out. Otherwise test for REX bit is excuse for existence of REX + only in case value is nonzero. */ +#define USED_REX(value) \ + { \ + if (value) \ + rex_used |= (rex & value) ? (value) | 0x40 : 0; \ + else \ + rex_used |= 0x40; \ + } + +/* Flags for prefixes which we somehow handled when printing the + current instruction. */ +static int used_prefixes; + +/* Flags stored in PREFIXES. */ +#define PREFIX_REPZ 1 +#define PREFIX_REPNZ 2 +#define PREFIX_LOCK 4 +#define PREFIX_CS 8 +#define PREFIX_SS 0x10 +#define PREFIX_DS 0x20 +#define PREFIX_ES 0x40 +#define PREFIX_FS 0x80 +#define PREFIX_GS 0x100 +#define PREFIX_DATA 0x200 +#define PREFIX_ADDR 0x400 +#define PREFIX_FWAIT 0x800 + +/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) + to ADDR (exclusive) are valid. Returns 1 for success, longjmps + on error. */ +#define FETCH_DATA(info, addr) \ + ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \ + ? 1 : fetch_data ((info), (addr))) + +static int +fetch_data (info, addr) + struct disassemble_info *info; + bfd_byte *addr; +{ + int status; + struct dis_private *priv = (struct dis_private *) info->private_data; + bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); + + status = (*info->read_memory_func) (start, + priv->max_fetched, + addr - priv->max_fetched, + info); + if (status != 0) + { + /* If we did manage to read at least one byte, then + print_insn_i386 will do something sensible. Otherwise, print + an error. We do that here because this is where we know + STATUS. */ + if (priv->max_fetched == priv->the_buffer) + (*info->memory_error_func) (status, start, info); + longjmp (priv->bailout, 1); + } + else + priv->max_fetched = addr; + return 1; +} + +#define XX NULL, 0 + +#define Eb OP_E, b_mode +#define Ev OP_E, v_mode +#define Ed OP_E, d_mode +#define indirEb OP_indirE, b_mode +#define indirEv OP_indirE, v_mode +#define Ew OP_E, w_mode +#define Ma OP_E, v_mode +#define M OP_E, 0 /* lea, lgdt, etc. */ +#define Mp OP_E, 0 /* 32 or 48 bit memory operand for LDS, LES etc */ +#define Gb OP_G, b_mode +#define Gv OP_G, v_mode +#define Gd OP_G, d_mode +#define Gw OP_G, w_mode +#define Rd OP_Rd, d_mode +#define Rm OP_Rd, m_mode +#define Ib OP_I, b_mode +#define sIb OP_sI, b_mode /* sign extened byte */ +#define Iv OP_I, v_mode +#define Iq OP_I, q_mode +#define Iv64 OP_I64, v_mode +#define Iw OP_I, w_mode +#define Jb OP_J, b_mode +#define Jv OP_J, v_mode +#define Cm OP_C, m_mode +#define Dm OP_D, m_mode +#define Td OP_T, d_mode + +#define RMeAX OP_REG, eAX_reg +#define RMeBX OP_REG, eBX_reg +#define RMeCX OP_REG, eCX_reg +#define RMeDX OP_REG, eDX_reg +#define RMeSP OP_REG, eSP_reg +#define RMeBP OP_REG, eBP_reg +#define RMeSI OP_REG, eSI_reg +#define RMeDI OP_REG, eDI_reg +#define RMrAX OP_REG, rAX_reg +#define RMrBX OP_REG, rBX_reg +#define RMrCX OP_REG, rCX_reg +#define RMrDX OP_REG, rDX_reg +#define RMrSP OP_REG, rSP_reg +#define RMrBP OP_REG, rBP_reg +#define RMrSI OP_REG, rSI_reg +#define RMrDI OP_REG, rDI_reg +#define RMAL OP_REG, al_reg +#define RMAL OP_REG, al_reg +#define RMCL OP_REG, cl_reg +#define RMDL OP_REG, dl_reg +#define RMBL OP_REG, bl_reg +#define RMAH OP_REG, ah_reg +#define RMCH OP_REG, ch_reg +#define RMDH OP_REG, dh_reg +#define RMBH OP_REG, bh_reg +#define RMAX OP_REG, ax_reg +#define RMDX OP_REG, dx_reg + +#define eAX OP_IMREG, eAX_reg +#define eBX OP_IMREG, eBX_reg +#define eCX OP_IMREG, eCX_reg +#define eDX OP_IMREG, eDX_reg +#define eSP OP_IMREG, eSP_reg +#define eBP OP_IMREG, eBP_reg +#define eSI OP_IMREG, eSI_reg +#define eDI OP_IMREG, eDI_reg +#define AL OP_IMREG, al_reg +#define AL OP_IMREG, al_reg +#define CL OP_IMREG, cl_reg +#define DL OP_IMREG, dl_reg +#define BL OP_IMREG, bl_reg +#define AH OP_IMREG, ah_reg +#define CH OP_IMREG, ch_reg +#define DH OP_IMREG, dh_reg +#define BH OP_IMREG, bh_reg +#define AX OP_IMREG, ax_reg +#define DX OP_IMREG, dx_reg +#define indirDX OP_IMREG, indir_dx_reg + +#define Sw OP_SEG, w_mode +#define Ap OP_DIR, 0 +#define Ob OP_OFF, b_mode +#define Ob64 OP_OFF64, b_mode +#define Ov OP_OFF, v_mode +#define Ov64 OP_OFF64, v_mode +#define Xb OP_DSreg, eSI_reg +#define Xv OP_DSreg, eSI_reg +#define Yb OP_ESreg, eDI_reg +#define Yv OP_ESreg, eDI_reg +#define DSBX OP_DSreg, eBX_reg + +#define es OP_REG, es_reg +#define ss OP_REG, ss_reg +#define cs OP_REG, cs_reg +#define ds OP_REG, ds_reg +#define fs OP_REG, fs_reg +#define gs OP_REG, gs_reg + +#define MX OP_MMX, 0 +#define XM OP_XMM, 0 +#define EM OP_EM, v_mode +#define EX OP_EX, v_mode +#define MS OP_MS, v_mode +#define XS OP_XS, v_mode +#define None OP_E, 0 +#define OPSUF OP_3DNowSuffix, 0 +#define OPSIMD OP_SIMD_Suffix, 0 + +#define cond_jump_flag NULL, cond_jump_mode +#define loop_jcxz_flag NULL, loop_jcxz_mode + +/* bits in sizeflag */ +#define SUFFIX_ALWAYS 4 +#define AFLAG 2 +#define DFLAG 1 + +#define b_mode 1 /* byte operand */ +#define v_mode 2 /* operand size depends on prefixes */ +#define w_mode 3 /* word operand */ +#define d_mode 4 /* double word operand */ +#define q_mode 5 /* quad word operand */ +#define x_mode 6 +#define m_mode 7 /* d_mode in 32bit, q_mode in 64bit mode. */ +#define cond_jump_mode 8 +#define loop_jcxz_mode 9 + +#define es_reg 100 +#define cs_reg 101 +#define ss_reg 102 +#define ds_reg 103 +#define fs_reg 104 +#define gs_reg 105 + +#define eAX_reg 108 +#define eCX_reg 109 +#define eDX_reg 110 +#define eBX_reg 111 +#define eSP_reg 112 +#define eBP_reg 113 +#define eSI_reg 114 +#define eDI_reg 115 + +#define al_reg 116 +#define cl_reg 117 +#define dl_reg 118 +#define bl_reg 119 +#define ah_reg 120 +#define ch_reg 121 +#define dh_reg 122 +#define bh_reg 123 + +#define ax_reg 124 +#define cx_reg 125 +#define dx_reg 126 +#define bx_reg 127 +#define sp_reg 128 +#define bp_reg 129 +#define si_reg 130 +#define di_reg 131 + +#define rAX_reg 132 +#define rCX_reg 133 +#define rDX_reg 134 +#define rBX_reg 135 +#define rSP_reg 136 +#define rBP_reg 137 +#define rSI_reg 138 +#define rDI_reg 139 + +#define indir_dx_reg 150 + +#define FLOATCODE 1 +#define USE_GROUPS 2 +#define USE_PREFIX_USER_TABLE 3 +#define X86_64_SPECIAL 4 + +#define FLOAT NULL, NULL, FLOATCODE, NULL, 0, NULL, 0 + +#define GRP1b NULL, NULL, USE_GROUPS, NULL, 0, NULL, 0 +#define GRP1S NULL, NULL, USE_GROUPS, NULL, 1, NULL, 0 +#define GRP1Ss NULL, NULL, USE_GROUPS, NULL, 2, NULL, 0 +#define GRP2b NULL, NULL, USE_GROUPS, NULL, 3, NULL, 0 +#define GRP2S NULL, NULL, USE_GROUPS, NULL, 4, NULL, 0 +#define GRP2b_one NULL, NULL, USE_GROUPS, NULL, 5, NULL, 0 +#define GRP2S_one NULL, NULL, USE_GROUPS, NULL, 6, NULL, 0 +#define GRP2b_cl NULL, NULL, USE_GROUPS, NULL, 7, NULL, 0 +#define GRP2S_cl NULL, NULL, USE_GROUPS, NULL, 8, NULL, 0 +#define GRP3b NULL, NULL, USE_GROUPS, NULL, 9, NULL, 0 +#define GRP3S NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0 +#define GRP4 NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0 +#define GRP5 NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0 +#define GRP6 NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0 +#define GRP7 NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0 +#define GRP8 NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0 +#define GRP9 NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0 +#define GRP10 NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0 +#define GRP11 NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0 +#define GRP12 NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0 +#define GRP13 NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0 +#define GRP14 NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0 +#define GRPAMD NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0 + +#define PREGRP0 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 0, NULL, 0 +#define PREGRP1 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 1, NULL, 0 +#define PREGRP2 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 2, NULL, 0 +#define PREGRP3 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 3, NULL, 0 +#define PREGRP4 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 4, NULL, 0 +#define PREGRP5 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 5, NULL, 0 +#define PREGRP6 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 6, NULL, 0 +#define PREGRP7 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 7, NULL, 0 +#define PREGRP8 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 8, NULL, 0 +#define PREGRP9 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 9, NULL, 0 +#define PREGRP10 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0 +#define PREGRP11 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0 +#define PREGRP12 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0 +#define PREGRP13 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0 +#define PREGRP14 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0 +#define PREGRP15 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0 +#define PREGRP16 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0 +#define PREGRP17 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0 +#define PREGRP18 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0 +#define PREGRP19 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0 +#define PREGRP20 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0 +#define PREGRP21 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0 +#define PREGRP22 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0 +#define PREGRP23 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0 +#define PREGRP24 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0 +#define PREGRP25 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0 +#define PREGRP26 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0 + +#define X86_64_0 NULL, NULL, X86_64_SPECIAL, NULL, 0, NULL, 0 + +typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag)); + +struct dis386 { + const char *name; + op_rtn op1; + int bytemode1; + op_rtn op2; + int bytemode2; + op_rtn op3; + int bytemode3; +}; + +/* Upper case letters in the instruction names here are macros. + 'A' => print 'b' if no register operands or suffix_always is true + 'B' => print 'b' if suffix_always is true + 'E' => print 'e' if 32-bit form of jcxz + 'F' => print 'w' or 'l' depending on address size prefix (loop insns) + 'H' => print ",pt" or ",pn" branch hint + 'L' => print 'l' if suffix_always is true + 'N' => print 'n' if instruction has no wait "prefix" + 'O' => print 'd', or 'o' + 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix, + . or suffix_always is true. print 'q' if rex prefix is present. + 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always + . is true + 'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode) + 'S' => print 'w', 'l' or 'q' if suffix_always is true + 'T' => print 'q' in 64bit mode and behave as 'P' otherwise + 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise + 'X' => print 's', 'd' depending on data16 prefix (for XMM) + 'W' => print 'b' or 'w' ("w" or "de" in intel mode) + 'Y' => 'q' if instruction has an REX 64bit overwrite prefix + + Many of the above letters print nothing in Intel mode. See "putop" + for the details. + + Braces '{' and '}', and vertical bars '|', indicate alternative + mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel + modes. In cases where there are only two alternatives, the X86_64 + instruction is reserved, and "(bad)" is printed. +*/ + +static const struct dis386 dis386[] = { + /* 00 */ + { "addB", Eb, Gb, XX }, + { "addS", Ev, Gv, XX }, + { "addB", Gb, Eb, XX }, + { "addS", Gv, Ev, XX }, + { "addB", AL, Ib, XX }, + { "addS", eAX, Iv, XX }, + { "push{T|}", es, XX, XX }, + { "pop{T|}", es, XX, XX }, + /* 08 */ + { "orB", Eb, Gb, XX }, + { "orS", Ev, Gv, XX }, + { "orB", Gb, Eb, XX }, + { "orS", Gv, Ev, XX }, + { "orB", AL, Ib, XX }, + { "orS", eAX, Iv, XX }, + { "push{T|}", cs, XX, XX }, + { "(bad)", XX, XX, XX }, /* 0x0f extended opcode escape */ + /* 10 */ + { "adcB", Eb, Gb, XX }, + { "adcS", Ev, Gv, XX }, + { "adcB", Gb, Eb, XX }, + { "adcS", Gv, Ev, XX }, + { "adcB", AL, Ib, XX }, + { "adcS", eAX, Iv, XX }, + { "push{T|}", ss, XX, XX }, + { "popT|}", ss, XX, XX }, + /* 18 */ + { "sbbB", Eb, Gb, XX }, + { "sbbS", Ev, Gv, XX }, + { "sbbB", Gb, Eb, XX }, + { "sbbS", Gv, Ev, XX }, + { "sbbB", AL, Ib, XX }, + { "sbbS", eAX, Iv, XX }, + { "push{T|}", ds, XX, XX }, + { "pop{T|}", ds, XX, XX }, + /* 20 */ + { "andB", Eb, Gb, XX }, + { "andS", Ev, Gv, XX }, + { "andB", Gb, Eb, XX }, + { "andS", Gv, Ev, XX }, + { "andB", AL, Ib, XX }, + { "andS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG ES prefix */ + { "daa{|}", XX, XX, XX }, + /* 28 */ + { "subB", Eb, Gb, XX }, + { "subS", Ev, Gv, XX }, + { "subB", Gb, Eb, XX }, + { "subS", Gv, Ev, XX }, + { "subB", AL, Ib, XX }, + { "subS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG CS prefix */ + { "das{|}", XX, XX, XX }, + /* 30 */ + { "xorB", Eb, Gb, XX }, + { "xorS", Ev, Gv, XX }, + { "xorB", Gb, Eb, XX }, + { "xorS", Gv, Ev, XX }, + { "xorB", AL, Ib, XX }, + { "xorS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG SS prefix */ + { "aaa{|}", XX, XX, XX }, + /* 38 */ + { "cmpB", Eb, Gb, XX }, + { "cmpS", Ev, Gv, XX }, + { "cmpB", Gb, Eb, XX }, + { "cmpS", Gv, Ev, XX }, + { "cmpB", AL, Ib, XX }, + { "cmpS", eAX, Iv, XX }, + { "(bad)", XX, XX, XX }, /* SEG DS prefix */ + { "aas{|}", XX, XX, XX }, + /* 40 */ + { "inc{S|}", RMeAX, XX, XX }, + { "inc{S|}", RMeCX, XX, XX }, + { "inc{S|}", RMeDX, XX, XX }, + { "inc{S|}", RMeBX, XX, XX }, + { "inc{S|}", RMeSP, XX, XX }, + { "inc{S|}", RMeBP, XX, XX }, + { "inc{S|}", RMeSI, XX, XX }, + { "inc{S|}", RMeDI, XX, XX }, + /* 48 */ + { "dec{S|}", RMeAX, XX, XX }, + { "dec{S|}", RMeCX, XX, XX }, + { "dec{S|}", RMeDX, XX, XX }, + { "dec{S|}", RMeBX, XX, XX }, + { "dec{S|}", RMeSP, XX, XX }, + { "dec{S|}", RMeBP, XX, XX }, + { "dec{S|}", RMeSI, XX, XX }, + { "dec{S|}", RMeDI, XX, XX }, + /* 50 */ + { "pushS", RMrAX, XX, XX }, + { "pushS", RMrCX, XX, XX }, + { "pushS", RMrDX, XX, XX }, + { "pushS", RMrBX, XX, XX }, + { "pushS", RMrSP, XX, XX }, + { "pushS", RMrBP, XX, XX }, + { "pushS", RMrSI, XX, XX }, + { "pushS", RMrDI, XX, XX }, + /* 58 */ + { "popS", RMrAX, XX, XX }, + { "popS", RMrCX, XX, XX }, + { "popS", RMrDX, XX, XX }, + { "popS", RMrBX, XX, XX }, + { "popS", RMrSP, XX, XX }, + { "popS", RMrBP, XX, XX }, + { "popS", RMrSI, XX, XX }, + { "popS", RMrDI, XX, XX }, + /* 60 */ + { "pusha{P|}", XX, XX, XX }, + { "popa{P|}", XX, XX, XX }, + { "bound{S|}", Gv, Ma, XX }, + { X86_64_0 }, + { "(bad)", XX, XX, XX }, /* seg fs */ + { "(bad)", XX, XX, XX }, /* seg gs */ + { "(bad)", XX, XX, XX }, /* op size prefix */ + { "(bad)", XX, XX, XX }, /* adr size prefix */ + /* 68 */ + { "pushT", Iq, XX, XX }, + { "imulS", Gv, Ev, Iv }, + { "pushT", sIb, XX, XX }, + { "imulS", Gv, Ev, sIb }, + { "ins{b||b|}", Yb, indirDX, XX }, + { "ins{R||R|}", Yv, indirDX, XX }, + { "outs{b||b|}", indirDX, Xb, XX }, + { "outs{R||R|}", indirDX, Xv, XX }, + /* 70 */ + { "joH", Jb, XX, cond_jump_flag }, + { "jnoH", Jb, XX, cond_jump_flag }, + { "jbH", Jb, XX, cond_jump_flag }, + { "jaeH", Jb, XX, cond_jump_flag }, + { "jeH", Jb, XX, cond_jump_flag }, + { "jneH", Jb, XX, cond_jump_flag }, + { "jbeH", Jb, XX, cond_jump_flag }, + { "jaH", Jb, XX, cond_jump_flag }, + /* 78 */ + { "jsH", Jb, XX, cond_jump_flag }, + { "jnsH", Jb, XX, cond_jump_flag }, + { "jpH", Jb, XX, cond_jump_flag }, + { "jnpH", Jb, XX, cond_jump_flag }, + { "jlH", Jb, XX, cond_jump_flag }, + { "jgeH", Jb, XX, cond_jump_flag }, + { "jleH", Jb, XX, cond_jump_flag }, + { "jgH", Jb, XX, cond_jump_flag }, + /* 80 */ + { GRP1b }, + { GRP1S }, + { "(bad)", XX, XX, XX }, + { GRP1Ss }, + { "testB", Eb, Gb, XX }, + { "testS", Ev, Gv, XX }, + { "xchgB", Eb, Gb, XX }, + { "xchgS", Ev, Gv, XX }, + /* 88 */ + { "movB", Eb, Gb, XX }, + { "movS", Ev, Gv, XX }, + { "movB", Gb, Eb, XX }, + { "movS", Gv, Ev, XX }, + { "movQ", Ev, Sw, XX }, + { "leaS", Gv, M, XX }, + { "movQ", Sw, Ev, XX }, + { "popU", Ev, XX, XX }, + /* 90 */ + { "nop", XX, XX, XX }, + /* FIXME: NOP with REPz prefix is called PAUSE. */ + { "xchgS", RMeCX, eAX, XX }, + { "xchgS", RMeDX, eAX, XX }, + { "xchgS", RMeBX, eAX, XX }, + { "xchgS", RMeSP, eAX, XX }, + { "xchgS", RMeBP, eAX, XX }, + { "xchgS", RMeSI, eAX, XX }, + { "xchgS", RMeDI, eAX, XX }, + /* 98 */ + { "cW{tR||tR|}", XX, XX, XX }, + { "cR{tO||tO|}", XX, XX, XX }, + { "lcall{T|}", Ap, XX, XX }, + { "(bad)", XX, XX, XX }, /* fwait */ + { "pushfT", XX, XX, XX }, + { "popfT", XX, XX, XX }, + { "sahf{|}", XX, XX, XX }, + { "lahf{|}", XX, XX, XX }, + /* a0 */ + { "movB", AL, Ob64, XX }, + { "movS", eAX, Ov64, XX }, + { "movB", Ob64, AL, XX }, + { "movS", Ov64, eAX, XX }, + { "movs{b||b|}", Yb, Xb, XX }, + { "movs{R||R|}", Yv, Xv, XX }, + { "cmps{b||b|}", Xb, Yb, XX }, + { "cmps{R||R|}", Xv, Yv, XX }, + /* a8 */ + { "testB", AL, Ib, XX }, + { "testS", eAX, Iv, XX }, + { "stosB", Yb, AL, XX }, + { "stosS", Yv, eAX, XX }, + { "lodsB", AL, Xb, XX }, + { "lodsS", eAX, Xv, XX }, + { "scasB", AL, Yb, XX }, + { "scasS", eAX, Yv, XX }, + /* b0 */ + { "movB", RMAL, Ib, XX }, + { "movB", RMCL, Ib, XX }, + { "movB", RMDL, Ib, XX }, + { "movB", RMBL, Ib, XX }, + { "movB", RMAH, Ib, XX }, + { "movB", RMCH, Ib, XX }, + { "movB", RMDH, Ib, XX }, + { "movB", RMBH, Ib, XX }, + /* b8 */ + { "movS", RMeAX, Iv64, XX }, + { "movS", RMeCX, Iv64, XX }, + { "movS", RMeDX, Iv64, XX }, + { "movS", RMeBX, Iv64, XX }, + { "movS", RMeSP, Iv64, XX }, + { "movS", RMeBP, Iv64, XX }, + { "movS", RMeSI, Iv64, XX }, + { "movS", RMeDI, Iv64, XX }, + /* c0 */ + { GRP2b }, + { GRP2S }, + { "retT", Iw, XX, XX }, + { "retT", XX, XX, XX }, + { "les{S|}", Gv, Mp, XX }, + { "ldsS", Gv, Mp, XX }, + { "movA", Eb, Ib, XX }, + { "movQ", Ev, Iv, XX }, + /* c8 */ + { "enterT", Iw, Ib, XX }, + { "leaveT", XX, XX, XX }, + { "lretP", Iw, XX, XX }, + { "lretP", XX, XX, XX }, + { "int3", XX, XX, XX }, + { "int", Ib, XX, XX }, + { "into{|}", XX, XX, XX }, + { "iretP", XX, XX, XX }, + /* d0 */ + { GRP2b_one }, + { GRP2S_one }, + { GRP2b_cl }, + { GRP2S_cl }, + { "aam{|}", sIb, XX, XX }, + { "aad{|}", sIb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "xlat", DSBX, XX, XX }, + /* d8 */ + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + /* e0 */ + { "loopneFH", Jb, XX, loop_jcxz_flag }, + { "loopeFH", Jb, XX, loop_jcxz_flag }, + { "loopFH", Jb, XX, loop_jcxz_flag }, + { "jEcxzH", Jb, XX, loop_jcxz_flag }, + { "inB", AL, Ib, XX }, + { "inS", eAX, Ib, XX }, + { "outB", Ib, AL, XX }, + { "outS", Ib, eAX, XX }, + /* e8 */ + { "callT", Jv, XX, XX }, + { "jmpT", Jv, XX, XX }, + { "ljmp{T|}", Ap, XX, XX }, + { "jmp", Jb, XX, XX }, + { "inB", AL, indirDX, XX }, + { "inS", eAX, indirDX, XX }, + { "outB", indirDX, AL, XX }, + { "outS", indirDX, eAX, XX }, + /* f0 */ + { "(bad)", XX, XX, XX }, /* lock prefix */ + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, /* repne */ + { "(bad)", XX, XX, XX }, /* repz */ + { "hlt", XX, XX, XX }, + { "cmc", XX, XX, XX }, + { GRP3b }, + { GRP3S }, + /* f8 */ + { "clc", XX, XX, XX }, + { "stc", XX, XX, XX }, + { "cli", XX, XX, XX }, + { "sti", XX, XX, XX }, + { "cld", XX, XX, XX }, + { "std", XX, XX, XX }, + { GRP4 }, + { GRP5 }, +}; + +static const struct dis386 dis386_twobyte[] = { + /* 00 */ + { GRP6 }, + { GRP7 }, + { "larS", Gv, Ew, XX }, + { "lslS", Gv, Ew, XX }, + { "(bad)", XX, XX, XX }, + { "syscall", XX, XX, XX }, + { "clts", XX, XX, XX }, + { "sysretP", XX, XX, XX }, + /* 08 */ + { "invd", XX, XX, XX }, + { "wbinvd", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "ud2a", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { GRPAMD }, + { "femms", XX, XX, XX }, + { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix. */ + /* 10 */ + { PREGRP8 }, + { PREGRP9 }, + { "movlpX", XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */ + { "movlpX", EX, XM, SIMD_Fixup, 'h' }, + { "unpcklpX", XM, EX, XX }, + { "unpckhpX", XM, EX, XX }, + { "movhpX", XM, EX, SIMD_Fixup, 'l' }, + { "movhpX", EX, XM, SIMD_Fixup, 'l' }, + /* 18 */ + { GRP14 }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* 20 */ + { "movL", Rm, Cm, XX }, + { "movL", Rm, Dm, XX }, + { "movL", Cm, Rm, XX }, + { "movL", Dm, Rm, XX }, + { "movL", Rd, Td, XX }, + { "(bad)", XX, XX, XX }, + { "movL", Td, Rd, XX }, + { "(bad)", XX, XX, XX }, + /* 28 */ + { "movapX", XM, EX, XX }, + { "movapX", EX, XM, XX }, + { PREGRP2 }, + { "movntpX", Ev, XM, XX }, + { PREGRP4 }, + { PREGRP3 }, + { "ucomisX", XM,EX, XX }, + { "comisX", XM,EX, XX }, + /* 30 */ + { "wrmsr", XX, XX, XX }, + { "rdtsc", XX, XX, XX }, + { "rdmsr", XX, XX, XX }, + { "rdpmc", XX, XX, XX }, + { "sysenter", XX, XX, XX }, + { "sysexit", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* 38 */ + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* 40 */ + { "cmovo", Gv, Ev, XX }, + { "cmovno", Gv, Ev, XX }, + { "cmovb", Gv, Ev, XX }, + { "cmovae", Gv, Ev, XX }, + { "cmove", Gv, Ev, XX }, + { "cmovne", Gv, Ev, XX }, + { "cmovbe", Gv, Ev, XX }, + { "cmova", Gv, Ev, XX }, + /* 48 */ + { "cmovs", Gv, Ev, XX }, + { "cmovns", Gv, Ev, XX }, + { "cmovp", Gv, Ev, XX }, + { "cmovnp", Gv, Ev, XX }, + { "cmovl", Gv, Ev, XX }, + { "cmovge", Gv, Ev, XX }, + { "cmovle", Gv, Ev, XX }, + { "cmovg", Gv, Ev, XX }, + /* 50 */ + { "movmskpX", Gd, XS, XX }, + { PREGRP13 }, + { PREGRP12 }, + { PREGRP11 }, + { "andpX", XM, EX, XX }, + { "andnpX", XM, EX, XX }, + { "orpX", XM, EX, XX }, + { "xorpX", XM, EX, XX }, + /* 58 */ + { PREGRP0 }, + { PREGRP10 }, + { PREGRP17 }, + { PREGRP16 }, + { PREGRP14 }, + { PREGRP7 }, + { PREGRP5 }, + { PREGRP6 }, + /* 60 */ + { "punpcklbw", MX, EM, XX }, + { "punpcklwd", MX, EM, XX }, + { "punpckldq", MX, EM, XX }, + { "packsswb", MX, EM, XX }, + { "pcmpgtb", MX, EM, XX }, + { "pcmpgtw", MX, EM, XX }, + { "pcmpgtd", MX, EM, XX }, + { "packuswb", MX, EM, XX }, + /* 68 */ + { "punpckhbw", MX, EM, XX }, + { "punpckhwd", MX, EM, XX }, + { "punpckhdq", MX, EM, XX }, + { "packssdw", MX, EM, XX }, + { PREGRP26 }, + { PREGRP24 }, + { "movd", MX, Ed, XX }, + { PREGRP19 }, + /* 70 */ + { PREGRP22 }, + { GRP10 }, + { GRP11 }, + { GRP12 }, + { "pcmpeqb", MX, EM, XX }, + { "pcmpeqw", MX, EM, XX }, + { "pcmpeqd", MX, EM, XX }, + { "emms", XX, XX, XX }, + /* 78 */ + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { PREGRP23 }, + { PREGRP20 }, + /* 80 */ + { "joH", Jv, XX, cond_jump_flag }, + { "jnoH", Jv, XX, cond_jump_flag }, + { "jbH", Jv, XX, cond_jump_flag }, + { "jaeH", Jv, XX, cond_jump_flag }, + { "jeH", Jv, XX, cond_jump_flag }, + { "jneH", Jv, XX, cond_jump_flag }, + { "jbeH", Jv, XX, cond_jump_flag }, + { "jaH", Jv, XX, cond_jump_flag }, + /* 88 */ + { "jsH", Jv, XX, cond_jump_flag }, + { "jnsH", Jv, XX, cond_jump_flag }, + { "jpH", Jv, XX, cond_jump_flag }, + { "jnpH", Jv, XX, cond_jump_flag }, + { "jlH", Jv, XX, cond_jump_flag }, + { "jgeH", Jv, XX, cond_jump_flag }, + { "jleH", Jv, XX, cond_jump_flag }, + { "jgH", Jv, XX, cond_jump_flag }, + /* 90 */ + { "seto", Eb, XX, XX }, + { "setno", Eb, XX, XX }, + { "setb", Eb, XX, XX }, + { "setae", Eb, XX, XX }, + { "sete", Eb, XX, XX }, + { "setne", Eb, XX, XX }, + { "setbe", Eb, XX, XX }, + { "seta", Eb, XX, XX }, + /* 98 */ + { "sets", Eb, XX, XX }, + { "setns", Eb, XX, XX }, + { "setp", Eb, XX, XX }, + { "setnp", Eb, XX, XX }, + { "setl", Eb, XX, XX }, + { "setge", Eb, XX, XX }, + { "setle", Eb, XX, XX }, + { "setg", Eb, XX, XX }, + /* a0 */ + { "pushT", fs, XX, XX }, + { "popT", fs, XX, XX }, + { "cpuid", XX, XX, XX }, + { "btS", Ev, Gv, XX }, + { "shldS", Ev, Gv, Ib }, + { "shldS", Ev, Gv, CL }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + /* a8 */ + { "pushT", gs, XX, XX }, + { "popT", gs, XX, XX }, + { "rsm", XX, XX, XX }, + { "btsS", Ev, Gv, XX }, + { "shrdS", Ev, Gv, Ib }, + { "shrdS", Ev, Gv, CL }, + { GRP13 }, + { "imulS", Gv, Ev, XX }, + /* b0 */ + { "cmpxchgB", Eb, Gb, XX }, + { "cmpxchgS", Ev, Gv, XX }, + { "lssS", Gv, Mp, XX }, + { "btrS", Ev, Gv, XX }, + { "lfsS", Gv, Mp, XX }, + { "lgsS", Gv, Mp, XX }, + { "movz{bR|x|bR|x}", Gv, Eb, XX }, + { "movz{wR|x|wR|x}", Gv, Ew, XX }, /* yes, there really is movzww ! */ + /* b8 */ + { "(bad)", XX, XX, XX }, + { "ud2b", XX, XX, XX }, + { GRP8 }, + { "btcS", Ev, Gv, XX }, + { "bsfS", Gv, Ev, XX }, + { "bsrS", Gv, Ev, XX }, + { "movs{bR|x|bR|x}", Gv, Eb, XX }, + { "movs{wR|x|wR|x}", Gv, Ew, XX }, /* yes, there really is movsww ! */ + /* c0 */ + { "xaddB", Eb, Gb, XX }, + { "xaddS", Ev, Gv, XX }, + { PREGRP1 }, + { "movntiS", Ev, Gv, XX }, + { "pinsrw", MX, Ed, Ib }, + { "pextrw", Gd, MS, Ib }, + { "shufpX", XM, EX, Ib }, + { GRP9 }, + /* c8 */ + { "bswap", RMeAX, XX, XX }, + { "bswap", RMeCX, XX, XX }, + { "bswap", RMeDX, XX, XX }, + { "bswap", RMeBX, XX, XX }, + { "bswap", RMeSP, XX, XX }, + { "bswap", RMeBP, XX, XX }, + { "bswap", RMeSI, XX, XX }, + { "bswap", RMeDI, XX, XX }, + /* d0 */ + { "(bad)", XX, XX, XX }, + { "psrlw", MX, EM, XX }, + { "psrld", MX, EM, XX }, + { "psrlq", MX, EM, XX }, + { "paddq", MX, EM, XX }, + { "pmullw", MX, EM, XX }, + { PREGRP21 }, + { "pmovmskb", Gd, MS, XX }, + /* d8 */ + { "psubusb", MX, EM, XX }, + { "psubusw", MX, EM, XX }, + { "pminub", MX, EM, XX }, + { "pand", MX, EM, XX }, + { "paddusb", MX, EM, XX }, + { "paddusw", MX, EM, XX }, + { "pmaxub", MX, EM, XX }, + { "pandn", MX, EM, XX }, + /* e0 */ + { "pavgb", MX, EM, XX }, + { "psraw", MX, EM, XX }, + { "psrad", MX, EM, XX }, + { "pavgw", MX, EM, XX }, + { "pmulhuw", MX, EM, XX }, + { "pmulhw", MX, EM, XX }, + { PREGRP15 }, + { PREGRP25 }, + /* e8 */ + { "psubsb", MX, EM, XX }, + { "psubsw", MX, EM, XX }, + { "pminsw", MX, EM, XX }, + { "por", MX, EM, XX }, + { "paddsb", MX, EM, XX }, + { "paddsw", MX, EM, XX }, + { "pmaxsw", MX, EM, XX }, + { "pxor", MX, EM, XX }, + /* f0 */ + { "(bad)", XX, XX, XX }, + { "psllw", MX, EM, XX }, + { "pslld", MX, EM, XX }, + { "psllq", MX, EM, XX }, + { "pmuludq", MX, EM, XX }, + { "pmaddwd", MX, EM, XX }, + { "psadbw", MX, EM, XX }, + { PREGRP18 }, + /* f8 */ + { "psubb", MX, EM, XX }, + { "psubw", MX, EM, XX }, + { "psubd", MX, EM, XX }, + { "psubq", MX, EM, XX }, + { "paddb", MX, EM, XX }, + { "paddw", MX, EM, XX }, + { "paddd", MX, EM, XX }, + { "(bad)", XX, XX, XX } +}; + +static const unsigned char onebyte_has_modrm[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */ + /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */ + /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */ + /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */ + /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */ + /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */ + /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */ + /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */ + /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */ + /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */ + /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */ + /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */ + /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */ + /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */ + /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */ + /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +static const unsigned char twobyte_has_modrm[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */ + /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */ + /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */ + /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ + /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */ + /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */ + /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */ + /* 70 */ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, /* 7f */ + /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ + /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */ + /* a0 */ 0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, /* af */ + /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */ + /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */ + /* d0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */ + /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */ + /* f0 */ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +static const unsigned char twobyte_uses_SSE_prefix[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ + /* 10 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ + /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */ + /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ + /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ + /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */ + /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */ + /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */ + /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ + /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ + /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ + /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ + /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ + /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */ + /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */ + /* f0 */ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 /* ff */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +static char obuf[100]; +static char *obufp; +static char scratchbuf[100]; +static unsigned char *start_codep; +static unsigned char *insn_codep; +static unsigned char *codep; +static disassemble_info *the_info; +static int mod; +static int rm; +static int reg; +static unsigned char need_modrm; + +/* If we are accessing mod/rm/reg without need_modrm set, then the + values are stale. Hitting this abort likely indicates that you + need to update onebyte_has_modrm or twobyte_has_modrm. */ +#define MODRM_CHECK if (!need_modrm) abort () + +static const char **names64; +static const char **names32; +static const char **names16; +static const char **names8; +static const char **names8rex; +static const char **names_seg; +static const char **index16; + +static const char *intel_names64[] = { + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" +}; +static const char *intel_names32[] = { + "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", + "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" +}; +static const char *intel_names16[] = { + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", + "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" +}; +static const char *intel_names8[] = { + "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", +}; +static const char *intel_names8rex[] = { + "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", + "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" +}; +static const char *intel_names_seg[] = { + "es", "cs", "ss", "ds", "fs", "gs", "?", "?", +}; +static const char *intel_index16[] = { + "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx" +}; + +static const char *att_names64[] = { + "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +}; +static const char *att_names32[] = { + "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", + "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" +}; +static const char *att_names16[] = { + "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", + "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" +}; +static const char *att_names8[] = { + "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh", +}; +static const char *att_names8rex[] = { + "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", + "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" +}; +static const char *att_names_seg[] = { + "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?", +}; +static const char *att_index16[] = { + "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx" +}; + +static const struct dis386 grps[][8] = { + /* GRP1b */ + { + { "addA", Eb, Ib, XX }, + { "orA", Eb, Ib, XX }, + { "adcA", Eb, Ib, XX }, + { "sbbA", Eb, Ib, XX }, + { "andA", Eb, Ib, XX }, + { "subA", Eb, Ib, XX }, + { "xorA", Eb, Ib, XX }, + { "cmpA", Eb, Ib, XX } + }, + /* GRP1S */ + { + { "addQ", Ev, Iv, XX }, + { "orQ", Ev, Iv, XX }, + { "adcQ", Ev, Iv, XX }, + { "sbbQ", Ev, Iv, XX }, + { "andQ", Ev, Iv, XX }, + { "subQ", Ev, Iv, XX }, + { "xorQ", Ev, Iv, XX }, + { "cmpQ", Ev, Iv, XX } + }, + /* GRP1Ss */ + { + { "addQ", Ev, sIb, XX }, + { "orQ", Ev, sIb, XX }, + { "adcQ", Ev, sIb, XX }, + { "sbbQ", Ev, sIb, XX }, + { "andQ", Ev, sIb, XX }, + { "subQ", Ev, sIb, XX }, + { "xorQ", Ev, sIb, XX }, + { "cmpQ", Ev, sIb, XX } + }, + /* GRP2b */ + { + { "rolA", Eb, Ib, XX }, + { "rorA", Eb, Ib, XX }, + { "rclA", Eb, Ib, XX }, + { "rcrA", Eb, Ib, XX }, + { "shlA", Eb, Ib, XX }, + { "shrA", Eb, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "sarA", Eb, Ib, XX }, + }, + /* GRP2S */ + { + { "rolQ", Ev, Ib, XX }, + { "rorQ", Ev, Ib, XX }, + { "rclQ", Ev, Ib, XX }, + { "rcrQ", Ev, Ib, XX }, + { "shlQ", Ev, Ib, XX }, + { "shrQ", Ev, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "sarQ", Ev, Ib, XX }, + }, + /* GRP2b_one */ + { + { "rolA", Eb, XX, XX }, + { "rorA", Eb, XX, XX }, + { "rclA", Eb, XX, XX }, + { "rcrA", Eb, XX, XX }, + { "shlA", Eb, XX, XX }, + { "shrA", Eb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "sarA", Eb, XX, XX }, + }, + /* GRP2S_one */ + { + { "rolQ", Ev, XX, XX }, + { "rorQ", Ev, XX, XX }, + { "rclQ", Ev, XX, XX }, + { "rcrQ", Ev, XX, XX }, + { "shlQ", Ev, XX, XX }, + { "shrQ", Ev, XX, XX }, + { "(bad)", XX, XX, XX}, + { "sarQ", Ev, XX, XX }, + }, + /* GRP2b_cl */ + { + { "rolA", Eb, CL, XX }, + { "rorA", Eb, CL, XX }, + { "rclA", Eb, CL, XX }, + { "rcrA", Eb, CL, XX }, + { "shlA", Eb, CL, XX }, + { "shrA", Eb, CL, XX }, + { "(bad)", XX, XX, XX }, + { "sarA", Eb, CL, XX }, + }, + /* GRP2S_cl */ + { + { "rolQ", Ev, CL, XX }, + { "rorQ", Ev, CL, XX }, + { "rclQ", Ev, CL, XX }, + { "rcrQ", Ev, CL, XX }, + { "shlQ", Ev, CL, XX }, + { "shrQ", Ev, CL, XX }, + { "(bad)", XX, XX, XX }, + { "sarQ", Ev, CL, XX } + }, + /* GRP3b */ + { + { "testA", Eb, Ib, XX }, + { "(bad)", Eb, XX, XX }, + { "notA", Eb, XX, XX }, + { "negA", Eb, XX, XX }, + { "mulA", Eb, XX, XX }, /* Don't print the implicit %al register, */ + { "imulA", Eb, XX, XX }, /* to distinguish these opcodes from other */ + { "divA", Eb, XX, XX }, /* mul/imul opcodes. Do the same for div */ + { "idivA", Eb, XX, XX } /* and idiv for consistency. */ + }, + /* GRP3S */ + { + { "testQ", Ev, Iv, XX }, + { "(bad)", XX, XX, XX }, + { "notQ", Ev, XX, XX }, + { "negQ", Ev, XX, XX }, + { "mulQ", Ev, XX, XX }, /* Don't print the implicit register. */ + { "imulQ", Ev, XX, XX }, + { "divQ", Ev, XX, XX }, + { "idivQ", Ev, XX, XX }, + }, + /* GRP4 */ + { + { "incA", Eb, XX, XX }, + { "decA", Eb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP5 */ + { + { "incQ", Ev, XX, XX }, + { "decQ", Ev, XX, XX }, + { "callT", indirEv, XX, XX }, + { "lcallT", indirEv, XX, XX }, + { "jmpT", indirEv, XX, XX }, + { "ljmpT", indirEv, XX, XX }, + { "pushU", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP6 */ + { + { "sldtQ", Ev, XX, XX }, + { "strQ", Ev, XX, XX }, + { "lldt", Ew, XX, XX }, + { "ltr", Ew, XX, XX }, + { "verr", Ew, XX, XX }, + { "verw", Ew, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX } + }, + /* GRP7 */ + { + { "sgdtQ", M, XX, XX }, + { "sidtQ", M, XX, XX }, + { "lgdtQ", M, XX, XX }, + { "lidtQ", M, XX, XX }, + { "smswQ", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "lmsw", Ew, XX, XX }, + { "invlpg", Ew, XX, XX }, + }, + /* GRP8 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "btQ", Ev, Ib, XX }, + { "btsQ", Ev, Ib, XX }, + { "btrQ", Ev, Ib, XX }, + { "btcQ", Ev, Ib, XX }, + }, + /* GRP9 */ + { + { "(bad)", XX, XX, XX }, + { "cmpxchg8b", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP10 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psrlw", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "psraw", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "psllw", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP11 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psrld", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "psrad", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "pslld", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRP12 */ + { + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psrlq", MS, Ib, XX }, + { "psrldq", MS, Ib, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "psllq", MS, Ib, XX }, + { "pslldq", MS, Ib, XX }, + }, + /* GRP13 */ + { + { "fxsave", Ev, XX, XX }, + { "fxrstor", Ev, XX, XX }, + { "ldmxcsr", Ev, XX, XX }, + { "stmxcsr", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "lfence", None, XX, XX }, + { "mfence", None, XX, XX }, + { "sfence", None, XX, XX }, + /* FIXME: the sfence with memory operand is clflush! */ + }, + /* GRP14 */ + { + { "prefetchnta", Ev, XX, XX }, + { "prefetcht0", Ev, XX, XX }, + { "prefetcht1", Ev, XX, XX }, + { "prefetcht2", Ev, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* GRPAMD */ + { + { "prefetch", Eb, XX, XX }, + { "prefetchw", Eb, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + } +}; + +static const struct dis386 prefix_user_table[][4] = { + /* PREGRP0 */ + { + { "addps", XM, EX, XX }, + { "addss", XM, EX, XX }, + { "addpd", XM, EX, XX }, + { "addsd", XM, EX, XX }, + }, + /* PREGRP1 */ + { + { "", XM, EX, OPSIMD }, /* See OP_SIMD_SUFFIX. */ + { "", XM, EX, OPSIMD }, + { "", XM, EX, OPSIMD }, + { "", XM, EX, OPSIMD }, + }, + /* PREGRP2 */ + { + { "cvtpi2ps", XM, EM, XX }, + { "cvtsi2ssY", XM, Ev, XX }, + { "cvtpi2pd", XM, EM, XX }, + { "cvtsi2sdY", XM, Ev, XX }, + }, + /* PREGRP3 */ + { + { "cvtps2pi", MX, EX, XX }, + { "cvtss2siY", Gv, EX, XX }, + { "cvtpd2pi", MX, EX, XX }, + { "cvtsd2siY", Gv, EX, XX }, + }, + /* PREGRP4 */ + { + { "cvttps2pi", MX, EX, XX }, + { "cvttss2siY", Gv, EX, XX }, + { "cvttpd2pi", MX, EX, XX }, + { "cvttsd2siY", Gv, EX, XX }, + }, + /* PREGRP5 */ + { + { "divps", XM, EX, XX }, + { "divss", XM, EX, XX }, + { "divpd", XM, EX, XX }, + { "divsd", XM, EX, XX }, + }, + /* PREGRP6 */ + { + { "maxps", XM, EX, XX }, + { "maxss", XM, EX, XX }, + { "maxpd", XM, EX, XX }, + { "maxsd", XM, EX, XX }, + }, + /* PREGRP7 */ + { + { "minps", XM, EX, XX }, + { "minss", XM, EX, XX }, + { "minpd", XM, EX, XX }, + { "minsd", XM, EX, XX }, + }, + /* PREGRP8 */ + { + { "movups", XM, EX, XX }, + { "movss", XM, EX, XX }, + { "movupd", XM, EX, XX }, + { "movsd", XM, EX, XX }, + }, + /* PREGRP9 */ + { + { "movups", EX, XM, XX }, + { "movss", EX, XM, XX }, + { "movupd", EX, XM, XX }, + { "movsd", EX, XM, XX }, + }, + /* PREGRP10 */ + { + { "mulps", XM, EX, XX }, + { "mulss", XM, EX, XX }, + { "mulpd", XM, EX, XX }, + { "mulsd", XM, EX, XX }, + }, + /* PREGRP11 */ + { + { "rcpps", XM, EX, XX }, + { "rcpss", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP12 */ + { + { "rsqrtps", XM, EX, XX }, + { "rsqrtss", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP13 */ + { + { "sqrtps", XM, EX, XX }, + { "sqrtss", XM, EX, XX }, + { "sqrtpd", XM, EX, XX }, + { "sqrtsd", XM, EX, XX }, + }, + /* PREGRP14 */ + { + { "subps", XM, EX, XX }, + { "subss", XM, EX, XX }, + { "subpd", XM, EX, XX }, + { "subsd", XM, EX, XX }, + }, + /* PREGRP15 */ + { + { "(bad)", XM, EX, XX }, + { "cvtdq2pd", XM, EX, XX }, + { "cvttpd2dq", XM, EX, XX }, + { "cvtpd2dq", XM, EX, XX }, + }, + /* PREGRP16 */ + { + { "cvtdq2ps", XM, EX, XX }, + { "cvttps2dq",XM, EX, XX }, + { "cvtps2dq",XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP17 */ + { + { "cvtps2pd", XM, EX, XX }, + { "cvtss2sd", XM, EX, XX }, + { "cvtpd2ps", XM, EX, XX }, + { "cvtsd2ss", XM, EX, XX }, + }, + /* PREGRP18 */ + { + { "maskmovq", MX, MS, XX }, + { "(bad)", XM, EX, XX }, + { "maskmovdqu", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP19 */ + { + { "movq", MX, EM, XX }, + { "movdqu", XM, EX, XX }, + { "movdqa", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP20 */ + { + { "movq", EM, MX, XX }, + { "movdqu", EX, XM, XX }, + { "movdqa", EX, XM, XX }, + { "(bad)", EX, XM, XX }, + }, + /* PREGRP21 */ + { + { "(bad)", EX, XM, XX }, + { "movq2dq", XM, MS, XX }, + { "movq", EX, XM, XX }, + { "movdq2q", MX, XS, XX }, + }, + /* PREGRP22 */ + { + { "pshufw", MX, EM, Ib }, + { "pshufhw", XM, EX, Ib }, + { "pshufd", XM, EX, Ib }, + { "pshuflw", XM, EX, Ib }, + }, + /* PREGRP23 */ + { + { "movd", Ed, MX, XX }, + { "movq", XM, EX, XX }, + { "movd", Ed, XM, XX }, + { "(bad)", Ed, XM, XX }, + }, + /* PREGRP24 */ + { + { "(bad)", MX, EX, XX }, + { "(bad)", XM, EX, XX }, + { "punpckhqdq", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, + /* PREGRP25 */ + { + { "movntq", Ev, MX, XX }, + { "(bad)", Ev, XM, XX }, + { "movntdq", Ev, XM, XX }, + { "(bad)", Ev, XM, XX }, + }, + /* PREGRP26 */ + { + { "(bad)", MX, EX, XX }, + { "(bad)", XM, EX, XX }, + { "punpcklqdq", XM, EX, XX }, + { "(bad)", XM, EX, XX }, + }, +}; + +static const struct dis386 x86_64_table[][2] = { + { + { "arpl", Ew, Gw, XX }, + { "movs{||lq|xd}", Gv, Ed, XX }, + }, +}; + +#define INTERNAL_DISASSEMBLER_ERROR _("") + +static void +ckprefix () +{ + int newrex; + rex = 0; + prefixes = 0; + used_prefixes = 0; + rex_used = 0; + while (1) + { + FETCH_DATA (the_info, codep + 1); + newrex = 0; + switch (*codep) + { + /* REX prefixes family. */ + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + if (mode_64bit) + newrex = *codep; + else + return; + break; + case 0xf3: + prefixes |= PREFIX_REPZ; + break; + case 0xf2: + prefixes |= PREFIX_REPNZ; + break; + case 0xf0: + prefixes |= PREFIX_LOCK; + break; + case 0x2e: + prefixes |= PREFIX_CS; + break; + case 0x36: + prefixes |= PREFIX_SS; + break; + case 0x3e: + prefixes |= PREFIX_DS; + break; + case 0x26: + prefixes |= PREFIX_ES; + break; + case 0x64: + prefixes |= PREFIX_FS; + break; + case 0x65: + prefixes |= PREFIX_GS; + break; + case 0x66: + prefixes |= PREFIX_DATA; + break; + case 0x67: + prefixes |= PREFIX_ADDR; + break; + case FWAIT_OPCODE: + /* fwait is really an instruction. If there are prefixes + before the fwait, they belong to the fwait, *not* to the + following instruction. */ + if (prefixes) + { + prefixes |= PREFIX_FWAIT; + codep++; + return; + } + prefixes = PREFIX_FWAIT; + break; + default: + return; + } + /* Rex is ignored when followed by another prefix. */ + if (rex) + { + oappend (prefix_name (rex, 0)); + oappend (" "); + } + rex = newrex; + codep++; + } +} + +/* Return the name of the prefix byte PREF, or NULL if PREF is not a + prefix byte. */ + +static const char * +prefix_name (pref, sizeflag) + int pref; + int sizeflag; +{ + switch (pref) + { + /* REX prefixes family. */ + case 0x40: + return "rex"; + case 0x41: + return "rexZ"; + case 0x42: + return "rexY"; + case 0x43: + return "rexYZ"; + case 0x44: + return "rexX"; + case 0x45: + return "rexXZ"; + case 0x46: + return "rexXY"; + case 0x47: + return "rexXYZ"; + case 0x48: + return "rex64"; + case 0x49: + return "rex64Z"; + case 0x4a: + return "rex64Y"; + case 0x4b: + return "rex64YZ"; + case 0x4c: + return "rex64X"; + case 0x4d: + return "rex64XZ"; + case 0x4e: + return "rex64XY"; + case 0x4f: + return "rex64XYZ"; + case 0xf3: + return "repz"; + case 0xf2: + return "repnz"; + case 0xf0: + return "lock"; + case 0x2e: + return "cs"; + case 0x36: + return "ss"; + case 0x3e: + return "ds"; + case 0x26: + return "es"; + case 0x64: + return "fs"; + case 0x65: + return "gs"; + case 0x66: + return (sizeflag & DFLAG) ? "data16" : "data32"; + case 0x67: + if (mode_64bit) + return (sizeflag & AFLAG) ? "addr32" : "addr64"; + else + return ((sizeflag & AFLAG) && !mode_64bit) ? "addr16" : "addr32"; + case FWAIT_OPCODE: + return "fwait"; + default: + return NULL; + } +} + +static char op1out[100], op2out[100], op3out[100]; +static int op_ad, op_index[3]; +static bfd_vma op_address[3]; +static bfd_vma op_riprel[3]; +static bfd_vma start_pc; + +/* + * On the 386's of 1988, the maximum length of an instruction is 15 bytes. + * (see topic "Redundant prefixes" in the "Differences from 8086" + * section of the "Virtual 8086 Mode" chapter.) + * 'pc' should be the address of this instruction, it will + * be used to print the target address if this is a relative jump or call + * The function returns the length of this instruction in bytes. + */ + +static char intel_syntax; +static char open_char; +static char close_char; +static char separator_char; +static char scale_char; + +/* Here for backwards compatibility. When gdb stops using + print_insn_i386_att and print_insn_i386_intel these functions can + disappear, and print_insn_i386 be merged into print_insn. */ +int +print_insn_i386_att (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + intel_syntax = 0; + + return print_insn (pc, info); +} + +int +print_insn_i386_intel (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + intel_syntax = 1; + + return print_insn (pc, info); +} + +int +print_insn_i386 (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + intel_syntax = -1; + + return print_insn (pc, info); +} + +static int +print_insn (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + const struct dis386 *dp; + int i; + int two_source_ops; + char *first, *second, *third; + int needcomma; + unsigned char uses_SSE_prefix; + int sizeflag; + /*const char *p;*/ + struct dis_private priv; + + mode_64bit = (info->mach == bfd_mach_x86_64_intel_syntax + || info->mach == bfd_mach_x86_64); + + if (intel_syntax == -1) + intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax + || info->mach == bfd_mach_x86_64_intel_syntax); + + if (info->mach == bfd_mach_i386_i386 + || info->mach == bfd_mach_x86_64 + || info->mach == bfd_mach_i386_i386_intel_syntax + || info->mach == bfd_mach_x86_64_intel_syntax) + priv.orig_sizeflag = AFLAG | DFLAG; + else if (info->mach == bfd_mach_i386_i8086) + priv.orig_sizeflag = 0; + else + abort (); + +#if 0 + for (p = info->disassembler_options; p != NULL; ) + { + if (strncmp (p, "x86-64", 6) == 0) + { + mode_64bit = 1; + priv.orig_sizeflag = AFLAG | DFLAG; + } + else if (strncmp (p, "i386", 4) == 0) + { + mode_64bit = 0; + priv.orig_sizeflag = AFLAG | DFLAG; + } + else if (strncmp (p, "i8086", 5) == 0) + { + mode_64bit = 0; + priv.orig_sizeflag = 0; + } + else if (strncmp (p, "intel", 5) == 0) + { + intel_syntax = 1; + } + else if (strncmp (p, "att", 3) == 0) + { + intel_syntax = 0; + } + else if (strncmp (p, "addr", 4) == 0) + { + if (p[4] == '1' && p[5] == '6') + priv.orig_sizeflag &= ~AFLAG; + else if (p[4] == '3' && p[5] == '2') + priv.orig_sizeflag |= AFLAG; + } + else if (strncmp (p, "data", 4) == 0) + { + if (p[4] == '1' && p[5] == '6') + priv.orig_sizeflag &= ~DFLAG; + else if (p[4] == '3' && p[5] == '2') + priv.orig_sizeflag |= DFLAG; + } + else if (strncmp (p, "suffix", 6) == 0) + priv.orig_sizeflag |= SUFFIX_ALWAYS; + + p = strchr (p, ','); + if (p != NULL) + p++; + } +#else + mode_64bit = 1; + priv.orig_sizeflag = AFLAG | DFLAG; + intel_syntax = 1; +#endif + + if (intel_syntax) + { + names64 = intel_names64; + names32 = intel_names32; + names16 = intel_names16; + names8 = intel_names8; + names8rex = intel_names8rex; + names_seg = intel_names_seg; + index16 = intel_index16; + open_char = '['; + close_char = ']'; + separator_char = '+'; + scale_char = '*'; + } + else + { + names64 = att_names64; + names32 = att_names32; + names16 = att_names16; + names8 = att_names8; + names8rex = att_names8rex; + names_seg = att_names_seg; + index16 = att_index16; + open_char = '('; + close_char = ')'; + separator_char = ','; + scale_char = ','; + } + + /* The output looks better if we put 7 bytes on a line, since that + puts most long word instructions on a single line. */ + info->bytes_per_line = 7; + + info->private_data = (PTR) &priv; + priv.max_fetched = priv.the_buffer; + priv.insn_start = pc; + + obuf[0] = 0; + op1out[0] = 0; + op2out[0] = 0; + op3out[0] = 0; + + op_index[0] = op_index[1] = op_index[2] = -1; + + the_info = info; + start_pc = pc; + start_codep = priv.the_buffer; + codep = priv.the_buffer; + + if (_setjmp (priv.bailout) != 0) + { + const char *name; + + /* Getting here means we tried for data but didn't get it. That + means we have an incomplete instruction of some sort. Just + print the first byte as a prefix or a .byte pseudo-op. */ + if (codep > priv.the_buffer) + { + name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); + if (name != NULL) + (*info->fprintf_func) (info->stream, "%s", name); + else + { + /* Just print the first byte as a .byte instruction. */ + (*info->fprintf_func) (info->stream, ".byte 0x%x", + (unsigned int) priv.the_buffer[0]); + } + + return 1; + } + + return -1; + } + + obufp = obuf; + ckprefix (); + + insn_codep = codep; + sizeflag = priv.orig_sizeflag; + + FETCH_DATA (info, codep + 1); + two_source_ops = (*codep == 0x62) || (*codep == 0xc8); + + if ((prefixes & PREFIX_FWAIT) + && ((*codep < 0xd8) || (*codep > 0xdf))) + { + const char *name; + + /* fwait not followed by floating point instruction. Print the + first prefix, which is probably fwait itself. */ + name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); + if (name == NULL) + name = INTERNAL_DISASSEMBLER_ERROR; + (*info->fprintf_func) (info->stream, "%s", name); + return 1; + } + + if (*codep == 0x0f) + { + FETCH_DATA (info, codep + 2); + dp = &dis386_twobyte[*++codep]; + need_modrm = twobyte_has_modrm[*codep]; + uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep]; + } + else + { + dp = &dis386[*codep]; + need_modrm = onebyte_has_modrm[*codep]; + uses_SSE_prefix = 0; + } + codep++; + + if (!uses_SSE_prefix && (prefixes & PREFIX_REPZ)) + { + oappend ("repz "); + used_prefixes |= PREFIX_REPZ; + } + if (!uses_SSE_prefix && (prefixes & PREFIX_REPNZ)) + { + oappend ("repnz "); + used_prefixes |= PREFIX_REPNZ; + } + if (prefixes & PREFIX_LOCK) + { + oappend ("lock "); + used_prefixes |= PREFIX_LOCK; + } + + if (prefixes & PREFIX_ADDR) + { + sizeflag ^= AFLAG; + if (dp->bytemode3 != loop_jcxz_mode || intel_syntax) + { + if ((sizeflag & AFLAG) || mode_64bit) + oappend ("addr32 "); + else + oappend ("addr16 "); + used_prefixes |= PREFIX_ADDR; + } + } + + if (!uses_SSE_prefix && (prefixes & PREFIX_DATA)) + { + sizeflag ^= DFLAG; + if (dp->bytemode3 == cond_jump_mode + && dp->bytemode1 == v_mode + && !intel_syntax) + { + if (sizeflag & DFLAG) + oappend ("data32 "); + else + oappend ("data16 "); + used_prefixes |= PREFIX_DATA; + } + } + + if (need_modrm) + { + FETCH_DATA (info, codep + 1); + mod = (*codep >> 6) & 3; + reg = (*codep >> 3) & 7; + rm = *codep & 7; + } + + if (dp->name == NULL && dp->bytemode1 == FLOATCODE) + { + dofloat (sizeflag); + } + else + { + int index; + if (dp->name == NULL) + { + switch (dp->bytemode1) + { + case USE_GROUPS: + dp = &grps[dp->bytemode2][reg]; + break; + + case USE_PREFIX_USER_TABLE: + index = 0; + used_prefixes |= (prefixes & PREFIX_REPZ); + if (prefixes & PREFIX_REPZ) + index = 1; + else + { + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + index = 2; + else + { + used_prefixes |= (prefixes & PREFIX_REPNZ); + if (prefixes & PREFIX_REPNZ) + index = 3; + } + } + dp = &prefix_user_table[dp->bytemode2][index]; + break; + + case X86_64_SPECIAL: + dp = &x86_64_table[dp->bytemode2][mode_64bit]; + break; + + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } + } + + if (putop (dp->name, sizeflag) == 0) + { + obufp = op1out; + op_ad = 2; + if (dp->op1) + (*dp->op1) (dp->bytemode1, sizeflag); + + obufp = op2out; + op_ad = 1; + if (dp->op2) + (*dp->op2) (dp->bytemode2, sizeflag); + + obufp = op3out; + op_ad = 0; + if (dp->op3) + (*dp->op3) (dp->bytemode3, sizeflag); + } + } + + /* See if any prefixes were not used. If so, print the first one + separately. If we don't do this, we'll wind up printing an + instruction stream which does not precisely correspond to the + bytes we are disassembling. */ + if ((prefixes & ~used_prefixes) != 0) + { + const char *name; + + name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag); + if (name == NULL) + name = INTERNAL_DISASSEMBLER_ERROR; + (*info->fprintf_func) (info->stream, "%s", name); + return 1; + } + if (rex & ~rex_used) + { + const char *name; + name = prefix_name (rex | 0x40, priv.orig_sizeflag); + if (name == NULL) + name = INTERNAL_DISASSEMBLER_ERROR; + (*info->fprintf_func) (info->stream, "%s ", name); + } + + obufp = obuf + strlen (obuf); + for (i = strlen (obuf); i < 6; i++) + oappend (" "); + oappend (" "); + (*info->fprintf_func) (info->stream, "%s", obuf); + + /* The enter and bound instructions are printed with operands in the same + order as the intel book; everything else is printed in reverse order. */ + if (intel_syntax || two_source_ops) + { + first = op1out; + second = op2out; + third = op3out; + op_ad = op_index[0]; + op_index[0] = op_index[2]; + op_index[2] = op_ad; + } + else + { + first = op3out; + second = op2out; + third = op1out; + } + needcomma = 0; + if (*first) + { + if (op_index[0] != -1 && !op_riprel[0]) + (*info->print_address_func) ((bfd_vma) op_address[op_index[0]], info); + else + (*info->fprintf_func) (info->stream, "%s", first); + needcomma = 1; + } + if (*second) + { + if (needcomma) + (*info->fprintf_func) (info->stream, ","); + if (op_index[1] != -1 && !op_riprel[1]) + (*info->print_address_func) ((bfd_vma) op_address[op_index[1]], info); + else + (*info->fprintf_func) (info->stream, "%s", second); + needcomma = 1; + } + if (*third) + { + if (needcomma) + (*info->fprintf_func) (info->stream, ","); + if (op_index[2] != -1 && !op_riprel[2]) + (*info->print_address_func) ((bfd_vma) op_address[op_index[2]], info); + else + (*info->fprintf_func) (info->stream, "%s", third); + } + for (i = 0; i < 3; i++) + if (op_index[i] != -1 && op_riprel[i]) + { + (*info->fprintf_func) (info->stream, " # "); + (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep + + op_address[op_index[i]]), info); + } + return codep - priv.the_buffer; +} + +static const char *float_mem[] = { + /* d8 */ + "fadd{s||s|}", + "fmul{s||s|}", + "fcom{s||s|}", + "fcomp{s||s|}", + "fsub{s||s|}", + "fsubr{s||s|}", + "fdiv{s||s|}", + "fdivr{s||s|}", + /* d9 */ + "fld{s||s|}", + "(bad)", + "fst{s||s|}", + "fstp{s||s|}", + "fldenv", + "fldcw", + "fNstenv", + "fNstcw", + /* da */ + "fiadd{l||l|}", + "fimul{l||l|}", + "ficom{l||l|}", + "ficomp{l||l|}", + "fisub{l||l|}", + "fisubr{l||l|}", + "fidiv{l||l|}", + "fidivr{l||l|}", + /* db */ + "fild{l||l|}", + "(bad)", + "fist{l||l|}", + "fistp{l||l|}", + "(bad)", + "fld{t||t|}", + "(bad)", + "fstp{t||t|}", + /* dc */ + "fadd{l||l|}", + "fmul{l||l|}", + "fcom{l||l|}", + "fcomp{l||l|}", + "fsub{l||l|}", + "fsubr{l||l|}", + "fdiv{l||l|}", + "fdivr{l||l|}", + /* dd */ + "fld{l||l|}", + "(bad)", + "fst{l||l|}", + "fstp{l||l|}", + "frstor", + "(bad)", + "fNsave", + "fNstsw", + /* de */ + "fiadd", + "fimul", + "ficom", + "ficomp", + "fisub", + "fisubr", + "fidiv", + "fidivr", + /* df */ + "fild", + "(bad)", + "fist", + "fistp", + "fbld", + "fild{ll||ll|}", + "fbstp", + "fistpll", +}; + +#define ST OP_ST, 0 +#define STi OP_STi, 0 + +#define FGRPd9_2 NULL, NULL, 0, NULL, 0, NULL, 0 +#define FGRPd9_4 NULL, NULL, 1, NULL, 0, NULL, 0 +#define FGRPd9_5 NULL, NULL, 2, NULL, 0, NULL, 0 +#define FGRPd9_6 NULL, NULL, 3, NULL, 0, NULL, 0 +#define FGRPd9_7 NULL, NULL, 4, NULL, 0, NULL, 0 +#define FGRPda_5 NULL, NULL, 5, NULL, 0, NULL, 0 +#define FGRPdb_4 NULL, NULL, 6, NULL, 0, NULL, 0 +#define FGRPde_3 NULL, NULL, 7, NULL, 0, NULL, 0 +#define FGRPdf_4 NULL, NULL, 8, NULL, 0, NULL, 0 + +static const struct dis386 float_reg[][8] = { + /* d8 */ + { + { "fadd", ST, STi, XX }, + { "fmul", ST, STi, XX }, + { "fcom", STi, XX, XX }, + { "fcomp", STi, XX, XX }, + { "fsub", ST, STi, XX }, + { "fsubr", ST, STi, XX }, + { "fdiv", ST, STi, XX }, + { "fdivr", ST, STi, XX }, + }, + /* d9 */ + { + { "fld", STi, XX, XX }, + { "fxch", STi, XX, XX }, + { FGRPd9_2 }, + { "(bad)", XX, XX, XX }, + { FGRPd9_4 }, + { FGRPd9_5 }, + { FGRPd9_6 }, + { FGRPd9_7 }, + }, + /* da */ + { + { "fcmovb", ST, STi, XX }, + { "fcmove", ST, STi, XX }, + { "fcmovbe",ST, STi, XX }, + { "fcmovu", ST, STi, XX }, + { "(bad)", XX, XX, XX }, + { FGRPda_5 }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* db */ + { + { "fcmovnb",ST, STi, XX }, + { "fcmovne",ST, STi, XX }, + { "fcmovnbe",ST, STi, XX }, + { "fcmovnu",ST, STi, XX }, + { FGRPdb_4 }, + { "fucomi", ST, STi, XX }, + { "fcomi", ST, STi, XX }, + { "(bad)", XX, XX, XX }, + }, + /* dc */ + { + { "fadd", STi, ST, XX }, + { "fmul", STi, ST, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, +#if UNIXWARE_COMPAT + { "fsub", STi, ST, XX }, + { "fsubr", STi, ST, XX }, + { "fdiv", STi, ST, XX }, + { "fdivr", STi, ST, XX }, +#else + { "fsubr", STi, ST, XX }, + { "fsub", STi, ST, XX }, + { "fdivr", STi, ST, XX }, + { "fdiv", STi, ST, XX }, +#endif + }, + /* dd */ + { + { "ffree", STi, XX, XX }, + { "(bad)", XX, XX, XX }, + { "fst", STi, XX, XX }, + { "fstp", STi, XX, XX }, + { "fucom", STi, XX, XX }, + { "fucomp", STi, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + }, + /* de */ + { + { "faddp", STi, ST, XX }, + { "fmulp", STi, ST, XX }, + { "(bad)", XX, XX, XX }, + { FGRPde_3 }, +#if UNIXWARE_COMPAT + { "fsubp", STi, ST, XX }, + { "fsubrp", STi, ST, XX }, + { "fdivp", STi, ST, XX }, + { "fdivrp", STi, ST, XX }, +#else + { "fsubrp", STi, ST, XX }, + { "fsubp", STi, ST, XX }, + { "fdivrp", STi, ST, XX }, + { "fdivp", STi, ST, XX }, +#endif + }, + /* df */ + { + { "ffreep", STi, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { "(bad)", XX, XX, XX }, + { FGRPdf_4 }, + { "fucomip",ST, STi, XX }, + { "fcomip", ST, STi, XX }, + { "(bad)", XX, XX, XX }, + }, +}; + +static char *fgrps[][8] = { + /* d9_2 0 */ + { + "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* d9_4 1 */ + { + "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)", + }, + + /* d9_5 2 */ + { + "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)", + }, + + /* d9_6 3 */ + { + "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp", + }, + + /* d9_7 4 */ + { + "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos", + }, + + /* da_5 5 */ + { + "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* db_4 6 */ + { + "feni(287 only)","fdisi(287 only)","fNclex","fNinit", + "fNsetpm(287 only)","(bad)","(bad)","(bad)", + }, + + /* de_3 7 */ + { + "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* df_4 8 */ + { + "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, +}; + +static void +dofloat (sizeflag) + int sizeflag; +{ + const struct dis386 *dp; + unsigned char floatop; + + floatop = codep[-1]; + + if (mod != 3) + { + putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag); + obufp = op1out; + if (floatop == 0xdb) + OP_E (x_mode, sizeflag); + else if (floatop == 0xdd) + OP_E (d_mode, sizeflag); + else + OP_E (v_mode, sizeflag); + return; + } + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + + dp = &float_reg[floatop - 0xd8][reg]; + if (dp->name == NULL) + { + putop (fgrps[dp->bytemode1][rm], sizeflag); + + /* Instruction fnstsw is only one with strange arg. */ + if (floatop == 0xdf && codep[-1] == 0xe0) + strcpy (op1out, names16[0]); + } + else + { + putop (dp->name, sizeflag); + + obufp = op1out; + if (dp->op1) + (*dp->op1) (dp->bytemode1, sizeflag); + obufp = op2out; + if (dp->op2) + (*dp->op2) (dp->bytemode2, sizeflag); + } +} + +static void +OP_ST (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + oappend ("%st"); +} + +static void +OP_STi (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + sprintf (scratchbuf, "%%st(%d)", rm); + oappend (scratchbuf + intel_syntax); +} + +/* Capital letters in template are macros. */ +static int +putop (template, sizeflag) + const char *template; + int sizeflag; +{ + const char *p; + int alt; + + for (p = template; *p; p++) + { + switch (*p) + { + default: + *obufp++ = *p; + break; + case '{': + alt = 0; + if (intel_syntax) + alt += 1; + if (mode_64bit) + alt += 2; + while (alt != 0) + { + while (*++p != '|') + { + if (*p == '}') + { + /* Alternative not valid. */ + strcpy (obuf, "(bad)"); + obufp = obuf + 5; + return 1; + } + else if (*p == '\0') + abort (); + } + alt--; + } + break; + case '|': + while (*++p != '}') + { + if (*p == '\0') + abort (); + } + break; + case '}': + break; + case 'A': + if (intel_syntax) + break; + if (mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + *obufp++ = 'b'; + break; + case 'B': + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + *obufp++ = 'b'; + break; + case 'E': /* For jcxz/jecxz */ + if (mode_64bit) + { + if (sizeflag & AFLAG) + *obufp++ = 'r'; + else + *obufp++ = 'e'; + } + else + if (sizeflag & AFLAG) + *obufp++ = 'e'; + used_prefixes |= (prefixes & PREFIX_ADDR); + break; + case 'F': + if (intel_syntax) + break; + if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS)) + { + if (sizeflag & AFLAG) + *obufp++ = mode_64bit ? 'q' : 'l'; + else + *obufp++ = mode_64bit ? 'l' : 'w'; + used_prefixes |= (prefixes & PREFIX_ADDR); + } + break; + case 'H': + if (intel_syntax) + break; + if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS + || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS) + { + used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS); + *obufp++ = ','; + *obufp++ = 'p'; + if (prefixes & PREFIX_DS) + *obufp++ = 't'; + else + *obufp++ = 'n'; + } + break; + case 'L': + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + *obufp++ = 'l'; + break; + case 'N': + if ((prefixes & PREFIX_FWAIT) == 0) + *obufp++ = 'n'; + else + used_prefixes |= PREFIX_FWAIT; + break; + case 'O': + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + *obufp++ = 'o'; + else + *obufp++ = 'd'; + break; + case 'T': + if (intel_syntax) + break; + if (mode_64bit) + { + *obufp++ = 'q'; + break; + } + /* Fall through. */ + case 'P': + if (intel_syntax) + break; + if ((prefixes & PREFIX_DATA) + || (rex & REX_MODE64) + || (sizeflag & SUFFIX_ALWAYS)) + { + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + *obufp++ = 'q'; + else + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + break; + case 'U': + if (intel_syntax) + break; + if (mode_64bit) + { + *obufp++ = 'q'; + break; + } + /* Fall through. */ + case 'Q': + if (intel_syntax) + break; + USED_REX (REX_MODE64); + if (mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + { + if (rex & REX_MODE64) + *obufp++ = 'q'; + else + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + break; + case 'R': + USED_REX (REX_MODE64); + if (intel_syntax) + { + if (rex & REX_MODE64) + { + *obufp++ = 'q'; + *obufp++ = 't'; + } + else if (sizeflag & DFLAG) + { + *obufp++ = 'd'; + *obufp++ = 'q'; + } + else + { + *obufp++ = 'w'; + *obufp++ = 'd'; + } + } + else + { + if (rex & REX_MODE64) + *obufp++ = 'q'; + else if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + } + if (!(rex & REX_MODE64)) + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 'S': + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + { + if (rex & REX_MODE64) + *obufp++ = 'q'; + else + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + break; + case 'X': + if (prefixes & PREFIX_DATA) + *obufp++ = 'd'; + else + *obufp++ = 's'; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 'Y': + if (intel_syntax) + break; + if (rex & REX_MODE64) + { + USED_REX (REX_MODE64); + *obufp++ = 'q'; + } + break; + /* implicit operand size 'l' for i386 or 'q' for x86-64 */ + case 'W': + /* operand size flag for cwtl, cbtw */ + USED_REX (0); + if (rex) + *obufp++ = 'l'; + else if (sizeflag & DFLAG) + *obufp++ = 'w'; + else + *obufp++ = 'b'; + if (intel_syntax) + { + if (rex) + { + *obufp++ = 'q'; + *obufp++ = 'e'; + } + if (sizeflag & DFLAG) + { + *obufp++ = 'd'; + *obufp++ = 'e'; + } + else + { + *obufp++ = 'w'; + } + } + if (!rex) + used_prefixes |= (prefixes & PREFIX_DATA); + break; + } + } + *obufp = 0; + return 0; +} + +static void +oappend (s) + const char *s; +{ + strcpy (obufp, s); + obufp += strlen (s); +} + +static void +append_seg () +{ + if (prefixes & PREFIX_CS) + { + used_prefixes |= PREFIX_CS; + oappend ("%cs:" + intel_syntax); + } + if (prefixes & PREFIX_DS) + { + used_prefixes |= PREFIX_DS; + oappend ("%ds:" + intel_syntax); + } + if (prefixes & PREFIX_SS) + { + used_prefixes |= PREFIX_SS; + oappend ("%ss:" + intel_syntax); + } + if (prefixes & PREFIX_ES) + { + used_prefixes |= PREFIX_ES; + oappend ("%es:" + intel_syntax); + } + if (prefixes & PREFIX_FS) + { + used_prefixes |= PREFIX_FS; + oappend ("%fs:" + intel_syntax); + } + if (prefixes & PREFIX_GS) + { + used_prefixes |= PREFIX_GS; + oappend ("%gs:" + intel_syntax); + } +} + +static void +OP_indirE (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (!intel_syntax) + oappend ("*"); + OP_E (bytemode, sizeflag); +} + +static void +print_operand_value (buf, hex, disp) + char *buf; + int hex; + bfd_vma disp; +{ + if (mode_64bit) + { + if (hex) + { + char tmp[30]; + int i; + buf[0] = '0'; + buf[1] = 'x'; + sprintf_vma (tmp, disp); + for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++); + strcpy (buf + 2, tmp + i); + } + else + { + bfd_signed_vma v = disp; + char tmp[30]; + int i; + if (v < 0) + { + *(buf++) = '-'; + v = -disp; + /* Check for possible overflow on 0x8000000000000000. */ + if (v < 0) + { + strcpy (buf, "9223372036854775808"); + return; + } + } + if (!v) + { + strcpy (buf, "0"); + return; + } + + i = 0; + tmp[29] = 0; + while (v) + { + tmp[28 - i] = (v % 10) + '0'; + v /= 10; + i++; + } + strcpy (buf, tmp + 29 - i); + } + } + else + { + if (hex) + sprintf (buf, "0x%x", (unsigned int) disp); + else + sprintf (buf, "%d", (int) disp); + } +} + +static void +OP_E (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_vma disp; + int add = 0; + int riprel = 0; + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add += 8; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + + if (mod == 3) + { + switch (bytemode) + { + case b_mode: + USED_REX (0); + if (rex) + oappend (names8rex[rm + add]); + else + oappend (names8[rm + add]); + break; + case w_mode: + oappend (names16[rm + add]); + break; + case d_mode: + oappend (names32[rm + add]); + break; + case q_mode: + oappend (names64[rm + add]); + break; + case m_mode: + if (mode_64bit) + oappend (names64[rm + add]); + else + oappend (names32[rm + add]); + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + oappend (names64[rm + add]); + else if (sizeflag & DFLAG) + oappend (names32[rm + add]); + else + oappend (names16[rm + add]); + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 0: + if (!(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */) + && !(codep[-2] == 0xAE && codep[-1] == 0xF0 /* mfence */) + && !(codep[-2] == 0xAE && codep[-1] == 0xe8 /* lfence */)) + BadOp (); /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */ + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } + return; + } + + disp = 0; + append_seg (); + + if ((sizeflag & AFLAG) || mode_64bit) /* 32 bit address mode */ + { + int havesib; + int havebase; + int base; + int index = 0; + int scale = 0; + + havesib = 0; + havebase = 1; + base = rm; + + if (base == 4) + { + havesib = 1; + FETCH_DATA (the_info, codep + 1); + scale = (*codep >> 6) & 3; + index = (*codep >> 3) & 7; + base = *codep & 7; + USED_REX (REX_EXTY); + USED_REX (REX_EXTZ); + if (rex & REX_EXTY) + index += 8; + if (rex & REX_EXTZ) + base += 8; + codep++; + } + + switch (mod) + { + case 0: + if ((base & 7) == 5) + { + havebase = 0; + if (mode_64bit && !havesib && (sizeflag & AFLAG)) + riprel = 1; + disp = get32s (); + } + break; + case 1: + FETCH_DATA (the_info, codep + 1); + disp = *codep++; + if ((disp & 0x80) != 0) + disp -= 0x100; + break; + case 2: + disp = get32s (); + break; + } + + if (!intel_syntax) + if (mod != 0 || (base & 7) == 5) + { + print_operand_value (scratchbuf, !riprel, disp); + oappend (scratchbuf); + if (riprel) + { + set_op (disp, 1); + oappend ("(%rip)"); + } + } + + if (havebase || (havesib && (index != 4 || scale != 0))) + { + if (intel_syntax) + { + switch (bytemode) + { + case b_mode: + oappend ("BYTE PTR "); + break; + case w_mode: + oappend ("WORD PTR "); + break; + case v_mode: + oappend ("DWORD PTR "); + break; + case d_mode: + oappend ("QWORD PTR "); + break; + case m_mode: + if (mode_64bit) + oappend ("DWORD PTR "); + else + oappend ("QWORD PTR "); + break; + case x_mode: + oappend ("XWORD PTR "); + break; + default: + break; + } + } + *obufp++ = open_char; + if (intel_syntax && riprel) + oappend ("rip + "); + *obufp = '\0'; + USED_REX (REX_EXTZ); + if (!havesib && (rex & REX_EXTZ)) + base += 8; + if (havebase) + oappend (mode_64bit && (sizeflag & AFLAG) + ? names64[base] : names32[base]); + if (havesib) + { + if (index != 4) + { + if (intel_syntax) + { + if (havebase) + { + *obufp++ = separator_char; + *obufp = '\0'; + } + sprintf (scratchbuf, "%s", + mode_64bit && (sizeflag & AFLAG) + ? names64[index] : names32[index]); + } + else + sprintf (scratchbuf, ",%s", + mode_64bit && (sizeflag & AFLAG) + ? names64[index] : names32[index]); + oappend (scratchbuf); + } + if (!intel_syntax + || (intel_syntax + && bytemode != b_mode + && bytemode != w_mode + && bytemode != v_mode)) + { + *obufp++ = scale_char; + *obufp = '\0'; + sprintf (scratchbuf, "%d", 1 << scale); + oappend (scratchbuf); + } + } + if (intel_syntax) + if (mod != 0 || (base & 7) == 5) + { + /* Don't print zero displacements. */ + if (disp != 0) + { + if ((bfd_signed_vma) disp > 0) + { + *obufp++ = '+'; + *obufp = '\0'; + } + + print_operand_value (scratchbuf, 0, disp); + oappend (scratchbuf); + } + } + + *obufp++ = close_char; + *obufp = '\0'; + } + else if (intel_syntax) + { + if (mod != 0 || (base & 7) == 5) + { + if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS + | PREFIX_ES | PREFIX_FS | PREFIX_GS)) + ; + else + { + oappend (names_seg[ds_reg - es_reg]); + oappend (":"); + } + print_operand_value (scratchbuf, 1, disp); + oappend (scratchbuf); + } + } + } + else + { /* 16 bit address mode */ + switch (mod) + { + case 0: + if ((rm & 7) == 6) + { + disp = get16 (); + if ((disp & 0x8000) != 0) + disp -= 0x10000; + } + break; + case 1: + FETCH_DATA (the_info, codep + 1); + disp = *codep++; + if ((disp & 0x80) != 0) + disp -= 0x100; + break; + case 2: + disp = get16 (); + if ((disp & 0x8000) != 0) + disp -= 0x10000; + break; + } + + if (!intel_syntax) + if (mod != 0 || (rm & 7) == 6) + { + print_operand_value (scratchbuf, 0, disp); + oappend (scratchbuf); + } + + if (mod != 0 || (rm & 7) != 6) + { + *obufp++ = open_char; + *obufp = '\0'; + oappend (index16[rm + add]); + *obufp++ = close_char; + *obufp = '\0'; + } + } +} + +static void +OP_G (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add += 8; + switch (bytemode) + { + case b_mode: + USED_REX (0); + if (rex) + oappend (names8rex[reg + add]); + else + oappend (names8[reg + add]); + break; + case w_mode: + oappend (names16[reg + add]); + break; + case d_mode: + oappend (names32[reg + add]); + break; + case q_mode: + oappend (names64[reg + add]); + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + oappend (names64[reg + add]); + else if (sizeflag & DFLAG) + oappend (names32[reg + add]); + else + oappend (names16[reg + add]); + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } +} + +static bfd_vma +get64 () +{ + bfd_vma x; +#ifdef BFD64 + unsigned int a; + unsigned int b; + + FETCH_DATA (the_info, codep + 8); + a = *codep++ & 0xff; + a |= (*codep++ & 0xff) << 8; + a |= (*codep++ & 0xff) << 16; + a |= (*codep++ & 0xff) << 24; + b = *codep++ & 0xff; + b |= (*codep++ & 0xff) << 8; + b |= (*codep++ & 0xff) << 16; + b |= (*codep++ & 0xff) << 24; + x = a + ((bfd_vma) b << 32); +#else + abort (); + x = 0; +#endif + return x; +} + +static bfd_signed_vma +get32 () +{ + bfd_signed_vma x = 0; + + FETCH_DATA (the_info, codep + 4); + x = *codep++ & (bfd_signed_vma) 0xff; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 8; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 16; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 24; + return x; +} + +static bfd_signed_vma +get32s () +{ + bfd_signed_vma x = 0; + + FETCH_DATA (the_info, codep + 4); + x = *codep++ & (bfd_signed_vma) 0xff; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 8; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 16; + x |= (*codep++ & (bfd_signed_vma) 0xff) << 24; + + x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31); + + return x; +} + +static int +get16 () +{ + int x = 0; + + FETCH_DATA (the_info, codep + 2); + x = *codep++ & 0xff; + x |= (*codep++ & 0xff) << 8; + return x; +} + +static void +set_op (op, riprel) + bfd_vma op; + int riprel; +{ + op_index[op_ad] = op_ad; + if (mode_64bit) + { + op_address[op_ad] = op; + op_riprel[op_ad] = riprel; + } + else + { + /* Mask to get a 32-bit address. */ + op_address[op_ad] = op & 0xffffffff; + op_riprel[op_ad] = riprel & 0xffffffff; + } +} + +static void +OP_REG (code, sizeflag) + int code; + int sizeflag; +{ + const char *s; + int add = 0; + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add = 8; + + switch (code) + { + case indir_dx_reg: + if (intel_syntax) + s = "[dx]"; + else + s = "(%dx)"; + break; + case ax_reg: case cx_reg: case dx_reg: case bx_reg: + case sp_reg: case bp_reg: case si_reg: case di_reg: + s = names16[code - ax_reg + add]; + break; + case es_reg: case ss_reg: case cs_reg: + case ds_reg: case fs_reg: case gs_reg: + s = names_seg[code - es_reg + add]; + break; + case al_reg: case ah_reg: case cl_reg: case ch_reg: + case dl_reg: case dh_reg: case bl_reg: case bh_reg: + USED_REX (0); + if (rex) + s = names8rex[code - al_reg + add]; + else + s = names8[code - al_reg]; + break; + case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg: + case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg: + if (mode_64bit) + { + s = names64[code - rAX_reg + add]; + break; + } + code += eAX_reg - rAX_reg; + /* Fall through. */ + case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: + case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + s = names64[code - eAX_reg + add]; + else if (sizeflag & DFLAG) + s = names32[code - eAX_reg + add]; + else + s = names16[code - eAX_reg + add]; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + s = INTERNAL_DISASSEMBLER_ERROR; + break; + } + oappend (s); +} + +static void +OP_IMREG (code, sizeflag) + int code; + int sizeflag; +{ + const char *s; + + switch (code) + { + case indir_dx_reg: + if (intel_syntax) + s = "[dx]"; + else + s = "(%dx)"; + break; + case ax_reg: case cx_reg: case dx_reg: case bx_reg: + case sp_reg: case bp_reg: case si_reg: case di_reg: + s = names16[code - ax_reg]; + break; + case es_reg: case ss_reg: case cs_reg: + case ds_reg: case fs_reg: case gs_reg: + s = names_seg[code - es_reg]; + break; + case al_reg: case ah_reg: case cl_reg: case ch_reg: + case dl_reg: case dh_reg: case bl_reg: case bh_reg: + USED_REX (0); + if (rex) + s = names8rex[code - al_reg]; + else + s = names8[code - al_reg]; + break; + case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: + case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + s = names64[code - eAX_reg]; + else if (sizeflag & DFLAG) + s = names32[code - eAX_reg]; + else + s = names16[code - eAX_reg]; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + s = INTERNAL_DISASSEMBLER_ERROR; + break; + } + oappend (s); +} + +static void +OP_I (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_signed_vma op; + bfd_signed_vma mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++; + mask = 0xff; + break; + case q_mode: + if (mode_64bit) + { + op = get32s (); + break; + } + /* Fall through. */ + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + op = get32s (); + else if (sizeflag & DFLAG) + { + op = get32 (); + mask = 0xffffffff; + } + else + { + op = get16 (); + mask = 0xfffff; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case w_mode: + mask = 0xfffff; + op = get16 (); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + + op &= mask; + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, op); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; +} + +static void +OP_I64 (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_signed_vma op; + bfd_signed_vma mask = -1; + + if (!mode_64bit) + { + OP_I (bytemode, sizeflag); + return; + } + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++; + mask = 0xff; + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + op = get64 (); + else if (sizeflag & DFLAG) + { + op = get32 (); + mask = 0xffffffff; + } + else + { + op = get16 (); + mask = 0xfffff; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case w_mode: + mask = 0xfffff; + op = get16 (); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + + op &= mask; + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, op); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; +} + +static void +OP_sI (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_signed_vma op; + bfd_signed_vma mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++; + if ((op & 0x80) != 0) + op -= 0x100; + mask = 0xffffffff; + break; + case v_mode: + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + op = get32s (); + else if (sizeflag & DFLAG) + { + op = get32s (); + mask = 0xffffffff; + } + else + { + mask = 0xffffffff; + op = get16 (); + if ((op & 0x8000) != 0) + op -= 0x10000; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case w_mode: + op = get16 (); + mask = 0xffffffff; + if ((op & 0x8000) != 0) + op -= 0x10000; + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, op); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_J (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + bfd_vma disp; + bfd_vma mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + disp = *codep++; + if ((disp & 0x80) != 0) + disp -= 0x100; + break; + case v_mode: + if (sizeflag & DFLAG) + disp = get32s (); + else + { + disp = get16 (); + /* For some reason, a data16 prefix on a jump instruction + means that the pc is masked to 16 bits after the + displacement is added! */ + mask = 0xffff; + } + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + return; + } + disp = (start_pc + codep - start_codep + disp) & mask; + set_op (disp, 0); + print_operand_value (scratchbuf, 1, disp); + oappend (scratchbuf); +} + +static void +OP_SEG (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + oappend (names_seg[reg]); +} + +static void +OP_DIR (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag; +{ + int seg, offset; + + if (sizeflag & DFLAG) + { + offset = get32 (); + seg = get16 (); + } + else + { + offset = get16 (); + seg = get16 (); + } + used_prefixes |= (prefixes & PREFIX_DATA); + if (intel_syntax) + sprintf (scratchbuf, "0x%x,0x%x", seg, offset); + else + sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset); + oappend (scratchbuf); +} + +static void +OP_OFF (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag; +{ + bfd_vma off; + + append_seg (); + + if ((sizeflag & AFLAG) || mode_64bit) + off = get32 (); + else + off = get16 (); + + if (intel_syntax) + { + if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS + | PREFIX_ES | PREFIX_FS | PREFIX_GS))) + { + oappend (names_seg[ds_reg - es_reg]); + oappend (":"); + } + } + print_operand_value (scratchbuf, 1, off); + oappend (scratchbuf); +} + +static void +OP_OFF64 (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + bfd_vma off; + + if (!mode_64bit) + { + OP_OFF (bytemode, sizeflag); + return; + } + + append_seg (); + + off = get64 (); + + if (intel_syntax) + { + if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS + | PREFIX_ES | PREFIX_FS | PREFIX_GS))) + { + oappend (names_seg[ds_reg - es_reg]); + oappend (":"); + } + } + print_operand_value (scratchbuf, 1, off); + oappend (scratchbuf); +} + +static void +ptr_reg (code, sizeflag) + int code; + int sizeflag; +{ + const char *s; + if (intel_syntax) + oappend ("["); + else + oappend ("("); + + USED_REX (REX_MODE64); + if (rex & REX_MODE64) + { + if (!(sizeflag & AFLAG)) + s = names32[code - eAX_reg]; + else + s = names64[code - eAX_reg]; + } + else if (sizeflag & AFLAG) + s = names32[code - eAX_reg]; + else + s = names16[code - eAX_reg]; + oappend (s); + if (intel_syntax) + oappend ("]"); + else + oappend (")"); +} + +static void +OP_ESreg (code, sizeflag) + int code; + int sizeflag; +{ + oappend ("%es:" + intel_syntax); + ptr_reg (code, sizeflag); +} + +static void +OP_DSreg (code, sizeflag) + int code; + int sizeflag; +{ + if ((prefixes + & (PREFIX_CS + | PREFIX_DS + | PREFIX_SS + | PREFIX_ES + | PREFIX_FS + | PREFIX_GS)) == 0) + prefixes |= PREFIX_DS; + append_seg (); + ptr_reg (code, sizeflag); +} + +static void +OP_C (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + sprintf (scratchbuf, "%%cr%d", reg + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_D (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + if (intel_syntax) + sprintf (scratchbuf, "db%d", reg + add); + else + sprintf (scratchbuf, "%%db%d", reg + add); + oappend (scratchbuf); +} + +static void +OP_T (dummy, sizeflag) + int dummy ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + sprintf (scratchbuf, "%%tr%d", reg); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_Rd (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (mod == 3) + OP_E (bytemode, sizeflag); + else + BadOp (); +} + +static void +OP_MMX (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + sprintf (scratchbuf, "%%xmm%d", reg + add); + else + sprintf (scratchbuf, "%%mm%d", reg + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_XMM (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + int add = 0; + USED_REX (REX_EXTX); + if (rex & REX_EXTX) + add = 8; + sprintf (scratchbuf, "%%xmm%d", reg + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_EM (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + int add = 0; + if (mod != 3) + { + OP_E (bytemode, sizeflag); + return; + } + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add = 8; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + sprintf (scratchbuf, "%%xmm%d", rm + add); + else + sprintf (scratchbuf, "%%mm%d", rm + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_EX (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + int add = 0; + if (mod != 3) + { + OP_E (bytemode, sizeflag); + return; + } + USED_REX (REX_EXTZ); + if (rex & REX_EXTZ) + add = 8; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + sprintf (scratchbuf, "%%xmm%d", rm + add); + oappend (scratchbuf + intel_syntax); +} + +static void +OP_MS (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (mod == 3) + OP_EM (bytemode, sizeflag); + else + BadOp (); +} + +static void +OP_XS (bytemode, sizeflag) + int bytemode; + int sizeflag; +{ + if (mod == 3) + OP_EX (bytemode, sizeflag); + else + BadOp (); +} + +static const char *Suffix3DNow[] = { +/* 00 */ NULL, NULL, NULL, NULL, +/* 04 */ NULL, NULL, NULL, NULL, +/* 08 */ NULL, NULL, NULL, NULL, +/* 0C */ "pi2fw", "pi2fd", NULL, NULL, +/* 10 */ NULL, NULL, NULL, NULL, +/* 14 */ NULL, NULL, NULL, NULL, +/* 18 */ NULL, NULL, NULL, NULL, +/* 1C */ "pf2iw", "pf2id", NULL, NULL, +/* 20 */ NULL, NULL, NULL, NULL, +/* 24 */ NULL, NULL, NULL, NULL, +/* 28 */ NULL, NULL, NULL, NULL, +/* 2C */ NULL, NULL, NULL, NULL, +/* 30 */ NULL, NULL, NULL, NULL, +/* 34 */ NULL, NULL, NULL, NULL, +/* 38 */ NULL, NULL, NULL, NULL, +/* 3C */ NULL, NULL, NULL, NULL, +/* 40 */ NULL, NULL, NULL, NULL, +/* 44 */ NULL, NULL, NULL, NULL, +/* 48 */ NULL, NULL, NULL, NULL, +/* 4C */ NULL, NULL, NULL, NULL, +/* 50 */ NULL, NULL, NULL, NULL, +/* 54 */ NULL, NULL, NULL, NULL, +/* 58 */ NULL, NULL, NULL, NULL, +/* 5C */ NULL, NULL, NULL, NULL, +/* 60 */ NULL, NULL, NULL, NULL, +/* 64 */ NULL, NULL, NULL, NULL, +/* 68 */ NULL, NULL, NULL, NULL, +/* 6C */ NULL, NULL, NULL, NULL, +/* 70 */ NULL, NULL, NULL, NULL, +/* 74 */ NULL, NULL, NULL, NULL, +/* 78 */ NULL, NULL, NULL, NULL, +/* 7C */ NULL, NULL, NULL, NULL, +/* 80 */ NULL, NULL, NULL, NULL, +/* 84 */ NULL, NULL, NULL, NULL, +/* 88 */ NULL, NULL, "pfnacc", NULL, +/* 8C */ NULL, NULL, "pfpnacc", NULL, +/* 90 */ "pfcmpge", NULL, NULL, NULL, +/* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt", +/* 98 */ NULL, NULL, "pfsub", NULL, +/* 9C */ NULL, NULL, "pfadd", NULL, +/* A0 */ "pfcmpgt", NULL, NULL, NULL, +/* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1", +/* A8 */ NULL, NULL, "pfsubr", NULL, +/* AC */ NULL, NULL, "pfacc", NULL, +/* B0 */ "pfcmpeq", NULL, NULL, NULL, +/* B4 */ "pfmul", NULL, "pfrcpit2", "pfmulhrw", +/* B8 */ NULL, NULL, NULL, "pswapd", +/* BC */ NULL, NULL, NULL, "pavgusb", +/* C0 */ NULL, NULL, NULL, NULL, +/* C4 */ NULL, NULL, NULL, NULL, +/* C8 */ NULL, NULL, NULL, NULL, +/* CC */ NULL, NULL, NULL, NULL, +/* D0 */ NULL, NULL, NULL, NULL, +/* D4 */ NULL, NULL, NULL, NULL, +/* D8 */ NULL, NULL, NULL, NULL, +/* DC */ NULL, NULL, NULL, NULL, +/* E0 */ NULL, NULL, NULL, NULL, +/* E4 */ NULL, NULL, NULL, NULL, +/* E8 */ NULL, NULL, NULL, NULL, +/* EC */ NULL, NULL, NULL, NULL, +/* F0 */ NULL, NULL, NULL, NULL, +/* F4 */ NULL, NULL, NULL, NULL, +/* F8 */ NULL, NULL, NULL, NULL, +/* FC */ NULL, NULL, NULL, NULL, +}; + +static void +OP_3DNowSuffix (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + const char *mnemonic; + + FETCH_DATA (the_info, codep + 1); + /* AMD 3DNow! instructions are specified by an opcode suffix in the + place where an 8-bit immediate would normally go. ie. the last + byte of the instruction. */ + obufp = obuf + strlen (obuf); + mnemonic = Suffix3DNow[*codep++ & 0xff]; + if (mnemonic) + oappend (mnemonic); + else + { + /* Since a variable sized modrm/sib chunk is between the start + of the opcode (0x0f0f) and the opcode suffix, we need to do + all the modrm processing first, and don't know until now that + we have a bad opcode. This necessitates some cleaning up. */ + op1out[0] = '\0'; + op2out[0] = '\0'; + BadOp (); + } +} + +static const char *simd_cmp_op[] = { + "eq", + "lt", + "le", + "unord", + "neq", + "nlt", + "nle", + "ord" +}; + +static void +OP_SIMD_Suffix (bytemode, sizeflag) + int bytemode ATTRIBUTE_UNUSED; + int sizeflag ATTRIBUTE_UNUSED; +{ + unsigned int cmp_type; + + FETCH_DATA (the_info, codep + 1); + obufp = obuf + strlen (obuf); + cmp_type = *codep++ & 0xff; + if (cmp_type < 8) + { + char suffix1 = 'p', suffix2 = 's'; + used_prefixes |= (prefixes & PREFIX_REPZ); + if (prefixes & PREFIX_REPZ) + suffix1 = 's'; + else + { + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + suffix2 = 'd'; + else + { + used_prefixes |= (prefixes & PREFIX_REPNZ); + if (prefixes & PREFIX_REPNZ) + suffix1 = 's', suffix2 = 'd'; + } + } + sprintf (scratchbuf, "cmp%s%c%c", + simd_cmp_op[cmp_type], suffix1, suffix2); + used_prefixes |= (prefixes & PREFIX_REPZ); + oappend (scratchbuf); + } + else + { + /* We have a bad extension byte. Clean up. */ + op1out[0] = '\0'; + op2out[0] = '\0'; + BadOp (); + } +} + +static void +SIMD_Fixup (extrachar, sizeflag) + int extrachar; + int sizeflag ATTRIBUTE_UNUSED; +{ + /* Change movlps/movhps to movhlps/movlhps for 2 register operand + forms of these instructions. */ + if (mod == 3) + { + char *p = obuf + strlen (obuf); + *(p + 1) = '\0'; + *p = *(p - 1); + *(p - 1) = *(p - 2); + *(p - 2) = *(p - 3); + *(p - 3) = extrachar; + } +} + +static void +BadOp (void) +{ + /* Throw away prefixes and 1st. opcode byte. */ + codep = insn_codep + 1; + oappend ("(bad)"); +} diff --git a/reactos/ntoskrnl/kdbg/amd64/kdb.c b/reactos/ntoskrnl/kdbg/amd64/kdb.c new file mode 100644 index 00000000000..239902f3234 --- /dev/null +++ b/reactos/ntoskrnl/kdbg/amd64/kdb.c @@ -0,0 +1,111 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/kdbg/amd64/kdb.c + * PURPOSE: Kernel Debugger + * PROGRAMMERS: + */ + + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +ULONG +NTAPI +KiEspFromTrapFrame(IN PKTRAP_FRAME TrapFrame) +{ + return TrapFrame->Rsp; +} + +VOID +NTAPI +KiEspToTrapFrame(IN PKTRAP_FRAME TrapFrame, + IN ULONG_PTR Esp) +{ + KIRQL OldIrql; + ULONG Previous; + + /* Raise to APC_LEVEL if needed */ + OldIrql = KeGetCurrentIrql(); + if (OldIrql < APC_LEVEL) KeRaiseIrql(APC_LEVEL, &OldIrql); + + /* Get the old ESP */ + Previous = KiEspFromTrapFrame(TrapFrame); + + /* Check if this is user-mode */ + if ((TrapFrame->SegCs & MODE_MASK)) + { + /* Write it directly */ + TrapFrame->Rsp = Esp; + } + else + { + /* Don't allow ESP to be lowered, this is illegal */ + if (Esp < Previous) KeBugCheckEx(SET_OF_INVALID_CONTEXT, + Esp, + Previous, + (ULONG_PTR)TrapFrame, + 0); + + /* Create an edit frame, check if it was alrady */ + if (!(TrapFrame->SegCs & FRAME_EDITED)) + { + /* Update the value */ + TrapFrame->Rsp = Esp; + } + else + { + /* Check if ESP changed */ + if (Previous != Esp) + { + /* Save CS */ + TrapFrame->SegCs &= ~FRAME_EDITED; + + /* Save ESP */ + TrapFrame->Rsp = Esp; + } + } + } + + /* Restore IRQL */ + if (OldIrql < APC_LEVEL) KeLowerIrql(OldIrql); + +} + +ULONG +NTAPI +KiSsFromTrapFrame(IN PKTRAP_FRAME TrapFrame) +{ + if (TrapFrame->SegCs & MODE_MASK) + { + /* User mode, return the User SS */ + return TrapFrame->SegSs | RPL_MASK; + } + else + { + /* Kernel mode */ + return KGDT64_SYS_TSS; + } +} + +VOID +NTAPI +KiSsToTrapFrame(IN PKTRAP_FRAME TrapFrame, + IN ULONG Ss) +{ + /* Remove the high-bits */ + Ss &= 0xFFFF; + + if (TrapFrame->SegCs & MODE_MASK) + { + /* Usermode, save the User SS */ + TrapFrame->SegSs = Ss | RPL_MASK; + } + +} + + + diff --git a/reactos/ntoskrnl/kdbg/amd64/kdb_help.S b/reactos/ntoskrnl/kdbg/amd64/kdb_help.S new file mode 100644 index 00000000000..eb777010513 --- /dev/null +++ b/reactos/ntoskrnl/kdbg/amd64/kdb_help.S @@ -0,0 +1,152 @@ +#include +#include + +.globl KdbEnter +KdbEnter: + + /* save flags */ + pushfq +// .pushreg ? + + /* Make room for a KTRAP_FRAME */ + sub rsp, SIZE_KTRAP_FRAME +// .allocstack SIZE_KTRAP_FRAME + + /* Save rbp */ + mov [rsp + KTRAP_FRAME_Rbp], rbp + + /* Save non-volatile registers */ + mov [rsp + KTRAP_FRAME_Rbx], rbx + mov [rsp + KTRAP_FRAME_Rdi], rdi + mov [rsp + KTRAP_FRAME_Rsi], rsi + + /* Save volatile registers */ + mov [rsp + KTRAP_FRAME_Rax], rax + mov [rsp + KTRAP_FRAME_Rcx], rcx + mov [rsp + KTRAP_FRAME_Rdx], rdx + mov [rsp + KTRAP_FRAME_R8], r8 + mov [rsp + KTRAP_FRAME_R9], r9 + mov [rsp + KTRAP_FRAME_R10], r10 + mov [rsp + KTRAP_FRAME_R11], r11 + + /* Save xmm registers */ + movdqa [rsp + KTRAP_FRAME_Xmm0], xmm0 + movdqa [rsp + KTRAP_FRAME_Xmm1], xmm1 + movdqa [rsp + KTRAP_FRAME_Xmm2], xmm2 + movdqa [rsp + KTRAP_FRAME_Xmm3], xmm3 + movdqa [rsp + KTRAP_FRAME_Xmm4], xmm4 + movdqa [rsp + KTRAP_FRAME_Xmm5], xmm5 + + /* Save cs and previous mode */ + mov ax, cs + mov [rsp + KTRAP_FRAME_SegCs], ax + and ax, 1 + mov [rsp + KTRAP_FRAME_PreviousMode], al + + /* Save segment selectors */ + mov ax, ds + mov [rsp + KTRAP_FRAME_SegDs], ax + mov ax, es + mov [rsp + KTRAP_FRAME_SegEs], ax + mov ax, fs + mov [rsp + KTRAP_FRAME_SegFs], ax + mov ax, gs + mov [rsp + KTRAP_FRAME_SegGs], ax + + /* Save previous irql */ + mov rax, cr8 + mov [rsp + KTRAP_FRAME_PreviousIrql], al + + /* Save debug registers */ + mov rax, dr0 + mov [rsp + KTRAP_FRAME_Dr0], rax + mov rax, dr1 + mov [rsp + KTRAP_FRAME_Dr1], rax + mov rax, dr2 + mov [rsp + KTRAP_FRAME_Dr2], rax + mov rax, dr3 + mov [rsp + KTRAP_FRAME_Dr3], rax + mov rax, dr6 + mov [rsp + KTRAP_FRAME_Dr6], rax + mov rax, dr7 + mov [rsp + KTRAP_FRAME_Dr7], rax + + /* Point rbp, where rsp was before */ + lea rbp, [rsp + SIZE_KTRAP_FRAME] + mov [rsp + KTRAP_FRAME_Rsp], rbp + + /* Store the EFLAGS we previously pushed on the stack */ + mov rax, [rbp + 8] + mov [rsp + KTRAP_FRAME_EFlags], rax + + /* Get RIP from the stack */ + mov rax, [rbp + 16] + mov [rsp + KTRAP_FRAME_Rip], rax + + /* Make sure the direction flag is cleared */ + cld + + /* Clear all breakpoint enables in dr7. */ + mov rax, dr7 + and rax, 0xFFFF0000 + mov dr7, rax + + /* Call KDB */ + mov byte ptr [rsp + KTRAP_FRAME_P5], 1 /* FirstChance */ + mov r9, rsp /* Pointer to the trap frame */ + mov r8, 0 /* Context */ + mov dl, 0 /* PreviousMode (KernelMode) */ + mov rcx, 0 /* ExceptionRecord */ + call KdbEnterDebuggerException + + /* Restore segment selectors */ + mov ax, [rsp + KTRAP_FRAME_SegDs] + mov ds, ax + mov ax, [rsp + KTRAP_FRAME_SegEs] + mov es, ax + mov ax, [rsp + KTRAP_FRAME_SegFs] + mov fs, ax + + /* Restore non-volatile registers */ + mov rbx, [rsp + KTRAP_FRAME_Rbx] + mov rdi, [rsp + KTRAP_FRAME_Rdi] + mov rsi, [rsp + KTRAP_FRAME_Rsi] + + /* Restore volatile registers */ + mov rax, [rsp + KTRAP_FRAME_Rax] + mov rcx, [rsp + KTRAP_FRAME_Rcx] + mov rdx, [rsp + KTRAP_FRAME_Rdx] + mov r8, [rsp + KTRAP_FRAME_R8] + mov r9, [rsp + KTRAP_FRAME_R9] + mov r10, [rsp + KTRAP_FRAME_R10] + mov r11, [rsp + KTRAP_FRAME_R11] + + /* Restore RSP */ + mov rsp, [rsp + KTRAP_FRAME_Rsp] + + /* Restore EFLAGS */ + popfq + + ret + +.globl KdbpStackSwitchAndCall +KdbpStackSwitchAndCall: + + /* Save old stack */ + mov rax, rsp + + /* Set new stack */ + mov rsp, rcx + + /* Save old stack on new stack */ + push rax + + /* Call function */ + call rdx + + /* Restire old stack */ + pop rax + mov rsp, rax + + /* Return */ + ret \ No newline at end of file diff --git a/reactos/ntoskrnl/ke/amd64/boot.S b/reactos/ntoskrnl/ke/amd64/boot.S new file mode 100644 index 00000000000..f1715c6663e --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/boot.S @@ -0,0 +1,64 @@ +/* + * FILE: ntoskrnl/ke/i386/boot.S + * COPYRIGHT: See COPYING in the top level directory + * PURPOSE: FreeLDR Wrapper Bootstrap Code and Bootstrap Trampoline + * PROGRAMMERs: Alex Ionescu (alex@relsoft.net) + * Thomas Weidenmueller + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +EXTERN KiInitializeKernelAndGotoIdleLoop:PROC + +/* GLOBALS *******************************************************************/ + + +/* FUNCTIONS *****************************************************************/ + +.code64 +.text + +/** + * VOID + * KiSetupStackAndInitializeKernel( + * IN PKPROCESS InitProcess, + * IN PKTHREAD InitThread, + * IN PVOID IdleStack, + * IN PKPRCB Prcb, + * IN CCHAR Number, + * IN PLOADER_PARAMETER_BLOCK LoaderBlock) + */ +PUBLIC KiSetupStackAndInitializeKernel +.PROC KiSetupStackAndInitializeKernel + + /* Save current stack */ + mov rsi, rsp + + /* Setup the new stack */ + mov ax, HEX(18) + mov ss, ax + mov rsp, r8 + sub rsp, HEX(300) // FIXME + + /* Copy stack parameters to the new stack */ + sub rsp, HEX(38) + .ENDPROLOG + + mov rdi, rsp + movsq + movsq + movsq + movsq + movsq + movsq + movsq + + jmp KiInitializeKernelAndGotoIdleLoop + +.ENDP KiSetupStackAndInitializeKernel + +END + diff --git a/reactos/ntoskrnl/ke/amd64/context.c b/reactos/ntoskrnl/ke/amd64/context.c new file mode 100644 index 00000000000..239a697e660 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/context.c @@ -0,0 +1,250 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: CONTEXT related functions + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include + +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +KeContextToTrapFrame(IN PCONTEXT Context, + IN OUT PKEXCEPTION_FRAME ExceptionFrame, + IN OUT PKTRAP_FRAME TrapFrame, + IN ULONG ContextFlags, + IN KPROCESSOR_MODE PreviousMode) +{ + KIRQL OldIrql; + + /* Do this at APC_LEVEL */ + OldIrql = KeGetCurrentIrql(); + if (OldIrql < APC_LEVEL) KeRaiseIrql(APC_LEVEL, &OldIrql); + + /* Handle integer registers */ + if ((Context->ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER) + { + TrapFrame->Rax = Context->Rax; + TrapFrame->Rbx = Context->Rbx; + TrapFrame->Rcx = Context->Rcx; + TrapFrame->Rdx = Context->Rdx; + TrapFrame->Rsi = Context->Rsi; + TrapFrame->Rdi = Context->Rdi; + TrapFrame->Rbp = Context->Rbp; + TrapFrame->R8 = Context->R8; + TrapFrame->R9 = Context->R9; + TrapFrame->R10 = Context->R10; + TrapFrame->R11 = Context->R11; + ExceptionFrame->R12 = Context->R12; + ExceptionFrame->R13 = Context->R13; + ExceptionFrame->R14 = Context->R14; + ExceptionFrame->R15 = Context->R15; + } + + /* Handle floating point registers */ + if (((Context->ContextFlags & CONTEXT_FLOATING_POINT) == + CONTEXT_FLOATING_POINT) && (Context->SegCs & MODE_MASK)) + { + TrapFrame->Xmm0 = Context->Xmm0; + TrapFrame->Xmm1 = Context->Xmm1; + TrapFrame->Xmm2 = Context->Xmm2; + TrapFrame->Xmm3 = Context->Xmm3; + TrapFrame->Xmm4 = Context->Xmm4; + TrapFrame->Xmm5 = Context->Xmm5; + ExceptionFrame->Xmm6 = Context->Xmm6; + ExceptionFrame->Xmm7 = Context->Xmm7; + ExceptionFrame->Xmm8 = Context->Xmm8; + ExceptionFrame->Xmm9 = Context->Xmm9; + ExceptionFrame->Xmm10 = Context->Xmm10; + ExceptionFrame->Xmm11 = Context->Xmm11; + ExceptionFrame->Xmm12 = Context->Xmm12; + ExceptionFrame->Xmm13 = Context->Xmm13; + ExceptionFrame->Xmm14 = Context->Xmm14; + ExceptionFrame->Xmm15 = Context->Xmm15; + } + + /* Handle control registers */ + if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) + { + /* Check if this was a Kernel Trap */ + if (Context->SegCs == KGDT64_R0_CODE) + { + /* Set valid selectors */ + TrapFrame->SegCs = KGDT64_R0_CODE; + TrapFrame->SegSs = KGDT64_R0_DATA; + } + else + { + /* Copy selectors */ + TrapFrame->SegCs = Context->SegCs; + TrapFrame->SegSs = Context->SegSs; + } + + /* RIP, RSP, EFLAGS */ + TrapFrame->Rip = Context->Rip; + TrapFrame->Rsp = Context->Rsp; + TrapFrame->EFlags = Context->EFlags; + } + + /* Handle segment selectors */ + if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) + { + /* Check if this was a Kernel Trap */ + if (Context->SegCs == KGDT64_R0_CODE) + { + /* Set valid selectors */ + TrapFrame->SegDs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegEs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + TrapFrame->SegGs = KGDT64_R3_DATA | RPL_MASK; + } + else + { + /* Copy selectors */ + TrapFrame->SegDs = Context->SegDs; + TrapFrame->SegEs = Context->SegEs; + TrapFrame->SegFs = Context->SegFs; + TrapFrame->SegGs = Context->SegGs; + } + } + + /* Handle debug registers */ + if ((Context->ContextFlags & CONTEXT_DEBUG_REGISTERS) == + CONTEXT_DEBUG_REGISTERS) + { + /* Copy the debug registers */ + TrapFrame->Dr0 = Context->Dr0; + TrapFrame->Dr1 = Context->Dr1; + TrapFrame->Dr2 = Context->Dr2; + TrapFrame->Dr3 = Context->Dr3; + TrapFrame->Dr6 = Context->Dr6; + TrapFrame->Dr7 = Context->Dr7; + } + + /* Restore IRQL */ + if (OldIrql < APC_LEVEL) KeLowerIrql(OldIrql); +} + +VOID +NTAPI +KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, + IN PKEXCEPTION_FRAME ExceptionFrame, + IN OUT PCONTEXT Context) +{ + KIRQL OldIrql; + + /* Do this at APC_LEVEL */ + OldIrql = KeGetCurrentIrql(); + if (OldIrql < APC_LEVEL) KeRaiseIrql(APC_LEVEL, &OldIrql); + + /* Handle integer registers */ + if ((Context->ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER) + { + Context->Rax = TrapFrame->Rax; + Context->Rbx = TrapFrame->Rbx; + Context->Rcx = TrapFrame->Rcx; + Context->Rdx = TrapFrame->Rdx; + Context->Rsi = TrapFrame->Rsi; + Context->Rdi = TrapFrame->Rdi; + Context->Rbp = TrapFrame->Rbp; + Context->R8 = TrapFrame->R8; + Context->R9 = TrapFrame->R9; + Context->R10 = TrapFrame->R10; + Context->R11 = TrapFrame->R11; + Context->R12 = ExceptionFrame->R12; + Context->R13 = ExceptionFrame->R13; + Context->R14 = ExceptionFrame->R14; + Context->R15 = ExceptionFrame->R15; + } + + /* Handle floating point registers */ + if (((Context->ContextFlags & CONTEXT_FLOATING_POINT) == + CONTEXT_FLOATING_POINT) && (TrapFrame->SegCs & MODE_MASK)) + { + Context->Xmm0 = TrapFrame->Xmm0; + Context->Xmm1 = TrapFrame->Xmm1; + Context->Xmm2 = TrapFrame->Xmm2; + Context->Xmm3 = TrapFrame->Xmm3; + Context->Xmm4 = TrapFrame->Xmm4; + Context->Xmm5 = TrapFrame->Xmm5; + Context->Xmm6 = ExceptionFrame->Xmm6; + Context->Xmm7 = ExceptionFrame->Xmm7; + Context->Xmm8 = ExceptionFrame->Xmm8; + Context->Xmm9 = ExceptionFrame->Xmm9; + Context->Xmm10 = ExceptionFrame->Xmm10; + Context->Xmm11 = ExceptionFrame->Xmm11; + Context->Xmm12 = ExceptionFrame->Xmm12; + Context->Xmm13 = ExceptionFrame->Xmm13; + Context->Xmm14 = ExceptionFrame->Xmm14; + Context->Xmm15 = ExceptionFrame->Xmm15; + } + + /* Handle control registers */ + if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) + { + /* Check if this was a Kernel Trap */ + if (TrapFrame->SegCs == KGDT64_R0_CODE) + { + /* Set valid selectors */ + Context->SegCs = KGDT64_R0_CODE; + Context->SegSs = KGDT64_R0_DATA; + } + else + { + /* Copy selectors */ + Context->SegCs = TrapFrame->SegCs; + Context->SegSs = TrapFrame->SegSs; + } + + /* Copy RIP, RSP, EFLAGS */ + Context->Rip = TrapFrame->Rip; + Context->Rsp = TrapFrame->Rsp; + Context->EFlags = TrapFrame->EFlags; + } + + /* Handle segment selectors */ + if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) + { + /* Check if this was a Kernel Trap */ + if (TrapFrame->SegCs == KGDT64_R0_CODE) + { + /* Set valid selectors */ + Context->SegDs = KGDT64_R3_DATA | RPL_MASK; + Context->SegEs = KGDT64_R3_DATA | RPL_MASK; + Context->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + Context->SegGs = KGDT64_R3_DATA | RPL_MASK; + } + else + { + /* Copy selectors */ + Context->SegDs = TrapFrame->SegDs; + Context->SegEs = TrapFrame->SegEs; + Context->SegFs = TrapFrame->SegFs; + Context->SegGs = TrapFrame->SegGs; + } + } + + /* Handle debug registers */ + if ((Context->ContextFlags & CONTEXT_DEBUG_REGISTERS) == + CONTEXT_DEBUG_REGISTERS) + { + /* Copy the debug registers */ + Context->Dr0 = TrapFrame->Dr0; + Context->Dr1 = TrapFrame->Dr1; + Context->Dr2 = TrapFrame->Dr2; + Context->Dr3 = TrapFrame->Dr3; + Context->Dr6 = TrapFrame->Dr6; + Context->Dr7 = TrapFrame->Dr7; + } + + /* Restore IRQL */ + if (OldIrql < APC_LEVEL) KeLowerIrql(OldIrql); +} + diff --git a/reactos/ntoskrnl/ke/amd64/cpu.c b/reactos/ntoskrnl/ke/amd64/cpu.c new file mode 100644 index 00000000000..90a6b2c0641 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/cpu.c @@ -0,0 +1,589 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/amd64/cpu.c + * PURPOSE: Routines for CPU-level support + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES *****************************************************************/ + +#include +#define NDEBUG +#include + +/* FIXME: Local EFLAGS defines not used anywhere else */ +#define EFLAGS_IOPL 0x3000 +#define EFLAGS_NF 0x4000 +#define EFLAGS_RF 0x10000 +#define EFLAGS_ID 0x200000 + +/* GLOBALS *******************************************************************/ + +/* The Boot TSS */ +KTSS64 KiBootTss; + +/* CPU Features and Flags */ +ULONG KeI386CpuType; +ULONG KeI386CpuStep; +ULONG KeProcessorArchitecture; +ULONG KeProcessorLevel; +ULONG KeProcessorRevision; +ULONG KeFeatureBits; +ULONG KeI386MachineType; +ULONG KeI386NpxPresent = 1; +ULONG KeLargestCacheLine = 0x40; +ULONG KiDmaIoCoherency = 0; +CHAR KeNumberProcessors = 0; +KAFFINITY KeActiveProcessors = 1; +BOOLEAN KiI386PentiumLockErrataPresent; +BOOLEAN KiSMTProcessorsPresent; + +/* Freeze data */ +KIRQL KiOldIrql; +ULONG KiFreezeFlag; + +/* Flush data */ +volatile LONG KiTbFlushTimeStamp; + +/* CPU Signatures */ +static const CHAR CmpIntelID[] = "GenuineIntel"; +static const CHAR CmpAmdID[] = "AuthenticAMD"; +static const CHAR CmpCyrixID[] = "CyrixInstead"; +static const CHAR CmpTransmetaID[] = "GenuineTMx86"; +static const CHAR CmpCentaurID[] = "CentaurHauls"; +static const CHAR CmpRiseID[] = "RiseRiseRise"; + +/* SUPPORT ROUTINES FOR MSVC COMPATIBILITY ***********************************/ + +VOID +NTAPI +CPUID(IN ULONG InfoType, + OUT PULONG CpuInfoEax, + OUT PULONG CpuInfoEbx, + OUT PULONG CpuInfoEcx, + OUT PULONG CpuInfoEdx) +{ + ULONG CpuInfo[4]; + + /* Perform the CPUID Operation */ + __cpuid((int*)CpuInfo, InfoType); + + /* Return the results */ + *CpuInfoEax = CpuInfo[0]; + *CpuInfoEbx = CpuInfo[1]; + *CpuInfoEcx = CpuInfo[2]; + *CpuInfoEdx = CpuInfo[3]; +} + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +KiSetProcessorType(VOID) +{ + ULONG64 EFlags; + INT Reg[4]; + ULONG Stepping, Type; + + /* Start by assuming no CPUID data */ + KeGetCurrentPrcb()->CpuID = 0; + + /* Save EFlags */ + EFlags = __readeflags(); + + /* Do CPUID 1 now */ + __cpuid(Reg, 1); + + /* + * Get the Stepping and Type. The stepping contains both the + * Model and the Step, while the Type contains the returned Type. + * We ignore the family. + * + * For the stepping, we convert this: zzzzzzxy into this: x0y + */ + Stepping = Reg[0] & 0xF0; + Stepping <<= 4; + Stepping += (Reg[0] & 0xFF); + Stepping &= 0xF0F; + Type = Reg[0] & 0xF00; + Type >>= 8; + + /* Save them in the PRCB */ + KeGetCurrentPrcb()->CpuID = TRUE; + KeGetCurrentPrcb()->CpuType = (UCHAR)Type; + KeGetCurrentPrcb()->CpuStep = (USHORT)Stepping; + + /* Restore EFLAGS */ + __writeeflags(EFlags); +} + +ULONG +NTAPI +KiGetCpuVendor(VOID) +{ + PKPRCB Prcb = KeGetCurrentPrcb(); + INT Vendor[5]; + + /* Get the Vendor ID and null-terminate it */ + __cpuid(Vendor, 0); + + /* Copy it to the PRCB and null-terminate it */ + *(ULONG*)&Prcb->VendorString[0] = Vendor[1]; // ebx + *(ULONG*)&Prcb->VendorString[4] = Vendor[3]; // edx + *(ULONG*)&Prcb->VendorString[8] = Vendor[2]; // ecx + *(ULONG*)&Prcb->VendorString[12] = 0; + + /* Now check the CPU Type */ + if (!strcmp((PCHAR)Prcb->VendorString, CmpIntelID)) + { + return CPU_INTEL; + } + else if (!strcmp((PCHAR)Prcb->VendorString, CmpAmdID)) + { + return CPU_AMD; + } + else if (!strcmp((PCHAR)Prcb->VendorString, CmpCyrixID)) + { + DPRINT1("Cyrix CPUs not fully supported\n"); + return 0; + } + else if (!strcmp((PCHAR)Prcb->VendorString, CmpTransmetaID)) + { + DPRINT1("Transmeta CPUs not fully supported\n"); + return 0; + } + else if (!strcmp((PCHAR)Prcb->VendorString, CmpCentaurID)) + { + DPRINT1("VIA CPUs not fully supported\n"); + return 0; + } + else if (!strcmp((PCHAR)Prcb->VendorString, CmpRiseID)) + { + DPRINT1("Rise CPUs not fully supported\n"); + return 0; + } + + /* Invalid CPU */ + return 0; +} + +ULONG +NTAPI +KiGetFeatureBits(VOID) +{ + PKPRCB Prcb = KeGetCurrentPrcb(); + ULONG Vendor; + ULONG FeatureBits = KF_WORKING_PTE; + INT Reg[4]; + ULONG CpuFeatures = 0; + + /* Get the Vendor ID */ + Vendor = KiGetCpuVendor(); + + /* Make sure we got a valid vendor ID at least. */ + if (!Vendor) return FeatureBits; + + /* Get the CPUID Info. Features are in Reg[3]. */ + __cpuid(Reg, 1); + + /* Set the initial APIC ID */ + Prcb->InitialApicId = (UCHAR)(Reg[1] >> 24); + + /* Set the current features */ + CpuFeatures = Reg[3]; + + /* Convert all CPUID Feature bits into our format */ + if (CpuFeatures & 0x00000002) FeatureBits |= KF_V86_VIS | KF_CR4; + if (CpuFeatures & 0x00000008) FeatureBits |= KF_LARGE_PAGE | KF_CR4; + if (CpuFeatures & 0x00000010) FeatureBits |= KF_RDTSC; + if (CpuFeatures & 0x00000100) FeatureBits |= KF_CMPXCHG8B; + if (CpuFeatures & 0x00000800) FeatureBits |= KF_FAST_SYSCALL; + if (CpuFeatures & 0x00001000) FeatureBits |= KF_MTRR; + if (CpuFeatures & 0x00002000) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4; + if (CpuFeatures & 0x00008000) FeatureBits |= KF_CMOV; + if (CpuFeatures & 0x00010000) FeatureBits |= KF_PAT; + if (CpuFeatures & 0x00200000) FeatureBits |= KF_DTS; + if (CpuFeatures & 0x00800000) FeatureBits |= KF_MMX; + if (CpuFeatures & 0x01000000) FeatureBits |= KF_FXSR; + if (CpuFeatures & 0x02000000) FeatureBits |= KF_XMMI; + if (CpuFeatures & 0x04000000) FeatureBits |= KF_XMMI64; + +#if 0 + if (Reg[2] & 0x00000001) FeatureBits |= KF_SSE3NEW; + if (Reg[2] & 0x00000008) FeatureBits |= KF_MONITOR; + if (Reg[2] & 0x00000200) FeatureBits |= KF_SSE3SUP; + if (Reg[2] & 0x00002000) FeatureBits |= KF_CMPXCHG16B; + if (Reg[2] & 0x00080000) FeatureBits |= KF_SSE41; + if (Reg[2] & 0x00800000) FeatureBits |= KF_POPCNT; +#endif + + /* Check if the CPU has hyper-threading */ + if (CpuFeatures & 0x10000000) + { + /* Set the number of logical CPUs */ + Prcb->LogicalProcessorsPerPhysicalProcessor = (UCHAR)(Reg[1] >> 16); + if (Prcb->LogicalProcessorsPerPhysicalProcessor > 1) + { + /* We're on dual-core */ + KiSMTProcessorsPresent = TRUE; + } + } + else + { + /* We only have a single CPU */ + Prcb->LogicalProcessorsPerPhysicalProcessor = 1; + } + + /* Check extended cpuid features */ + __cpuid(Reg, 0x80000000); + if ((Reg[0] & 0xffffff00) == 0x80000000) + { + /* Check if CPUID 0x80000001 is supported */ + if (Reg[0] >= 0x80000001) + { + /* Check which extended features are available. */ + __cpuid(Reg, 0x80000001); + + /* Check if NX-bit is supported */ + if (Reg[3] & 0x00100000) FeatureBits |= KF_NX_BIT; + + /* Now handle each features for each CPU Vendor */ + switch (Vendor) + { + case CPU_AMD: + if (Reg[3] & 0x80000000) FeatureBits |= KF_3DNOW; + break; + } + } + } + + /* Return the Feature Bits */ + return FeatureBits; +} + +VOID +NTAPI +KiGetCacheInformation(VOID) +{ + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + ULONG Vendor; + INT Data[4]; + ULONG CacheRequests = 0, i; + ULONG CurrentRegister; + UCHAR RegisterByte; + BOOLEAN FirstPass = TRUE; + + /* Set default L2 size */ + Pcr->SecondLevelCacheSize = 0; + + /* Get the Vendor ID and make sure we support CPUID */ + Vendor = KiGetCpuVendor(); + if (!Vendor) return; + + /* Check the Vendor ID */ + switch (Vendor) + { + /* Handle Intel case */ + case CPU_INTEL: + + /*Check if we support CPUID 2 */ + __cpuid(Data, 0); + if (Data[0] >= 2) + { + /* We need to loop for the number of times CPUID will tell us to */ + do + { + /* Do the CPUID call */ + __cpuid(Data, 2); + + /* Check if it was the first call */ + if (FirstPass) + { + /* + * The number of times to loop is the first byte. Read + * it and then destroy it so we don't get confused. + */ + CacheRequests = Data[0] & 0xFF; + Data[0] &= 0xFFFFFF00; + + /* Don't go over this again */ + FirstPass = FALSE; + } + + /* Loop all 4 registers */ + for (i = 0; i < 4; i++) + { + /* Get the current register */ + CurrentRegister = Data[i]; + + /* + * If the upper bit is set, then this register should + * be skipped. + */ + if (CurrentRegister & 0x80000000) continue; + + /* Keep looping for every byte inside this register */ + while (CurrentRegister) + { + /* Read a byte, skip a byte. */ + RegisterByte = (UCHAR)(CurrentRegister & 0xFF); + CurrentRegister >>= 8; + if (!RegisterByte) continue; + + /* + * Valid values are from 0x40 (0 bytes) to 0x49 + * (32MB), or from 0x80 to 0x89 (same size but + * 8-way associative. + */ + if (((RegisterByte > 0x40) && + (RegisterByte <= 0x49)) || + ((RegisterByte > 0x80) && + (RegisterByte <= 0x89))) + { + /* Mask out only the first nibble */ + RegisterByte &= 0x0F; + + /* Set the L2 Cache Size */ + Pcr->SecondLevelCacheSize = 0x10000 << + RegisterByte; + } + } + } + } while (--CacheRequests); + } + break; + + case CPU_AMD: + + /* Check if we support CPUID 0x80000006 */ + __cpuid(Data, 0x80000000); + if (Data[0] >= 6) + { + /* Get 2nd level cache and tlb size */ + __cpuid(Data, 0x80000006); + + /* Set the L2 Cache Size */ + Pcr->SecondLevelCacheSize = (Data[2] & 0xFFFF0000) >> 6; + } + break; + } +} + +VOID +FASTCALL +KiInitializeTss(IN PKTSS64 Tss, + IN UINT64 Stack) +{ + PKGDTENTRY64 TssEntry; + + /* Get pointer to the GDT entry */ + TssEntry = KiGetGdtEntry(KeGetPcr()->GdtBase, KGDT64_SYS_TSS); + + /* Initialize the GDT entry */ + KiInitGdtEntry(TssEntry, (ULONG64)Tss, sizeof(KTSS64), AMD64_TSS, 0); + + /* Zero out the TSS */ + RtlZeroMemory(Tss, sizeof(KTSS64)); + + /* FIXME: I/O Map? */ + Tss->IoMapBase = 0x68; + + /* Setup ring 0 stack pointer */ + Tss->Rsp0 = Stack; + + /* Setup a stack for Double Fault Traps */ + Tss->Ist[1] = (ULONG64)KiDoubleFaultStack; + + /* Setup a stack for CheckAbort Traps */ + Tss->Ist[2] = (ULONG64)KiDoubleFaultStack; + + /* Setup a stack for NMI Traps */ + Tss->Ist[3] = (ULONG64)KiDoubleFaultStack; + + /* Load the task register */ + __ltr(KGDT64_SYS_TSS); +} + +VOID +NTAPI +KeFlushCurrentTb(VOID) +{ + /* Flush the TLB by resetting CR3 */ + __writecr3(__readcr3()); +} + +VOID +NTAPI +KiRestoreProcessorControlState(PKPROCESSOR_STATE ProcessorState) +{ + /* Restore the CR registers */ + __writecr0(ProcessorState->SpecialRegisters.Cr0); +// __writecr2(ProcessorState->SpecialRegisters.Cr2); + __writecr3(ProcessorState->SpecialRegisters.Cr3); + __writecr4(ProcessorState->SpecialRegisters.Cr4); + __writecr8(ProcessorState->SpecialRegisters.Cr8); + + /* Restore the DR registers */ + __writedr(0, ProcessorState->SpecialRegisters.KernelDr0); + __writedr(1, ProcessorState->SpecialRegisters.KernelDr1); + __writedr(2, ProcessorState->SpecialRegisters.KernelDr2); + __writedr(3, ProcessorState->SpecialRegisters.KernelDr3); + __writedr(6, ProcessorState->SpecialRegisters.KernelDr6); + __writedr(7, ProcessorState->SpecialRegisters.KernelDr7); + + /* Restore GDT, IDT, LDT and TSS */ + __lgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit); +// __lldt(&ProcessorState->SpecialRegisters.Ldtr); +// __ltr(&ProcessorState->SpecialRegisters.Tr); + __lidt(&ProcessorState->SpecialRegisters.Idtr.Limit); + +// __ldmxcsr(&ProcessorState->SpecialRegisters.MxCsr); // FIXME +// ProcessorState->SpecialRegisters.DebugControl +// ProcessorState->SpecialRegisters.LastBranchToRip +// ProcessorState->SpecialRegisters.LastBranchFromRip +// ProcessorState->SpecialRegisters.LastExceptionToRip +// ProcessorState->SpecialRegisters.LastExceptionFromRip + + /* Restore MSRs */ + __writemsr(X86_MSR_GSBASE, ProcessorState->SpecialRegisters.MsrGsBase); + __writemsr(X86_MSR_KERNEL_GSBASE, ProcessorState->SpecialRegisters.MsrGsSwap); + __writemsr(X86_MSR_STAR, ProcessorState->SpecialRegisters.MsrStar); + __writemsr(X86_MSR_LSTAR, ProcessorState->SpecialRegisters.MsrLStar); + __writemsr(X86_MSR_CSTAR, ProcessorState->SpecialRegisters.MsrCStar); + __writemsr(X86_MSR_SFMASK, ProcessorState->SpecialRegisters.MsrSyscallMask); + +} + +VOID +NTAPI +KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState) +{ + /* Save the CR registers */ + ProcessorState->SpecialRegisters.Cr0 = __readcr0(); + ProcessorState->SpecialRegisters.Cr2 = __readcr2(); + ProcessorState->SpecialRegisters.Cr3 = __readcr3(); + ProcessorState->SpecialRegisters.Cr4 = __readcr4(); + ProcessorState->SpecialRegisters.Cr8 = __readcr8(); + + /* Save the DR registers */ + ProcessorState->SpecialRegisters.KernelDr0 = __readdr(0); + ProcessorState->SpecialRegisters.KernelDr1 = __readdr(1); + ProcessorState->SpecialRegisters.KernelDr2 = __readdr(2); + ProcessorState->SpecialRegisters.KernelDr3 = __readdr(3); + ProcessorState->SpecialRegisters.KernelDr6 = __readdr(6); + ProcessorState->SpecialRegisters.KernelDr7 = __readdr(7); + + /* Save GDT, IDT, LDT and TSS */ + __sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit); + __sldt(&ProcessorState->SpecialRegisters.Ldtr); + __str(&ProcessorState->SpecialRegisters.Tr); + __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit); + +// __stmxcsr(&ProcessorState->SpecialRegisters.MxCsr); +// ProcessorState->SpecialRegisters.DebugControl = +// ProcessorState->SpecialRegisters.LastBranchToRip = +// ProcessorState->SpecialRegisters.LastBranchFromRip = +// ProcessorState->SpecialRegisters.LastExceptionToRip = +// ProcessorState->SpecialRegisters.LastExceptionFromRip = + + /* Save MSRs */ + ProcessorState->SpecialRegisters.MsrGsBase = __readmsr(X86_MSR_GSBASE); + ProcessorState->SpecialRegisters.MsrGsSwap = __readmsr(X86_MSR_KERNEL_GSBASE); + ProcessorState->SpecialRegisters.MsrStar = __readmsr(X86_MSR_STAR); + ProcessorState->SpecialRegisters.MsrLStar = __readmsr(X86_MSR_LSTAR); + ProcessorState->SpecialRegisters.MsrCStar = __readmsr(X86_MSR_CSTAR); + ProcessorState->SpecialRegisters.MsrSyscallMask = __readmsr(X86_MSR_SFMASK); +} + +VOID +NTAPI +KeFlushEntireTb(IN BOOLEAN Invalid, + IN BOOLEAN AllProcessors) +{ + KIRQL OldIrql; + + // FIXME: halfplemented + /* Raise the IRQL for the TB Flush */ + OldIrql = KeRaiseIrqlToSynchLevel(); + + /* Flush the TB for the Current CPU, and update the flush stamp */ + KeFlushCurrentTb(); + + /* Update the flush stamp and return to original IRQL */ + InterlockedExchangeAdd(&KiTbFlushTimeStamp, 1); + KeLowerIrql(OldIrql); + +} + +KAFFINITY +NTAPI +KeQueryActiveProcessors(VOID) +{ + PAGED_CODE(); + + /* Simply return the number of active processors */ + return KeActiveProcessors; +} + +NTSTATUS +NTAPI +KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +KeRestoreFloatingPointState(IN PKFLOATING_SAVE Save) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +BOOLEAN +NTAPI +KeInvalidateAllCaches(VOID) +{ + /* Invalidate all caches */ + __wbinvd(); + return TRUE; +} + +/* + * @implemented + */ +ULONG +NTAPI +KeGetRecommendedSharedDataAlignment(VOID) +{ + /* Return the global variable */ + return KeLargestCacheLine; +} + +/* + * @implemented + */ +VOID +__cdecl +KeSaveStateForHibernate(IN PKPROCESSOR_STATE State) +{ + /* Capture the context */ + RtlCaptureContext(&State->ContextFrame); + + /* Capture the control state */ + KiSaveProcessorControlState(State); +} + +/* + * @implemented + */ +VOID +NTAPI +KeSetDmaIoCoherency(IN ULONG Coherency) +{ + /* Save the coherency globally */ + KiDmaIoCoherency = Coherency; +} diff --git a/reactos/ntoskrnl/ke/amd64/ctxswitch.S b/reactos/ntoskrnl/ke/amd64/ctxswitch.S new file mode 100644 index 00000000000..61ce1473e53 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/ctxswitch.S @@ -0,0 +1,199 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ke/amd64/ctxswitch.S + * PURPOSE: Thread Context Switching + * + * PROGRAMMER: Timo kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +/* FUNCTIONS ****************************************************************/ + +.code64 + +/*++ + * KiThreadStartup + * + * The KiThreadStartup routine is the beginning of any thread. + * + * Params: + * SystemRoutine - Pointer to the System Startup Routine. Either + * PspUserThreadStartup or PspSystemThreadStartup + * + * StartRoutine - For Kernel Threads only, specifies the starting execution + * point of the new thread. + * + * StartContext - For Kernel Threads only, specifies a pointer to variable + * context data to be sent to the StartRoutine above. + * + * UserThread - Indicates whether or not this is a user thread. This tells + * us if the thread has a context or not. + * + * TrapFrame - Pointer to the KTHREAD to which the caller wishes to + * switch from. + * + * Returns: + * Should never return for a system thread. Returns through the System Call + * Exit Dispatcher for a user thread. + * + * Remarks: + * If a return from a system thread is detected, a bug check will occur. + * + *--*/ +PUBLIC KiThreadStartup +KiThreadStartup: + + /* + * Clear all the non-volatile registers, so the thread won't be tempted to + * expect any static data (like some badly coded usermode/win9x apps do) + */ + xor rbx, rbx + xor rsi, rsi + xor rdi, rdi + xor rbp, rbp + xor r10, r10 + xor r11, r11 + xor r12, r12 + xor r13, r13 + xor r14, r14 + xor r15, r15 + + /* It's now safe to go to APC */ + mov rax, APC_LEVEL + mov cr8, rax + + /* + * Call the System Routine which is right on our stack now. + * After we pop the pointer, the Start Routine/Context is on the + * stack, we pop it as parameters to the System Routine into rcx + */ + pop rax + pop rcx + call rax + + /* The thread returned... was it a user-thread? */ + pop rcx + or rcx, rcx + jz BadThread + + /* Yes it was, set our trapframe for the System Call Exit Dispatcher */ + mov ebp, esp + + /* Exit back to user-mode */ +// jmp _KiServiceExit2 +UNIMPLEMENTED KiThreadStartup_KiServiceExit2 + +BadThread: + + /* A system thread returned...this is very bad! */ + int 3 + + +/*++ + * KiSwapContextInternal + * + * The KiSwapContextInternal routine switches context to another thread. + * + * Params: + * ESI - Pointer to the KTHREAD to which the caller wishes to + * switch to. + * EDI - Pointer to the KTHREAD to which the caller wishes to + * switch from. + * + * Returns: + * None. + * + * Remarks: + * Absolutely all registers except ESP can be trampled here for maximum code flexibility. + * + *--*/ +PUBLIC KiSwapContextInternal +KiSwapContextInternal: + UNIMPLEMENTED KiSwapContextInternal + ret + + +/** + * KiSwapContext + * + * \brief + * The KiSwapContext routine switches context to another thread. + * + * BOOLEAN + * KiSwapContext(PKTHREAD CurrentThread, PKTHREAD TargetThread); + * + * \param CurrentThread + * Pointer to the KTHREAD of the current thread. + * + * \param TargetThread + * Pointer to the KTHREAD to which the caller wishes to switch to. + * + * \returns + * The WaitStatus of the Target Thread. + * + * \remarks + * This is a wrapper around KiSwapContextInternal which will save all the + * non-volatile registers so that the Internal function can use all of + * them. It will also save the old current thread and set the new one. + * + * The calling thread does not return after KiSwapContextInternal until + * another thread switches to IT. + * + *--*/ +PUBLIC KiSwapContext +KiSwapContext: + + /* Save 10 registers */ + sub rsp, 10 * 8 + + /* Save all the non-volatile ones */ + mov [rsp+72], r15 + mov [rsp+64], r14 + mov [rsp+56], r13 + mov [rsp+48], r12 + mov [rsp+40], r11 + mov [rsp+32], r10 + + mov [rsp+24], rbx + mov [rsp+16], rsi + mov [rsp+8], rdi + mov [rsp+0], rbp + + /* Get the PCR */ + mov rbx, gs:[KPCR_SELF] + + /* Get the current thread */ + mov rdi, rcx + + /* Get the New Thread */ + mov rsi, rdx + + /* Get the wait IRQL */ + movzx ecx, byte ptr [edi+KTHREAD_WAIT_IRQL] + + /* Do the swap with the registers correctly setup */ + call KiSwapContextInternal + + /* Restore the registers */ + mov rbp, [rsp+0] + mov rdi, [rsp+8] + mov rsi, [rsp+16] + mov rbx, [rsp+24] + + mov r10, [rsp+32] + mov r11, [rsp+40] + mov r12, [rsp+48] + mov r13, [rsp+56] + mov r14, [rsp+64] + mov r15, [rsp+72] + + /* Clean stack */ + add esp, 10 * 8 + ret + +END diff --git a/reactos/ntoskrnl/ke/amd64/except.c b/reactos/ntoskrnl/ke/amd64/except.c new file mode 100644 index 00000000000..97845595b43 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/except.c @@ -0,0 +1,299 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/amd64/except.c + * PURPOSE: Exception Dispatching for amd64 + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + * Alex Ionescu (alex.ionescu@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +extern ULONG64 InterruptDispatchTable[256]; + +/* GLOBALS *******************************************************************/ + +KIDT_INIT KiInterruptInitTable[] = +{ + /* Id, Dpl, IST, ServiceRoutine */ + {0x00, 0x00, 0x00, KiDivideErrorFault}, + {0x01, 0x00, 0x00, KiDebugTrapOrFault}, + {0x02, 0x00, 0x03, KiNmiInterrupt}, + {0x03, 0x03, 0x00, KiBreakpointTrap}, + {0x04, 0x03, 0x00, KiOverflowTrap}, + {0x05, 0x00, 0x00, KiBoundFault}, + {0x06, 0x00, 0x00, KiInvalidOpcodeFault}, + {0x07, 0x00, 0x00, KiNpxNotAvailableFault}, + {0x08, 0x00, 0x01, KiDoubleFaultAbort}, + {0x09, 0x00, 0x00, KiNpxSegmentOverrunAbort}, + {0x0A, 0x00, 0x00, KiInvalidTssFault}, + {0x0B, 0x00, 0x00, KiSegmentNotPresentFault}, + {0x0C, 0x00, 0x00, KiStackFault}, + {0x0D, 0x00, 0x00, KiGeneralProtectionFault}, + {0x0E, 0x00, 0x00, KiPageFault}, + {0x10, 0x00, 0x00, KiFloatingErrorFault}, + {0x11, 0x00, 0x00, KiAlignmentFault}, + {0x12, 0x00, 0x02, KiMcheckAbort}, + {0x13, 0x00, 0x00, KiXmmException}, + {0x1F, 0x00, 0x00, KiApcInterrupt}, + {0x2C, 0x03, 0x00, KiRaiseAssertion}, + {0x2D, 0x03, 0x00, KiDebugServiceTrap}, + {0x2F, 0x00, 0x00, KiDpcInterrupt}, + {0xE1, 0x00, 0x00, KiIpiInterrupt}, + {0, 0, 0, 0} +}; + +KIDTENTRY64 KiIdt[256]; +KDESCRIPTOR KiIdtDescriptor = {{0}, sizeof(KiIdt) - 1, KiIdt}; + + +/* FUNCTIONS *****************************************************************/ + +VOID +INIT_FUNCTION +NTAPI +KeInitExceptions(VOID) +{ + int i, j; + + /* Initialize the Idt */ + for (j = i = 0; i < 256; i++) + { + ULONG64 Offset; + + if (KiInterruptInitTable[j].InterruptId == i) + { + Offset = (ULONG64)KiInterruptInitTable[j].ServiceRoutine; + KiIdt[i].Dpl = KiInterruptInitTable[j].Dpl; + KiIdt[i].IstIndex = KiInterruptInitTable[j].IstIndex; + j++; + } + else + { + Offset = (ULONG64)&InterruptDispatchTable[i]; + KiIdt[i].Dpl = 0; + KiIdt[i].IstIndex = 0; + } + KiIdt[i].OffsetLow = Offset & 0xffff; + KiIdt[i].Selector = KGDT64_R0_CODE; + KiIdt[i].Type = 0x0e; + KiIdt[i].Reserved0 = 0; + KiIdt[i].Present = 1; + KiIdt[i].OffsetMiddle = (Offset >> 16) & 0xffff; + KiIdt[i].OffsetHigh = (Offset >> 32); + KiIdt[i].Reserved1 = 0; + } + + KeGetPcr()->IdtBase = KiIdt; + __lidt(&KiIdtDescriptor.Limit); +} + +VOID +NTAPI +KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, + IN PKEXCEPTION_FRAME ExceptionFrame, + IN PKTRAP_FRAME TrapFrame, + IN KPROCESSOR_MODE PreviousMode, + IN BOOLEAN FirstChance) +{ + CONTEXT Context; + +// FrLdrDbgPrint("KiDispatchException(%p, %p, %p, %d, %d)\n", +// ExceptionRecord, ExceptionFrame, TrapFrame, PreviousMode, FirstChance); + + /* Increase number of Exception Dispatches */ + KeGetCurrentPrcb()->KeExceptionDispatchCount++; + + /* Set the context flags */ + Context.ContextFlags = CONTEXT_ALL; + + /* Get a Context */ + KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Context); + + /* Look at our exception code */ + switch (ExceptionRecord->ExceptionCode) + { + /* Breakpoint */ + case STATUS_BREAKPOINT: + + /* Decrement RIP by one */ + Context.Rip--; + break; + + /* Internal exception */ + case KI_EXCEPTION_ACCESS_VIOLATION: + + /* Set correct code */ + ExceptionRecord->ExceptionCode = STATUS_ACCESS_VIOLATION; + if (PreviousMode == UserMode) + { + /* FIXME: Handle no execute */ + } + break; + } + + /* Handle kernel-mode first, it's simpler */ + if (PreviousMode == KernelMode) + { + /* Check if this is a first-chance exception */ + if (FirstChance == TRUE) + { + /* Break into the debugger for the first time */ + if (KiDebugRoutine(TrapFrame, + ExceptionFrame, + ExceptionRecord, + &Context, + PreviousMode, + FALSE)) + { + /* Exception was handled */ + goto Handled; + } + + /* 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 */ + if (KiDebugRoutine(TrapFrame, + ExceptionFrame, + ExceptionRecord, + &Context, + PreviousMode, + TRUE)) + { + /* Exception was handled */ + goto Handled; + } + + /* Third strike; you're out */ + KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, + ExceptionRecord->ExceptionCode, + (ULONG_PTR)ExceptionRecord->ExceptionAddress, + (ULONG_PTR)TrapFrame, + 0); + } + else + { + /* FIXME: user-mode exception handling unimplemented */ + ASSERT(FALSE); + } + +Handled: + /* Convert the context back into Trap/Exception Frames */ + KeContextToTrapFrame(&Context, + ExceptionFrame, + TrapFrame, + Context.ContextFlags, + PreviousMode); + return; +} + +NTSTATUS +NTAPI +KeRaiseUserException(IN NTSTATUS ExceptionCode) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + + +VOID +DECLSPEC_NORETURN +KiSystemFatalException(IN ULONG ExceptionCode, + IN PKTRAP_FRAME TrapFrame) +{ + /* Bugcheck the system */ + KeBugCheckWithTf(UNEXPECTED_KERNEL_MODE_TRAP, + ExceptionCode, + 0, + 0, + 0, + TrapFrame); +} + +NTSTATUS +NTAPI +KiNpxNotAvailableFaultHandler( + IN PKTRAP_FRAME TrapFrame) +{ + UNIMPLEMENTED; + KeBugCheckWithTf(TRAP_CAUSE_UNKNOWN, 13, 0, 0, 1, TrapFrame); + return -1; +} + + +NTSTATUS +NTAPI +KiGeneralProtectionFaultHandler( + IN PKTRAP_FRAME TrapFrame) +{ + PUCHAR Instructions; + + /* Check for user-mode GPF */ + if (TrapFrame->SegCs & 3) + { + UNIMPLEMENTED; + ASSERT(FALSE); + } + + /* Check for lazy segment load */ + if (TrapFrame->SegDs != (KGDT64_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegDs = (KGDT64_R3_DATA | RPL_MASK); + return STATUS_SUCCESS; + } + else if (TrapFrame->SegEs != (KGDT64_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegEs = (KGDT64_R3_DATA | RPL_MASK); + return STATUS_SUCCESS; + } + + /* Check for nested exception */ + if ((TrapFrame->Rip >= (ULONG64)KiGeneralProtectionFaultHandler) && + (TrapFrame->Rip < (ULONG64)KiGeneralProtectionFaultHandler)) + { + /* Not implemented */ + UNIMPLEMENTED; + ASSERT(FALSE); + } + + /* Get Instruction Pointer */ + Instructions = (PUCHAR)TrapFrame->Rip; + + /* Check for IRET */ + if (Instructions[0] == 0x48 && Instructions[1] == 0xCF) + { + /* Not implemented */ + UNIMPLEMENTED; + ASSERT(FALSE); + } + + /* Check for RDMSR/WRMSR */ + if ((Instructions[0] == 0xF) && // 2-byte opcode + (((Instructions[1] >> 8) == 0x30) || // RDMSR + ((Instructions[2] >> 8) == 0x32))) // WRMSR + { + /* Unknown CPU MSR, so raise an access violation */ + return STATUS_ACCESS_VIOLATION; + } + + ASSERT(FALSE); + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +KiXmmExceptionHandler( + IN PKTRAP_FRAME TrapFrame) +{ + UNIMPLEMENTED; + KeBugCheckWithTf(TRAP_CAUSE_UNKNOWN, 13, 0, 0, 1, TrapFrame); + return -1; +} diff --git a/reactos/ntoskrnl/ke/amd64/interrupt.c b/reactos/ntoskrnl/ke/amd64/interrupt.c new file mode 100644 index 00000000000..171ebda7716 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/interrupt.c @@ -0,0 +1,62 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/i386/irq.c + * PURPOSE: Manages the Kernel's IRQ support for external drivers, + * for the purpopses of connecting, disconnecting and setting + * up ISRs for drivers. The backend behind the Io* Interrupt + * routines. + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@web.de) + */ + +/* INCLUDES *****************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ****************************************************************/ + + + +BOOLEAN +NTAPI +KeDisableInterrupts(VOID) +{ + ULONG64 Flags; + + /* Get the flags */ + Flags = __readeflags(); + + /* Disable interrupts */ + _disable(); + + return !!(Flags & EFLAGS_INTERRUPT_MASK); +} + + +BOOLEAN +NTAPI +KeDisconnectInterrupt(IN PKINTERRUPT Interrupt) +{ + UNIMPLEMENTED; + return FALSE; +} + +VOID +NTAPI +KeInitializeInterrupt(IN PKINTERRUPT Interrupt, + IN PKSERVICE_ROUTINE ServiceRoutine, + IN PVOID ServiceContext, + IN PKSPIN_LOCK SpinLock, + IN ULONG Vector, + IN KIRQL Irql, + IN KIRQL SynchronizeIrql, + IN KINTERRUPT_MODE InterruptMode, + IN BOOLEAN ShareVector, + IN CHAR ProcessorNumber, + IN BOOLEAN FloatingSave) +{ + UNIMPLEMENTED; +} + diff --git a/reactos/ntoskrnl/ke/amd64/irql.c b/reactos/ntoskrnl/ke/amd64/irql.c new file mode 100644 index 00000000000..53dcd3890b6 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/irql.c @@ -0,0 +1,45 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Routines for IRQL support + * PROGRAMMERS: Timo Kreuzer + */ + +/* INCLUDES *****************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ****************************************************************/ + +NTKERNELAPI +KIRQL +KxGetCurrentIrql(VOID) +{ + return KeGetCurrentIrql(); +} + +NTKERNELAPI +VOID +KxLowerIrql(IN KIRQL NewIrql) +{ + KeLowerIrql(NewIrql); +} + +NTKERNELAPI +KIRQL +KxRaiseIrql(IN KIRQL NewIrql) +{ + return KfRaiseIrql(NewIrql); +} + +NTKERNELAPI +KIRQL +KxRaiseIrqlToDpcLevel(VOID) +{ + return KeRaiseIrqlToDpcLevel(); +} + + +/* EOF */ diff --git a/reactos/ntoskrnl/ke/amd64/kiinit.c b/reactos/ntoskrnl/ke/amd64/kiinit.c new file mode 100644 index 00000000000..d2704638f50 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/kiinit.c @@ -0,0 +1,502 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/i386/kiinit.c + * PURPOSE: Kernel Initialization for x86 CPUs + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES *****************************************************************/ + +#include +#define NDEBUG +#include + +#define REQUIRED_FEATURE_BITS (KF_RDTSC|KF_CR4|KF_CMPXCHG8B|KF_XMMI|KF_XMMI64| \ + KF_NX_BIT) + +/* GLOBALS *******************************************************************/ + +/* Function pointer for early debug prints */ +ULONG (*FrLdrDbgPrint)(const char *Format, ...); + +/* Spinlocks used only on X86 */ +KSPIN_LOCK KiFreezeExecutionLock; + +/* BIOS Memory Map. Not NTLDR-compliant yet */ +extern ULONG KeMemoryMapRangeCount; +extern ADDRESS_RANGE KeMemoryMap[64]; + +KIPCR KiInitialPcr; + +/* Boot and double-fault/NMI/DPC stack */ +UCHAR DECLSPEC_ALIGN(16) P0BootStackData[KERNEL_STACK_SIZE] = {0}; +UCHAR DECLSPEC_ALIGN(16) KiDoubleFaultStackData[KERNEL_STACK_SIZE] = {0}; +ULONG_PTR P0BootStack = (ULONG_PTR)&P0BootStackData[KERNEL_STACK_SIZE]; +ULONG_PTR KiDoubleFaultStack = (ULONG_PTR)&KiDoubleFaultStackData[KERNEL_STACK_SIZE]; + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +KiInitMachineDependent(VOID) +{ + /* Check for large page support */ + if (KeFeatureBits & KF_LARGE_PAGE) + { + /* FIXME: Support this */ + DPRINT1("Large Page support detected but not yet taken advantage of!\n"); + } + + /* Check for global page support */ + if (KeFeatureBits & KF_GLOBAL_PAGE) + { + /* FIXME: Support this */ + DPRINT1("Global Page support detected but not yet taken advantage of!\n"); + } + + /* Check if we have MTRR */ + if (KeFeatureBits & KF_MTRR) + { + /* FIXME: Support this */ + DPRINT1("MTRR support detected but not yet taken advantage of!\n"); + } + + /* Check for PAT and/or MTRR support */ + if (KeFeatureBits & KF_PAT) + { + /* FIXME: Support this */ + DPRINT1("PAT support detected but not yet taken advantage of!\n"); + } + + +} + +VOID +NTAPI +KiInitializePcr(IN PKIPCR Pcr, + IN ULONG ProcessorNumber, + IN PKTHREAD IdleThread, + IN PVOID DpcStack) +{ + KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0}; + PKGDTENTRY64 TssEntry; + USHORT Tr = 0; + + /* Zero out the PCR */ + RtlZeroMemory(Pcr, PAGE_SIZE); + + /* Set pointers to ourselves */ + Pcr->Self = (PKPCR)Pcr; + Pcr->CurrentPrcb = &Pcr->Prcb; + + /* Set the PCR Version */ + Pcr->MajorVersion = PCR_MAJOR_VERSION; + Pcr->MinorVersion = PCR_MINOR_VERSION; + + /* Set the PRCB Version */ + Pcr->Prcb.MajorVersion = 1; + Pcr->Prcb.MinorVersion = 1; + + /* Set the Build Type */ + Pcr->Prcb.BuildType = 0; +#ifndef CONFIG_SMP + Pcr->Prcb.BuildType |= PRCB_BUILD_UNIPROCESSOR; +#endif +#ifdef DBG + Pcr->Prcb.BuildType |= PRCB_BUILD_DEBUG; +#endif + + /* Set the Processor Number and current Processor Mask */ + Pcr->Prcb.Number = (UCHAR)ProcessorNumber; + Pcr->Prcb.SetMember = 1 << ProcessorNumber; + + /* Get GDT and IDT descriptors */ + __sgdt(&GdtDescriptor.Limit); + __sidt(&IdtDescriptor.Limit); + Pcr->GdtBase = (PVOID)GdtDescriptor.Base; + Pcr->IdtBase = (PKIDTENTRY)IdtDescriptor.Base; + + /* Get TSS Selector */ + __str(&Tr); + ASSERT(Tr == KGDT64_SYS_TSS); + + /* Get TSS Entry */ + TssEntry = KiGetGdtEntry(Pcr->GdtBase, Tr); + + /* Get the KTSS itself */ + Pcr->TssBase = KiGetGdtDescriptorBase(TssEntry); + + Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; // FIXME + + /* Set DPC Stack */ + Pcr->Prcb.DpcStack = DpcStack; + + /* Setup the processor set */ + Pcr->Prcb.MultiThreadProcessorSet = Pcr->Prcb.SetMember; + + /* Clear DR6/7 to cleanup bootloader debugging */ + Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0; + Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr7 = 0; + + /* Set the Current Thread */ + Pcr->Prcb.CurrentThread = IdleThread; + + /* Start us out at PASSIVE_LEVEL */ + Pcr->Irql = PASSIVE_LEVEL; + KeSetCurrentIrql(PASSIVE_LEVEL); + +} + +VOID +NTAPI +KiInitializeCpuFeatures(ULONG Cpu) +{ + ULONG FeatureBits; + + /* Get the processor features for this CPU */ + FeatureBits = KiGetFeatureBits(); + + /* Check if we support all needed features */ + if ((FeatureBits & REQUIRED_FEATURE_BITS) != REQUIRED_FEATURE_BITS) + { + /* If not, bugcheck system */ + FrLdrDbgPrint("CPU doesn't have needed features! Has: 0x%x, required: 0x%x\n", + FeatureBits, REQUIRED_FEATURE_BITS); + KeBugCheck(0); + } + + /* Set DEP to always on */ + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSON; + FeatureBits |= KF_NX_ENABLED; + + /* Save feature bits */ + KeGetCurrentPrcb()->FeatureBits = FeatureBits; + + /* Enable fx save restore support */ + __writecr4(__readcr4() | CR4_FXSR); + + /* Enable XMMI exceptions */ + __writecr4(__readcr4() | CR4_XMMEXCPT); + + /* Enable Write-Protection */ + __writecr0(__readcr0() | CR0_WP); + + /* Disable fpu monitoring */ + __writecr0(__readcr0() & ~CR0_MP); + + /* Disable x87 fpu exceptions */ + __writecr0(__readcr0() & ~CR0_NE); + +} + +VOID +NTAPI +KiInitializeKernel(IN PKPROCESS InitProcess, + IN PKTHREAD InitThread, + IN PVOID IdleStack, + IN PKPRCB Prcb, + IN CCHAR Number, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG PageDirectory[2]; + PVOID DpcStack; + + /* Detect and set the CPU Type */ + KiSetProcessorType(); + + /* Initialize the Power Management Support for this PRCB */ +// PoInitializePrcb(Prcb); + + /* Save CPU state */ + KiSaveProcessorControlState(&Prcb->ProcessorState); + + /* Get cache line information for this CPU */ + KiGetCacheInformation(); + + /* Initialize spinlocks and DPC data */ + KiInitSpinLocks(Prcb, Number); + + /* Check if this is the Boot CPU */ + if (Number == 0) + { + /* Set Node Data */ + KeNodeBlock[0] = &KiNode0; + Prcb->ParentNode = KeNodeBlock[0]; + KeNodeBlock[0]->ProcessorMask = Prcb->SetMember; + + /* Set boot-level flags */ + KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64; + KeProcessorLevel = (USHORT)Prcb->CpuType; + if (Prcb->CpuID) KeProcessorRevision = Prcb->CpuStep; + + /* Set the current MP Master KPRCB to the Boot PRCB */ + Prcb->MultiThreadSetMaster = Prcb; + + /* Lower to APC_LEVEL */ + KeLowerIrql(APC_LEVEL); + + /* Initialize some spinlocks */ + KeInitializeSpinLock(&KiFreezeExecutionLock); + + /* Initialize portable parts of the OS */ + KiInitSystem(); + + /* Initialize the Idle Process and the Process Listhead */ + InitializeListHead(&KiProcessListHead); + PageDirectory[0] = 0; + PageDirectory[1] = 0; + KeInitializeProcess(InitProcess, + 0, + 0xFFFFFFFF, + PageDirectory, + FALSE); + InitProcess->QuantumReset = MAXCHAR; + } + else + { + /* FIXME */ + DPRINT1("SMP Boot support not yet present\n"); + } + + /* HACK for MmUpdatePageDir */ + ((PETHREAD)InitThread)->ThreadsProcess = (PEPROCESS)InitProcess; + + /* Setup the Idle Thread */ + KeInitializeThread(InitProcess, + InitThread, + NULL, + NULL, + NULL, + NULL, + NULL, + IdleStack); + + InitThread->NextProcessor = Number; + InitThread->Priority = HIGH_PRIORITY; + InitThread->State = Running; + InitThread->Affinity = 1 << Number; + InitThread->WaitIrql = DISPATCH_LEVEL; + InitProcess->ActiveProcessors = 1 << Number; + + /* Set basic CPU Features that user mode can read */ + SharedUserData->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = + (KeFeatureBits & KF_MMX) ? TRUE: FALSE; + SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = + (KeFeatureBits & KF_CMPXCHG8B) ? TRUE: FALSE; + SharedUserData->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] = + ((KeFeatureBits & KF_FXSR) && (KeFeatureBits & KF_XMMI)) ? TRUE: FALSE; + SharedUserData->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] = + ((KeFeatureBits & KF_FXSR) && (KeFeatureBits & KF_XMMI64)) ? TRUE: FALSE; + SharedUserData->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = + (KeFeatureBits & KF_3DNOW) ? TRUE: FALSE; + SharedUserData->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = + (KeFeatureBits & KF_RDTSC) ? TRUE: FALSE; + + /* 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 */ + if (Number == 0) + { + /* Calculate the time reciprocal */ + KiTimeIncrementReciprocal = + KiComputeReciprocal(KeMaximumIncrement, + &KiTimeIncrementShiftCount); + + /* Update DPC Values in case they got updated by the executive */ + Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth; + Prcb->MinimumDpcRate = KiMinimumDpcRate; + Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold; + + /* Allocate the DPC Stack */ + DpcStack = MmCreateKernelStack(FALSE, 0); + if (!DpcStack) KeBugCheckEx(NO_PAGES_AVAILABLE, 1, 0, 0, 0); + Prcb->DpcStack = DpcStack; + + /* Allocate the IOPM save area. */ +// Ki386IopmSaveArea = ExAllocatePoolWithTag(PagedPool, +// PAGE_SIZE * 2, +// TAG('K', 'e', ' ', ' ')); +// if (!Ki386IopmSaveArea) +// { +// /* Bugcheck. We need this for V86/VDM support. */ +// KeBugCheckEx(NO_PAGES_AVAILABLE, 2, PAGE_SIZE * 2, 0, 0); +// } + } + + /* Raise to Dispatch */ + KfRaiseIrql(DISPATCH_LEVEL); + + /* 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 */ + KiAcquirePrcbLock(Prcb); + if (!Prcb->NextThread) KiIdleSummary |= 1 << Number; + KiReleasePrcbLock(Prcb); + + /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */ + KfRaiseIrql(HIGH_LEVEL); + LoaderBlock->Prcb = 0; +} + +VOID +NTAPI +KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG Cpu; + PKTHREAD InitialThread; + ULONG64 InitialStack; + PKIPCR Pcr; + + /* HACK */ + FrLdrDbgPrint = LoaderBlock->u.I386.CommonDataArea; + FrLdrDbgPrint("Hello from KiSystemStartup!!!\n"); + + /* HACK, because freeldr maps page 0 */ + MiAddressToPte((PVOID)0)->u.Hard.Valid = 0; + + /* Save the loader block */ + KeLoaderBlock = LoaderBlock; + + /* Get the current CPU number */ + Cpu = KeNumberProcessors++; // FIXME + + /* LoaderBlock initialization for Cpu 0 */ + if (Cpu == 0) + { + /* Set the initial stack, idle thread and process */ + LoaderBlock->KernelStack = (ULONG_PTR)P0BootStack; + LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread; + LoaderBlock->Process = (ULONG_PTR)&KiInitialProcess.Pcb; + LoaderBlock->Prcb = (ULONG_PTR)&KiInitialPcr.Prcb; + } + + /* Get Pcr from loader block */ + Pcr = CONTAINING_RECORD(LoaderBlock->Prcb, KIPCR, Prcb); + + /* Set the PRCB for this Processor */ + KiProcessorBlock[Cpu] = &Pcr->Prcb; + + /* Set GS base */ + __writemsr(X86_MSR_GSBASE, (ULONG64)Pcr); + __writemsr(X86_MSR_KERNEL_GSBASE, (ULONG64)Pcr); + + /* LDT is unused */ + __lldt(0); + + /* Align stack to 16 bytes */ + LoaderBlock->KernelStack &= ~(16 - 1); + + /* Save the initial thread and stack */ + InitialStack = LoaderBlock->KernelStack; // Checkme + InitialThread = (PKTHREAD)LoaderBlock->Thread; + + /* Clean the APC List Head */ + InitializeListHead(&InitialThread->ApcState.ApcListHead[KernelMode]); + + /* Set us as the current process */ + InitialThread->ApcState.Process = (PVOID)LoaderBlock->Process; + + /* Initialize the PCR */ + KiInitializePcr(Pcr, Cpu, InitialThread, (PVOID)KiDoubleFaultStack); + + /* Initialize the CPU features */ + KiInitializeCpuFeatures(Cpu); + + /* Initial setup for the boot CPU */ + if (Cpu == 0) + { + /* Setup the TSS descriptors and entries */ + KiInitializeTss(Pcr->TssBase, InitialStack); + + /* Setup the IDT */ + KeInitExceptions(); + + /* HACK: misuse this function to pass a function pointer to kdcom */ + KdDebuggerInitialize1((PVOID)FrLdrDbgPrint); + + /* Initialize debugging system */ + KdInitSystem(0, KeLoaderBlock); + + /* Check for break-in */ + if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); + + /* Hack! Wait for the debugger! */ +#ifdef _WINKD_ + while (!KdPollBreakIn()); + DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); +#endif + } + + DPRINT("Pcr = %p, Gdt = %p, Idt = %p, Tss = %p\n", + Pcr, Pcr->GdtBase, Pcr->IdtBase, Pcr->TssBase); + + /* Acquire lock */ + while (InterlockedBitTestAndSet64((PLONG64)&KiFreezeExecutionLock, 0)) + { + /* Loop until lock is free */ + while ((*(volatile KSPIN_LOCK*)&KiFreezeExecutionLock) & 1); + } + + /* Initialize the Processor with HAL */ + HalInitializeProcessor(Cpu, KeLoaderBlock); + + /* Set processor as active */ + KeActiveProcessors |= 1 << Cpu; + + /* Release lock */ + InterlockedAnd64((PLONG64)&KiFreezeExecutionLock, 0); + + /* Raise to HIGH_LEVEL */ + KfRaiseIrql(HIGH_LEVEL); + + /* Switch to new kernel stack and start kernel bootstrapping */ + KiSetupStackAndInitializeKernel(&KiInitialProcess.Pcb, + InitialThread, + (PVOID)InitialStack, + &Pcr->Prcb, + (CCHAR)Cpu, + KeLoaderBlock); +} + + +VOID +NTAPI +KiInitializeKernelAndGotoIdleLoop(IN PKPROCESS InitProcess, + IN PKTHREAD InitThread, + IN PVOID IdleStack, + IN PKPRCB Prcb, + IN CCHAR Number, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ +// DbgBreakPointWithStatus(0); + + /* Initialize kernel */ + KiInitializeKernel(InitProcess, + InitThread, + IdleStack, + Prcb, + Number, + KeLoaderBlock); + + /* Set the priority of this thread to 0 */ + InitThread->Priority = 0; + + /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */ + _enable(); + KeLowerIrql(DISPATCH_LEVEL); + + /* Set the right wait IRQL */ + InitThread->WaitIrql = DISPATCH_LEVEL; + + /* Jump into the idle loop */ + KiIdleLoop(); +} diff --git a/reactos/ntoskrnl/ke/amd64/spinlock.c b/reactos/ntoskrnl/ke/amd64/spinlock.c new file mode 100644 index 00000000000..9c485fd8d43 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/spinlock.c @@ -0,0 +1,196 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: GPL - See COPYING in the top level directory + * FILE: hal/halx86/up/spinlock.c + * PURPOSE: Spinlock and Queued Spinlock Support + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +#undef KeAcquireSpinLock +#undef KeReleaseSpinLock + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +KIRQL +KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) +{ +#ifndef CONFIG_SMP + KIRQL OldIrql; + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + return OldIrql; +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeAcquireSpinLockRaiseToDpc(PKSPIN_LOCK SpinLock) +{ +#ifndef CONFIG_SMP + KIRQL OldIrql; + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + return OldIrql; +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +VOID +NTAPI +KeReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL OldIrql) +{ +#ifndef CONFIG_SMP + /* Simply lower IRQL back */ + KeLowerIrql(OldIrql); +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +KIRQL +KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) +{ +#ifndef CONFIG_SMP + KIRQL OldIrql; + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + return OldIrql; +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +KIRQL +KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) +{ +#ifndef CONFIG_SMP + KIRQL OldIrql; + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + return OldIrql; +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +VOID +KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ +#ifndef CONFIG_SMP + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, &LockHandle->OldIrql); +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +VOID +KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ +#ifndef CONFIG_SMP + /* Simply raise to synch */ + KeRaiseIrql(SYNCH_LEVEL, &LockHandle->OldIrql); +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +VOID +KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + IN KIRQL OldIrql) +{ +#ifndef CONFIG_SMP + /* Simply lower IRQL back */ + KeLowerIrql(OldIrql); +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +VOID +KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) +{ +#ifndef CONFIG_SMP + /* Simply lower IRQL back */ + KeLowerIrql(LockHandle->OldIrql); +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +BOOLEAN +KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + IN PKIRQL OldIrql) +{ +#ifndef CONFIG_SMP + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, OldIrql); + + /* Always return true on UP Machines */ + return TRUE; +#else + UNIMPLEMENTED; +#endif +} + +/* + * @implemented + */ +LOGICAL +KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + OUT PKIRQL OldIrql) +{ +#ifndef CONFIG_SMP + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, OldIrql); + + /* Always return true on UP Machines */ + return TRUE; +#else + UNIMPLEMENTED; +#endif +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ke/amd64/stubs.c b/reactos/ntoskrnl/ke/amd64/stubs.c new file mode 100644 index 00000000000..bfc4545e8fa --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/stubs.c @@ -0,0 +1,188 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: stubs + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include + +#define NDEBUG +#include + +VOID +FASTCALL +KeZeroPages(IN PVOID Address, + IN ULONG Size) +{ + /* Not using XMMI in this routine */ + RtlZeroMemory(Address, Size); +} + +VOID +FASTCALL +DECLSPEC_NORETURN +KiServiceExit(IN PKTRAP_FRAME TrapFrame, + IN NTSTATUS Status) +{ + UNIMPLEMENTED; +} + +VOID +FASTCALL +DECLSPEC_NORETURN +KiServiceExit2(IN PKTRAP_FRAME TrapFrame) +{ + UNIMPLEMENTED; +} + +BOOLEAN +NTAPI +KeConnectInterrupt(IN PKINTERRUPT Interrupt) +{ + UNIMPLEMENTED; + return FALSE; +} + +PVOID +NTAPI +KeSwitchKernelStack(PVOID StackBase, PVOID StackLimit) +{ + UNIMPLEMENTED; + return NULL; +} + +BOOLEAN +NTAPI +KeSynchronizeExecution( + IN OUT PKINTERRUPT Interrupt, + IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, + IN PVOID SynchronizeContext) +{ + UNIMPLEMENTED; + return FALSE; +} + +NTSTATUS +NTAPI +KeUserModeCallback(IN ULONG RoutineIndex, + IN PVOID Argument, + IN ULONG ArgumentLength, + OUT PVOID *Result, + OUT PULONG ResultLength) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +VOID +KiIdleLoop() +{ + UNIMPLEMENTED; + for(;;); +} + +VOID +NTAPI +KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame, + IN PKTRAP_FRAME TrapFrame, + IN PKNORMAL_ROUTINE NormalRoutine, + IN PVOID NormalContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2) +{ + UNIMPLEMENTED; +} + +VOID +NTAPI +KiSwapProcess(IN PKPROCESS NewProcess, + IN PKPROCESS OldProcess) +{ + UNIMPLEMENTED; +} + +VOID +KiSystemService(IN PKTHREAD Thread, + IN PKTRAP_FRAME TrapFrame, + IN ULONG Instruction) +{ + UNIMPLEMENTED; +} + +NTSYSAPI +NTSTATUS +NTAPI +NtCallbackReturn +( IN PVOID Result OPTIONAL, IN ULONG ResultLength, IN NTSTATUS Status ) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +NtSetLdtEntries +(ULONG Selector1, LDT_ENTRY LdtEntry1, ULONG Selector2, LDT_ENTRY LdtEntry2) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +NtVdmControl(IN ULONG ControlCode, + IN PVOID ControlData) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +KiCallUserMode( + IN PVOID *OutputBuffer, + IN PULONG OutputLength) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +#undef ExQueryDepthSList +NTKERNELAPI +USHORT +ExQueryDepthSList(IN PSLIST_HEADER ListHead) +{ + return (USHORT)(ListHead->Alignment & 0xffff); +} + + +ULONG ProcessCount; + +#ifdef _MSC_VER +void +__GSHandlerCheck() +{ +} + +int __security_cookie; + +void +__security_check_cookie() +{ +} + +BOOLEAN CcPfEnablePrefetcher; + +unsigned long __readfsdword(const unsigned long Offset) +{ + return 0; +} + +void main() +{ +} + +#endif diff --git a/reactos/ntoskrnl/ke/amd64/thrdini.c b/reactos/ntoskrnl/ke/amd64/thrdini.c new file mode 100644 index 00000000000..616cd303264 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/thrdini.c @@ -0,0 +1,193 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/ke/i386/thread.c + * PURPOSE: i386 Thread Context Creation + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +typedef struct _KSWITCHFRAME +{ + PVOID ExceptionList; + BOOLEAN ApcBypassDisable; + PVOID RetAddr; +} KSWITCHFRAME, *PKSWITCHFRAME; + +typedef struct _KSTART_FRAME +{ + PKSYSTEM_ROUTINE SystemRoutine; + PKSTART_ROUTINE StartRoutine; + PVOID StartContext; + BOOLEAN UserThread; +} KSTART_FRAME, *PKSTART_FRAME; + +typedef struct _KUINIT_FRAME +{ + KSWITCHFRAME CtxSwitchFrame; + KSTART_FRAME StartFrame; + KTRAP_FRAME TrapFrame; + //FX_SAVE_AREA FxSaveArea; +} KUINIT_FRAME, *PKUINIT_FRAME; + +typedef struct _KKINIT_FRAME +{ + KSWITCHFRAME CtxSwitchFrame; + KSTART_FRAME StartFrame; + //FX_SAVE_AREA FxSaveArea; +} KKINIT_FRAME, *PKKINIT_FRAME; + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +KiInitializeContextThread(IN PKTHREAD Thread, + IN PKSYSTEM_ROUTINE SystemRoutine, + IN PKSTART_ROUTINE StartRoutine, + IN PVOID StartContext, + IN PCONTEXT ContextPointer) +{ + //PFX_SAVE_AREA FxSaveArea; + //PFXSAVE_FORMAT FxSaveFormat; + PKSTART_FRAME StartFrame; + PKSWITCHFRAME CtxSwitchFrame; + PKTRAP_FRAME TrapFrame; + CONTEXT LocalContext; + PCONTEXT Context = NULL; + ULONG ContextFlags; + + /* Check if this is a With-Context Thread */ + if (ContextPointer) + { + /* Set up the Initial Frame */ + PKUINIT_FRAME InitFrame; + InitFrame = (PKUINIT_FRAME)((ULONG_PTR)Thread->InitialStack - + sizeof(KUINIT_FRAME)); + + /* Copy over the context we got */ + RtlCopyMemory(&LocalContext, ContextPointer, sizeof(CONTEXT)); + Context = &LocalContext; + ContextFlags = CONTEXT_CONTROL; + + /* Zero out the trap frame and save area */ + RtlZeroMemory(&InitFrame->TrapFrame, + KTRAP_FRAME_LENGTH); + + /* Setup the Fx Area */ + //FxSaveArea = &InitFrame->FxSaveArea; + +// /* Get the FX Save Format Area */ +// FxSaveFormat = (PFXSAVE_FORMAT)Context->ExtendedRegisters; +// +// /* Set an initial state */ +// FxSaveFormat->ControlWord = 0x27F; +// FxSaveFormat->StatusWord = 0; +// FxSaveFormat->TagWord = 0; +// FxSaveFormat->ErrorOffset = 0; +// FxSaveFormat->ErrorSelector = 0; +// FxSaveFormat->DataOffset = 0; +// FxSaveFormat->DataSelector = 0; +// FxSaveFormat->MXCsr = 0x1F80; + + /* Set an intial NPX State */ + //Context->FloatSave.Cr0NpxState = 0; + //FxSaveArea->Cr0NpxState = 0; + //FxSaveArea->NpxSavedCpu = 0; + + /* Now set the context flags depending on XMM support */ + //ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS : + // CONTEXT_FLOATING_POINT; + + /* Set the Thread's NPX State */ + Thread->NpxState = 0xA; + Thread->DispatcherHeader.NpxIrql = PASSIVE_LEVEL; + + /* Disable any debug regiseters */ + Context->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS; + + /* Setup the Trap Frame */ + TrapFrame = &InitFrame->TrapFrame; + + /* Set up a trap frame from the context. */ + KeContextToTrapFrame(Context, + NULL, + TrapFrame, + Context->ContextFlags | ContextFlags, + UserMode); + + /* Set SS, DS, ES's RPL Mask properly */ + TrapFrame->SegSs |= RPL_MASK; + TrapFrame->SegDs |= RPL_MASK; + TrapFrame->SegEs |= RPL_MASK; + TrapFrame->Dr7 = 0; + + /* Set the previous mode as user */ + TrapFrame->PreviousMode = UserMode; + + /* Terminate the Exception Handler List */ + TrapFrame->ExceptionFrame = 0; + + /* Setup the Stack for KiThreadStartup and Context Switching */ + StartFrame = &InitFrame->StartFrame; + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + + /* Tell the thread it will run in User Mode */ + Thread->PreviousMode = UserMode; + + /* Tell KiThreadStartup of that too */ + StartFrame->UserThread = TRUE; + } + else + { + /* Set up the Initial Frame for the system thread */ + PKKINIT_FRAME InitFrame; + InitFrame = (PKKINIT_FRAME)((ULONG_PTR)Thread->InitialStack - + sizeof(KKINIT_FRAME)); + + /* Setup the Fx Area */ + //FxSaveArea = &InitFrame->FxSaveArea; + //RtlZeroMemory(FxSaveArea, sizeof(FX_SAVE_AREA)); + + /* Check if we have Fxsr support */ + DPRINT1("FxsrPresent but did nothing\n"); +// /* Set the stub FX area */ +// FxSaveArea->U.FxArea.ControlWord = 0x27F; +// FxSaveArea->U.FxArea.MXCsr = 0x1F80; + + /* No NPX State */ + Thread->NpxState = 0xA; + + /* Setup the Stack for KiThreadStartup and Context Switching */ + StartFrame = &InitFrame->StartFrame; + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + + /* Tell the thread it will run in Kernel Mode */ + Thread->PreviousMode = KernelMode; + + /* Tell KiThreadStartup of that too */ + StartFrame->UserThread = FALSE; + } + + /* Now setup the remaining data for KiThreadStartup */ + StartFrame->StartContext = StartContext; + StartFrame->StartRoutine = StartRoutine; + StartFrame->SystemRoutine = SystemRoutine; + + /* And set up the Context Switch Frame */ + CtxSwitchFrame->RetAddr = KiThreadStartup; + CtxSwitchFrame->ApcBypassDisable = TRUE; + CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;; + + /* Save back the new value of the kernel stack. */ + Thread->KernelStack = (PVOID)CtxSwitchFrame; + +} + +/* EOF */ + + diff --git a/reactos/ntoskrnl/ke/amd64/trap.S b/reactos/ntoskrnl/ke/amd64/trap.S new file mode 100644 index 00000000000..532f6bbdb91 --- /dev/null +++ b/reactos/ntoskrnl/ke/amd64/trap.S @@ -0,0 +1,948 @@ +/* + * FILE: ntoskrnl/ke/amd64/trap.S + * COPYRIGHT: See COPYING in the top level directory + * PURPOSE: System Traps, Entrypoints and Exitpoints + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +EXTERN KiDispatchException:PROC +EXTERN FrLdrDbgPrint:DWORD +EXTERN KeBugCheckWithTf:PROC +EXTERN MmAccessFault:PROC +EXTERN KiSystemFatalException:PROC +EXTERN KiNpxNotAvailableFaultHandler:PROC +EXTERN KiGeneralProtectionFaultHandler:PROC +EXTERN KiXmmExceptionHandler:PROC + +/* GLOBALS *******************************************************************/ + +.data + +PUBLIC MsgUnimplemented +MsgUnimplemented: +.asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n" + +MsgPageFault: +.asciz "Page fault! Code = 0x%x, RIP = %p, FaultingAddress = %p\n" + +MsgGeneralProtFault: +.asciz "General protection fault at %p!\n" + +MsgBreakpointTrap: +.asciz "BreakpointTrap at %p\n" + +MsgUnexpectedInterrupt: +.asciz "UnexpectedInterrupt Vector=0x%02lx\n" + +MsgInvalidOpcodeFault: +.asciz "Invalid opcode fault at %p!\n" + +MsgDoubleFault: +.asciz "Double fault at %p, rbp=%p!\n" + +MsgTrapInfo: +.asciz "Trap: %s at %p\n" + +MACRO(TRAPINFO, func) +LOCAL label1, label2 +#if 0 + jmp label2 +label1: .asciz "\func" +label2: + sub rsp, 32 + lea rcx, MsgTrapInfo[rip] + lea rdx, 1b[rip] + mov r8, [rbp + KTRAP_FRAME_Rip] + call qword ptr FrLdrDbgPrint[rip] + add rsp, 32 +#endif +ENDM + +/* Helper Macros *************************************************************/ + +#define TRAPFLAG_VOLATILES HEX(01) +#define TRAPFLAG_NONVOLATILES HEX(02) +#define TRAPFLAG_XMM HEX(04) +#define TRAPFLAG_SEGMENTS HEX(08) +#define TRAPFLAG_DEBUG HEX(10) +#define TRAPFLAG_HAS_ERRORCODE HEX(100) + +#define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG) +#define TRAPFLAG_ALL HEX(ff) + +/* + * Stack Layout: + * |-------------------| + * | KTRAP_FRAME | + * |-------------------| <- rbp + * | EXCEPTION_RECORD | + * |-------------------| + * | KEXCEPTION_FRAME | + * |-------------------| <- rsp + * + */ + +/* + * ENTER_TRAP_FRAME - Allocate SIZE_KTRAP_FRAME and save registers to it + */ +MACRO(ENTER_TRAP_FRAME, Flags) +LOCAL dont_swap + + /* Save the trap flags for this trap */ + TRAPFLAGS = VAL(Flags) + + /* Size of hardware trap frame */ +if (TRAPFLAGS AND TRAPFLAG_HAS_ERRORCODE) + .pushframe code + SIZE_INITIAL_FRAME = 6 * 8 +else + .pushframe + SIZE_INITIAL_FRAME = 5 * 8 +endif + + /* Make room for a KTRAP_FRAME */ + sub rsp, (SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME) + .allocstack (SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME) + .endprolog + + /* Save rbp */ + mov [rsp + KTRAP_FRAME_Rbp], rbp + + /* Point rbp to the KTRAP_FRAME */ + lea rbp, [rsp] + +if (TRAPFLAGS AND TRAPFLAG_NONVOLATILES) + /* Save non-volatile registers */ + mov [rbp + KTRAP_FRAME_Rbx], rbx + mov [rbp + KTRAP_FRAME_Rdi], rdi + mov [rbp + KTRAP_FRAME_Rsi], rsi +endif + +if (TRAPFLAGS AND TRAPFLAG_VOLATILES) + /* Save volatile registers */ + mov [rbp + KTRAP_FRAME_Rax], rax + mov [rbp + KTRAP_FRAME_Rcx], rcx + mov [rbp + KTRAP_FRAME_Rdx], rdx + mov [rbp + KTRAP_FRAME_R8], r8 + mov [rbp + KTRAP_FRAME_R9], r9 + mov [rbp + KTRAP_FRAME_R10], r10 + mov [rbp + KTRAP_FRAME_R11], r11 +endif + +if (TRAPFLAGS AND TRAPFLAG_XMM) + /* Save xmm registers */ + movdqa [rbp + KTRAP_FRAME_Xmm0], xmm0 + movdqa [rbp + KTRAP_FRAME_Xmm1], xmm1 + movdqa [rbp + KTRAP_FRAME_Xmm2], xmm2 + movdqa [rbp + KTRAP_FRAME_Xmm3], xmm3 + movdqa [rbp + KTRAP_FRAME_Xmm4], xmm4 + movdqa [rbp + KTRAP_FRAME_Xmm5], xmm5 +endif + +if (TRAPFLAGS AND TRAPFLAG_SEGMENTS) + /* Save segment selectors */ + mov ax, ds + mov [rbp + KTRAP_FRAME_SegDs], ax + mov ax, es + mov [rbp + KTRAP_FRAME_SegEs], ax + mov ax, fs + mov [rbp + KTRAP_FRAME_SegFs], ax + mov ax, gs + mov [rbp + KTRAP_FRAME_SegGs], ax +endif + + /* Save previous mode and swap gs when it was UserMode */ + mov ax, [rbp + KTRAP_FRAME_SegCs] + and al, 1 + mov [rbp + KTRAP_FRAME_PreviousMode], al + jz dont_swap + swapgs +dont_swap: + + /* Save previous irql */ + mov rax, cr8 + mov [rbp + KTRAP_FRAME_PreviousIrql], al + +// KTRAP_FRAME_FaultIndicator +// KTRAP_FRAME_ExceptionActive +// KTRAP_FRAME_MxCsr + +if (TRAPFLAGS AND TRAPFLAG_DEBUG) + /* Save debug registers */ + mov rax, dr0 + mov [rbp + KTRAP_FRAME_Dr0], rax + mov rax, dr1 + mov [rbp + KTRAP_FRAME_Dr1], rax + mov rax, dr2 + mov [rbp + KTRAP_FRAME_Dr2], rax + mov rax, dr3 + mov [rbp + KTRAP_FRAME_Dr3], rax + mov rax, dr6 + mov [rbp + KTRAP_FRAME_Dr6], rax + mov rax, dr7 + mov [rbp + KTRAP_FRAME_Dr7], rax +endif + +// KTRAP_FRAME_DebugControl +// KTRAP_FRAME_LastBranchToRip +// KTRAP_FRAME_LastBranchFromRip +// KTRAP_FRAME_LastExceptionToRip +// KTRAP_FRAME_LastExceptionFromRip +// KTRAP_FRAME_TrapFrame + + /* Make sure the direction flag is cleared */ + cld +ENDM + + +/* + * LEAVE_TRAP_FRAME - Restore registers and free stack space + */ +MACRO(LEAVE_TRAP_FRAME) +LOCAL dont_swap_back +if (TRAPFLAGS AND TRAPFLAG_SEGMENTS) + /* Restore segment selectors */ + mov ax, [rbp + KTRAP_FRAME_SegDs] + mov ds, ax + mov ax, [rbp + KTRAP_FRAME_SegEs] + mov es, ax + mov ax, [rbp + KTRAP_FRAME_SegFs] + mov fs, ax +endif + + test byte ptr [rbp + KTRAP_FRAME_PreviousMode], 1 + jz dont_swap_back + swapgs +dont_swap_back: + +if (TRAPFLAGS AND TRAPFLAG_NONVOLATILES) + /* Restore non-volatile registers */ + mov rbx, [rbp + KTRAP_FRAME_Rbx] + mov rdi, [rbp + KTRAP_FRAME_Rdi] + mov rsi, [rbp + KTRAP_FRAME_Rsi] +endif + +if (TRAPFLAGS AND TRAPFLAG_VOLATILES) + /* Restore volatile registers */ + mov rax, [rbp + KTRAP_FRAME_Rax] + mov rcx, [rbp + KTRAP_FRAME_Rcx] + mov rdx, [rbp + KTRAP_FRAME_Rdx] + mov r8, [rbp + KTRAP_FRAME_R8] + mov r9, [rbp + KTRAP_FRAME_R9] + mov r10, [rbp + KTRAP_FRAME_R10] + mov r11, [rbp + KTRAP_FRAME_R11] +endif + +if (TRAPFLAGS AND TRAPFLAG_XMM) + /* Restore xmm registers */ + movdqa xmm0, [rbp + KTRAP_FRAME_Xmm0] + movdqa xmm1, [rbp + KTRAP_FRAME_Xmm1] + movdqa xmm2, [rbp + KTRAP_FRAME_Xmm2] + movdqa xmm3, [rbp + KTRAP_FRAME_Xmm3] + movdqa xmm4, [rbp + KTRAP_FRAME_Xmm4] + movdqa xmm5, [rbp + KTRAP_FRAME_Xmm5] +endif + + /* Restore rbp */ + mov rbp, [rbp + KTRAP_FRAME_Rbp] + + /* Adjust stack pointer */ + add rsp, KTRAP_FRAME_Rip +ENDM + + +/* FUNCTIONS *****************************************************************/ + +.text +.code64 + +ALIGN 8 + +PUBLIC InterruptDispatchTable +InterruptDispatchTable: +Vector = 0 +REPEAT 256 + push Vector + jmp KiUnexpectedInterrupt + ALIGN 8 + Vector = Vector+1 +ENDR + +// rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params +.PROC InternalDispatchException + + /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */ + sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME + .allocstack (SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME) + .endprolog + + /* Set up EXCEPTION_RECORD */ + lea rcx, [rsp + SIZE_KEXCEPTION_FRAME] + mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax + xor rax, rax + mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax + mov [rcx + EXCEPTION_RECORD_ExceptionRecord], rax + mov rax, [rbp + KTRAP_FRAME_Rip] + mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax + mov [rcx + EXCEPTION_RECORD_NumberParameters], edx + mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(00)], r9 + mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(08)], r10 + mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(10)], r11 + + /* Set up KEXCEPTION_FRAME */ + mov rax, [rbp + KTRAP_FRAME_Rbp] + mov [rsp + KEXCEPTION_FRAME_Rbp], rax + mov [rsp + KEXCEPTION_FRAME_Rbx], rbx + mov [rsp + KEXCEPTION_FRAME_Rdi], rdi + mov [rsp + KEXCEPTION_FRAME_Rsi], rsi + mov [rsp + KEXCEPTION_FRAME_R12], r12 + mov [rsp + KEXCEPTION_FRAME_R13], r13 + mov [rsp + KEXCEPTION_FRAME_R14], r14 + mov [rsp + KEXCEPTION_FRAME_R15], r15 + movdqa [rsp + KEXCEPTION_FRAME_Xmm6], xmm6 + movdqa [rsp + KEXCEPTION_FRAME_Xmm7], xmm7 + movdqa [rsp + KEXCEPTION_FRAME_Xmm8], xmm8 + movdqa [rsp + KEXCEPTION_FRAME_Xmm9], xmm9 + movdqa [rsp + KEXCEPTION_FRAME_Xmm10], xmm10 + movdqa [rsp + KEXCEPTION_FRAME_Xmm11], xmm11 + movdqa [rsp + KEXCEPTION_FRAME_Xmm12], xmm12 + movdqa [rsp + KEXCEPTION_FRAME_Xmm13], xmm13 + movdqa [rsp + KEXCEPTION_FRAME_Xmm14], xmm14 + movdqa [rsp + KEXCEPTION_FRAME_Xmm15], xmm15 + mov qword ptr [rsp + KEXCEPTION_FRAME_Return], 0 + + /* Call KiDispatchException */ + // rcx already points to ExceptionRecord + mov rdx, rsp // ExceptionFrame + mov r8, rbp // TrapFrame + mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode + mov byte ptr [rsp + KEXCEPTION_FRAME_P5], 1 // FirstChance + call KiDispatchException + + /* Restore registers */ + mov r12, [rsp + KEXCEPTION_FRAME_R12] + mov r13, [rsp + KEXCEPTION_FRAME_R13] + mov r14, [rsp + KEXCEPTION_FRAME_R14] + mov r15, [rsp + KEXCEPTION_FRAME_R15] + movdqa xmm6, [rsp + KEXCEPTION_FRAME_Xmm6] + movdqa xmm7, [rsp + KEXCEPTION_FRAME_Xmm7] + movdqa xmm8, [rsp + KEXCEPTION_FRAME_Xmm8] + movdqa xmm9, [rsp + KEXCEPTION_FRAME_Xmm9] + movdqa xmm10, [rsp + KEXCEPTION_FRAME_Xmm10] + movdqa xmm11, [rsp + KEXCEPTION_FRAME_Xmm11] + movdqa xmm12, [rsp + KEXCEPTION_FRAME_Xmm12] + movdqa xmm13, [rsp + KEXCEPTION_FRAME_Xmm13] + movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14] + movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15] + + add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME + ret +.ENDP InternalDispatchException + + +/* SOFTWARE INTERRUPT SERVICES ***********************************************/ + +PUBLIC KiDivideErrorFault +.PROC KiDivideErrorFault + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Enable interrupts */ + sti + + /* Dispatch the exception */ + mov eax, STATUS_INTEGER_DIVIDE_BY_ZERO + mov edx, 0 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiDivideErrorFault + + +PUBLIC KiDebugTrapOrFault +.PROC KiDebugTrapOrFault + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + TRAPINFO KiDebugTrapOrFault + + /* Check if the frame was from kernelmode */ + test word ptr [rbp + KTRAP_FRAME_SegCs], 3 + jz KiDebugTrapOrFaultKMode + + /* Enable interrupts for user-mode */ + sti + +KiDebugTrapOrFaultKMode: + + /* Dispatch the exception */ + mov eax, STATUS_SINGLE_STEP + mov edx, 0 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiDebugTrapOrFault + + +PUBLIC KiNmiInterrupt +.PROC KiNmiInterrupt + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + UNIMPLEMENTED KiNmiInterrupt + + jmp $ + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiNmiInterrupt + + +PUBLIC KiBreakpointTrap +.PROC KiBreakpointTrap + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + TRAPINFO KiBreakpointTrap + +// lea rcx, MsgBreakpointTrap[rip] +// mov rdx, rsp +// call qword ptr FrLdrDbgPrint[rip] + + /* Dispatch the exception */ + mov eax, STATUS_BREAKPOINT + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiBreakpointTrap + + +PUBLIC KiOverflowTrap +.PROC KiOverflowTrap + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Enable interrupts */ + sti + + /* Dispatch the exception */ + mov eax, STATUS_INTEGER_OVERFLOW + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiOverflowTrap + + +PUBLIC KiBoundFault +.PROC KiBoundFault + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Check if the frame was from kernelmode */ + test word ptr [rbp + KTRAP_FRAME_SegCs], 3 + jnz KiBoundFaltUserMode + + /* Bugcheck */ + mov ecx, EXCEPTION_BOUND_CHECK + mov rdx, rbp + call KiSystemFatalException + +KiBoundFaltUserMode: + /* Enable interrupts for user-mode */ + sti + + /* Dispatch the exception */ + mov eax, STATUS_INTEGER_OVERFLOW + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiBoundFault + + +PUBLIC KiInvalidOpcodeFault +.PROC KiInvalidOpcodeFault + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + TRAPINFO KiInvalidOpcodeFault + + mov rdx, [rbp + KTRAP_FRAME_Rip] + lea rcx, MsgInvalidOpcodeFault[rip] + call qword ptr FrLdrDbgPrint[rip] + + /* Enable interrupts */ + sti + + /* Check if the frame was from kernelmode */ + test word ptr [rbp + KTRAP_FRAME_SegCs], 3 + jz KiInvalidOpcodeKernel + + // FIXME: handle STATUS_INVALID_LOCK_SEQUENCE + +KiInvalidOpcodeKernel: + /* Kernel mode fault */ + + /* Dispatch the exception */ + mov eax, STATUS_ILLEGAL_INSTRUCTION + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiInvalidOpcodeFault + + +PUBLIC KiNpxNotAvailableFault +.PROC KiNpxNotAvailableFault + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Call the C handler */ + mov rcx, rbp + call KiNpxNotAvailableFaultHandler + + /* Check the return status code */ + test eax, eax + jz KiNpxNotAvailableFaultExit + + /* Dispatch the exception */ + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + +KiNpxNotAvailableFaultExit: + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiNpxNotAvailableFault + + +PUBLIC KiDoubleFaultAbort +.PROC KiDoubleFaultAbort + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + lea rcx, MsgDoubleFault[rip] + mov rdx, [rbp + KTRAP_FRAME_FaultAddress] + mov r8, rbp + call qword ptr FrLdrDbgPrint[rip] + + /* Bugcheck */ + mov ecx, 8 // EXCEPTION_DOUBLE_FAULT + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiDoubleFaultAbort + + +PUBLIC KiNpxSegmentOverrunAbort +.PROC KiNpxSegmentOverrunAbort + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Bugcheck */ + mov ecx, EXCEPTION_NPX_OVERRUN + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiNpxSegmentOverrunAbort + + +PUBLIC KiInvalidTssFault +.PROC KiInvalidTssFault + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + /* Bugcheck */ + mov ecx, EXCEPTION_INVALID_TSS + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiInvalidTssFault + + +PUBLIC KiSegmentNotPresentFault +.PROC KiSegmentNotPresentFault + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + /* Bugcheck */ + mov ecx, EXCEPTION_SEGMENT_NOT_PRESENT + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiSegmentNotPresentFault + + +PUBLIC KiStackFault +.PROC KiStackFault + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + /* Bugcheck */ + mov ecx, EXCEPTION_STACK_FAULT + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiStackFault + + +PUBLIC KiGeneralProtectionFault +.PROC KiGeneralProtectionFault + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + TRAPINFO KiGeneralProtectionFault + mov rdx, [rbp + KTRAP_FRAME_Rip] + lea rcx, MsgGeneralProtFault[rip] + call qword ptr FrLdrDbgPrint[rip] + + /* Call the C handler */ + call KiGeneralProtectionFaultHandler + + /* Check for success */ + test eax, eax + jge KiGpfExit + + /* Dispatch the exception */ + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + +KiGpfFatal: + + /* Bugcheck */ + mov ecx, UNEXPECTED_KERNEL_MODE_TRAP + mov rdx, HEX(000D) // EXCEPTION_GP_FAULT + xor r8, r8 + mov r9, [rbp + KTRAP_FRAME_ErrorCode] // error code + sub rsp, 8 + mov [rsp + KTRAP_FRAME_P5+8], rbp // trap frame + call KeBugCheckWithTf + +KiGpfExit: + /* Return */ + LEAVE_TRAP_FRAME + iretq +.ENDP KiGeneralProtectionFault + + +PUBLIC KiPageFault +.PROC KiPageFault + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + TRAPINFO KiPageFault + +#if 0 + lea rcx, MsgPageFault[rip] + mov rdx, [rbp + KTRAP_FRAME_ErrorCode] + mov r8, [rbp + KTRAP_FRAME_Rip] + mov r9, [rbp + KTRAP_FRAME_FaultAddress] + call qword ptr FrLdrDbgPrint[rip] +#endif + + /* Save page fault address */ + mov rdx, cr2 + mov [rbp + KTRAP_FRAME_FaultAddress], rdx + + /* Call page fault handler */ + mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // StoreInstruction + and ecx, 1 + // rdx == Address + mov r8b, [rbp + KTRAP_FRAME_SegCs] // Mode + and r8b, 1 + mov r9, rbp // TrapInformation + call MmAccessFault + + /* Check for success */ + test eax, eax + jge PageFaultReturn + + /* Set parameter 1 to error code */ + mov r9d, [rbp + KTRAP_FRAME_ErrorCode] + + /* Set parameter2 to faulting address */ + mov r10, cr2 // Param2 = faulting address + + cmp eax, STATUS_ACCESS_VIOLATION + je AccessViolation + cmp eax, STATUS_GUARD_PAGE_VIOLATION + je SpecialCode + cmp eax, STATUS_STACK_OVERFLOW + je SpecialCode + +InPageException: + /* Dispatch in-page exception */ + mov r11d, eax // Param3 = Status + mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode + mov edx, 3 // ParamCount + call InternalDispatchException + jmp PageFaultReturn + +AccessViolation: + /* Use more proper status code */ + mov eax, KI_EXCEPTION_ACCESS_VIOLATION + +SpecialCode: + /* Setup a normal page fault exception */ + mov edx, 2 // ParamCount + call InternalDispatchException + +PageFaultReturn: + LEAVE_TRAP_FRAME + iretq +.ENDP KiPageFault + + +PUBLIC KiFloatingErrorFault +.PROC KiFloatingErrorFault + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + UNIMPLEMENTED KiFloatingErrorFault + + jmp $ +.ENDP KiFloatingErrorFault + + +PUBLIC KiAlignmentFault +.PROC KiAlignmentFault + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + /* Enable interrupts */ + sti + + /* Bugcheck */ + mov ecx, EXCEPTION_ALIGNMENT_CHECK + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiAlignmentFault + + +PUBLIC KiMcheckAbort +.PROC KiMcheckAbort + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Bugcheck */ + mov ecx, HEX(12) + mov rdx, rbp + call KiSystemFatalException + + jmp $ +.ENDP KiMcheckAbort + + +PUBLIC KiXmmException +.PROC KiXmmException + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + /* Call the C handler */ + mov rcx, rbp + call KiXmmExceptionHandler + + /* Check for success */ + test eax, eax + jge KiXmmExit + + /* Dispatch the exception */ + mov edx, 3 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + +KiXmmExit: + LEAVE_TRAP_FRAME + iretq +.ENDP KiXmmException + + +PUBLIC KiApcInterrupt +.PROC KiApcInterrupt + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + UNIMPLEMENTED KiApcInterrupt + + jmp $ +.ENDP KiApcInterrupt + + +PUBLIC KiRaiseAssertion +.PROC KiRaiseAssertion + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + /* Decrement RIP to point to the INT2C instruction (2 bytes, not 1 like INT3) */ + sub qword ptr [rbp + KTRAP_FRAME_Rip], 2 + + /* Dispatch the exception */ + mov eax, STATUS_ASSERTION_FAILURE + mov edx, 0 + mov r9, 0 + mov r10, 0 + mov r11, 0 + call InternalDispatchException + + LEAVE_TRAP_FRAME + iretq +.ENDP KiRaiseAssertion + + +PUBLIC KiDebugServiceTrap +.PROC KiDebugServiceTrap + /* Push pseudo error code */ + ENTER_TRAP_FRAME TRAPFLAG_ALL + + TRAPINFO KiDebugServiceTrap + + /* Increase Rip to skip the int3 */ + inc qword ptr [rbp + KTRAP_FRAME_Rip] + + /* Dispatch the exception */ + mov eax, STATUS_BREAKPOINT + mov edx, 3 + mov r9, [rbp+KTRAP_FRAME_Rax] // Service + mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer + mov r11, [rbp+KTRAP_FRAME_Rdx] // Length + call InternalDispatchException + + LEAVE_TRAP_FRAME; + iretq +.ENDP KiDebugServiceTrap + + +PUBLIC KiDpcInterrupt +.PROC KiDpcInterrupt + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + UNIMPLEMENTED KiDpcInterrupt + + jmp $ +.ENDP KiDpcInterrupt + + +PUBLIC KiIpiInterrupt +.PROC KiIpiInterrupt + /* We have an error code */ + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + UNIMPLEMENTED KiIpiInterrupt + + jmp $ +.ENDP KiIpiInterrupt + + +PUBLIC KiUnexpectedInterrupt +.PROC KiUnexpectedInterrupt + /* The error code is the vector */ + cli + ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + + /* Set bugcheck parameters */ + mov ecx, TRAP_CAUSE_UNKNOWN + mov rdx, [rbp + KTRAP_FRAME_ErrorCode] // the vector + mov r8, 0 // The unknown floating-point exception + mov r9, 0 // The enabled and asserted status bits + sub rsp, 8 + mov [rbp + KTRAP_FRAME_P5 + 8], rbp // trap frame + call KeBugCheckWithTf + + jmp $ +.ENDP KiUnexpectedInterrupt + +#ifdef _MSC_VER + +//void __lgdt(void *Source); +PUBLIC __lgdt +__lgdt: + lgdt fword ptr [rcx] + ret + +//void __sgdt(void *Destination); +PUBLIC __sgdt +__sgdt: + sgdt fword ptr [rcx] + ret + +// void __lldt(unsigned short Value) +PUBLIC __lldt +__lldt: + lldt cx + ret + +//void __sldt(void *Destination); +PUBLIC __sldt +__sldt: + sldt word ptr [rcx] + ret + +//void __ltr(unsigned short Source); +PUBLIC __ltr +__ltr: + ltr cx + ret + +//void __str(unsigned short *Destination); +PUBLIC __str +__str: + str word ptr [rcx] + ret + +#endif + +END diff --git a/reactos/ntoskrnl/mm/amd64/init.c b/reactos/ntoskrnl/mm/amd64/init.c new file mode 100644 index 00000000000..eab7192edfc --- /dev/null +++ b/reactos/ntoskrnl/mm/amd64/init.c @@ -0,0 +1,884 @@ +/* + * COPYRIGHT: GPL, See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/mm/amd64/init.c + * PURPOSE: Memory Manager Initialization for amd64 + * + * PROGRAMMERS: Timo kreuzer (timo.kreuzer@reactos.org) + * ReactOS Portable Systems Group + */ + +/* INCLUDES ***************************************************************/ + +#include +//#define NDEBUG +#include + +#include "../ARM3/miarm.h" + +#ifdef _WINKD_ +extern PMMPTE MmDebugPte; +#endif + +VOID +NTAPI +HalInitializeBios(ULONG Unknown, PLOADER_PARAMETER_BLOCK LoaderBlock); + +/* GLOBALS *****************************************************************/ + +/* 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}; +MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; +MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | 0xFFFFF000}; + +/* Sizes */ +///SIZE_T MmSessionSize = MI_SESSION_SIZE; +SIZE_T MmSessionViewSize = MI_SESSION_VIEW_SIZE; +SIZE_T MmSessionPoolSize = MI_SESSION_POOL_SIZE; +SIZE_T MmSessionImageSize = MI_SESSION_IMAGE_SIZE; +SIZE_T MmSystemViewSize = MI_SYSTEM_VIEW_SIZE; +SIZE_T MiNonPagedSystemSize; + +/* Address ranges */ +ULONG64 MmUserProbeAddress = 0x7FFFFFF0000ULL; +PVOID MmHighestUserAddress = (PVOID)0x7FFFFFEFFFFULL; +PVOID MmSystemRangeStart = (PVOID)0xFFFF080000000000ULL; +PVOID MmSessionBase; // FFFFF90000000000 = MiSessionPoolStart +PVOID MiSessionPoolStart; // FFFFF90000000000 = MiSessionPoolEnd - MmSessionPoolSize +PVOID MiSessionPoolEnd; // = MiSessionViewStart +PVOID MiSessionViewStart; // = MiSessionViewEnd - MmSessionViewSize +PVOID MiSessionViewEnd; // FFFFF97FFF000000 +PVOID MiSessionImageStart; // ?FFFFF97FFF000000 = MiSessionImageEnd - MmSessionImageSize +PVOID MiSessionImageEnd; // FFFFF98000000000 = MiSessionSpaceEnd +PVOID MiSessionSpaceEnd = MI_SESSION_SPACE_END; // FFFFF98000000000 +PVOID MmSystemCacheStart; // FFFFF98000000000 +PVOID MmSystemCacheEnd; // FFFFFA8000000000 +/// PVOID MmPagedPoolStart = MI_PAGED_POOL_START; // FFFFFA8000000000 +PVOID MmPagedPoolEnd; // FFFFFAA000000000 +PVOID MiSystemViewStart; +PVOID MmNonPagedSystemStart; // FFFFFAA000000000 +PVOID MmNonPagedPoolStart; +PVOID MmNonPagedPoolExpansionStart; +///PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; // 0xFFFFFAE000000000 +PVOID MmHyperSpaceEnd = (PVOID)HYPER_SPACE_END; + +MMSUPPORT MmSystemCacheWs; + +ULONG64 MxPfnSizeInBytes; + +PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; +MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; +ULONG MiNumberDescriptors = 0; +PFN_NUMBER MiSystemPages = 0; +BOOLEAN MiIncludeType[LoaderMaximum]; + +PFN_NUMBER MxFreePageBase; +ULONG64 MxFreePageCount = 0; + +extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT]; + +BOOLEAN MiPfnsInitialized = FALSE; + +/* FUNCTIONS *****************************************************************/ + +ULONG +NoDbgPrint(const char *Format, ...) +{ + return 0; +} + +VOID +NTAPI +MiEvaluateMemoryDescriptors(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; + PLIST_ENTRY ListEntry; + PFN_NUMBER LastPage; + ULONG i; + + /* Get the size of the boot loader's image allocations */ + MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned * PAGE_SIZE; + MmBootImageSize = ROUND_UP(MmBootImageSize, 4 * 1024 * 1024); + + /* Instantiate memory that we don't consider RAM/usable */ + for (i = 0; i < LoaderMaximum; i++) MiIncludeType[i] = TRUE; + MiIncludeType[LoaderBad] = FALSE; + MiIncludeType[LoaderFirmwarePermanent] = FALSE; + MiIncludeType[LoaderSpecialMemory] = FALSE; + MiIncludeType[LoaderBBTMemory] = FALSE; + + /* Loop the memory descriptors */ + for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + ListEntry != &LoaderBlock->MemoryDescriptorListHead; + ListEntry = ListEntry->Flink) + { + /* Get the memory descriptor */ + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Count it */ + MiNumberDescriptors++; + + /* Skip pages that are not part of the PFN database */ + if (!MiIncludeType[Descriptor->MemoryType]) + { + continue; + } + + /* Add this to the total of pages */ + MmNumberOfPhysicalPages += Descriptor->PageCount; + + /* Check if this is the new lowest page */ + if (Descriptor->BasePage < MmLowestPhysicalPage) + { + /* Update the lowest page */ + MmLowestPhysicalPage = Descriptor->BasePage; + } + + /* Check if this is the new highest page */ + LastPage = Descriptor->BasePage + Descriptor->PageCount - 1; + if (LastPage > MmHighestPhysicalPage) + { + /* Update the highest page */ + MmHighestPhysicalPage = LastPage; + } + + /* Check if this is currently free memory */ + if ((Descriptor->MemoryType == LoaderFree) || + (Descriptor->MemoryType == LoaderLoadedProgram) || + (Descriptor->MemoryType == LoaderFirmwareTemporary) || + (Descriptor->MemoryType == LoaderOsloaderStack)) + { + /* Check if this is the largest memory descriptor */ + if (Descriptor->PageCount > MxFreePageCount) + { + /* For now, it is */ + MxFreeDescriptor = Descriptor; + MxFreePageBase = Descriptor->BasePage; + MxFreePageCount = Descriptor->PageCount; + } + } + else + { + /* Add it to the amount of system used pages */ + MiSystemPages += Descriptor->PageCount; + } + } +} + +PFN_NUMBER +NTAPI +MiEarlyAllocPage() +{ + PFN_NUMBER Pfn; + + if (MiPfnsInitialized) + { + return MmAllocPage(MC_SYSTEM); + } + + /* Make sure we have enough pages */ + if (!MxFreePageCount) + { + /* Crash the system */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MxFreeDescriptor->PageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + /* Use our lowest usable free pages */ + Pfn = MxFreePageBase; + MxFreePageBase++; + MxFreePageCount--; + return Pfn; +} + +PMMPTE +NTAPI +MxGetPte(PVOID Address) +{ + PMMPTE Pte; + MMPTE TmplPte; + + /* Setup template pte */ + TmplPte.u.Long = 0; + TmplPte.u.Flush.Valid = 1; + TmplPte.u.Flush.Write = 1; + + /* Get a pointer to the PXE */ + Pte = MiAddressToPxe(Address); + if (!Pte->u.Hard.Valid) + { + /* It's not valid, map it! */ + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); + *Pte = TmplPte; + + /* Zero the page */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); + } + + /* Get a pointer to the PPE */ + Pte = MiAddressToPpe(Address); + if (!Pte->u.Hard.Valid) + { + /* It's not valid, map it! */ + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); + *Pte = TmplPte; + + /* Zero the page */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); + } + + /* Get a pointer to the PDE */ + Pte = MiAddressToPde(Address); + if (!Pte->u.Hard.Valid) + { + /* It's not valid, map it! */ + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); + *Pte = TmplPte; + + /* Zero the page */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); + } + + /* Get a pointer to the PTE */ + Pte = MiAddressToPte(Address); + return Pte; +} + +VOID +NTAPI +MxMapPage(PVOID Address) +{ + MMPTE TmplPte, *Pte; + + /* Setup template pte */ + TmplPte.u.Long = 0; + TmplPte.u.Flush.Valid = 1; + TmplPte.u.Flush.Write = 1; + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); + + /* Get the PTE for that page */ + Pte = MxGetPte(Address); + ASSERT(Pte->u.Hard.Valid == 0); + + /* Map a physical page */ + *Pte = TmplPte; +} + +VOID +MxMapPageRange(PVOID Address, ULONG64 PageCount) +{ + while (PageCount--) + { + /* Map the page */ + MxMapPage(Address); + + /* Goto next page */ + Address = (PVOID)((ULONG64)Address + PAGE_SIZE); + } +} + +VOID +NTAPI +MiPreparePfnDatabse(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; + PLIST_ENTRY ListEntry; + PUCHAR Page, FirstPage; + SIZE_T Size; + + /* Calculate the size of the PFN database and convert to pages */ + MxPfnSizeInBytes = ROUND_TO_PAGES((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); + MxPfnAllocation = MxPfnSizeInBytes >> PAGE_SHIFT; + + /* Simply start at hardcoded address */ + MmPfnDatabase = MI_PFN_DATABASE; + + /* Loop the memory descriptors */ + for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + ListEntry != &LoaderBlock->MemoryDescriptorListHead; + ListEntry = ListEntry->Flink) + { + /* Get the memory descriptor */ + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Skip pages that are not part of the PFN database */ + if (MiIncludeType[Descriptor->MemoryType]) + { + /* Get the base and size of this pfn database entry */ + FirstPage = PAGE_ALIGN(&MmPfnDatabase[Descriptor->BasePage]); + Size = ROUND_TO_PAGES(Descriptor->PageCount * sizeof(MMPFN)); + + /* Loop the pages of this Pfn database entry */ + for (Page = FirstPage; Page < FirstPage + Size; Page += PAGE_SIZE) + { + /* Is the page already mapped? */ + if (!MmIsAddressValid(Page)) + { + /* It's not, map it now */ + MxMapPage(Page); + RtlZeroMemory(Page, PAGE_SIZE); + } + } + + /* Zero out the pages */ + RtlZeroMemory(FirstPage, Size); + } + } +} + + +VOID +NTAPI +MiInitializeSessionSpace(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + /* Set up session space */ + MiSessionSpaceEnd = (PVOID)MI_SESSION_SPACE_END; + + /* This is where we will load Win32k.sys and the video driver */ + MiSessionImageEnd = MiSessionSpaceEnd; + MiSessionImageStart = (PCHAR)MiSessionImageEnd - MmSessionImageSize; + + /* The view starts right below the session working set (itself below + * the image area) */ + MiSessionViewEnd = MI_SESSION_VIEW_END; + MiSessionViewStart = (PCHAR)MiSessionViewEnd - MmSessionViewSize; + ASSERT(IS_PAGE_ALIGNED(MiSessionViewStart)); + + /* Session pool follows */ + MiSessionPoolEnd = MiSessionViewStart; + MiSessionPoolStart = (PCHAR)MiSessionPoolEnd - MmSessionPoolSize; + ASSERT(IS_PAGE_ALIGNED(MiSessionPoolStart)); + + /* And it all begins here */ + MmSessionBase = MiSessionPoolStart; + + /* 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 = (PCHAR)MmSessionBase - MmSystemViewSize; + ASSERT(IS_PAGE_ALIGNED(MiSystemViewStart)); + + /* Sanity checks */ + ASSERT(MiSessionViewEnd <= MiSessionImageStart); + ASSERT(MmSessionBase <= MiSessionPoolStart); +} + +VOID +MiInitializePageTable() +{ + ULONG64 PageFrameOffset; + MMPTE TmplPte, *Pte; + + /* HACK: don't use freeldr debug print anymore */ + //FrLdrDbgPrint = NoDbgPrint; + + /* Get current directory base */ + MmSystemPageDirectory[0] = ((PMMPTE)PXE_SELFMAP)->u.Hard.PageFrameNumber; + PageFrameOffset = MmSystemPageDirectory[0] << PAGE_SHIFT; + ASSERT(PageFrameOffset == __readcr3()); + + /* Set directory base for the system process */ + PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameOffset; + + /* Enable global pages */ + __writecr4(__readcr4() | CR4_PGE); + ASSERT(__readcr4() & CR4_PGE); + + /* Enable no execute */ + __writemsr(X86_MSR_EFER, __readmsr(X86_MSR_EFER) | EFER_NXE); + + /* Loop the user mode PXEs */ + for (Pte = MiAddressToPxe(0); + Pte <= MiAddressToPxe(MmHighestUserAddress); + Pte++) + { + /* Zero the PXE, clear all mappings */ + Pte->u.Long = 0; + } + + /* Flush the TLB */ + KeFlushCurrentTb(); + + /* Set up a template PTE */ + TmplPte.u.Long = 0; + TmplPte.u.Flush.Valid = 1; + TmplPte.u.Flush.Write = 1; + HyperTemplatePte = TmplPte; + + /* Create PDPTs (72 KB) for shared system address space, + * skip page tables and hyperspace */ + + /* Loop the PXEs */ + for (Pte = MiAddressToPxe((PVOID)(HYPER_SPACE_END + 1)); + Pte <= MiAddressToPxe(MI_HIGHEST_SYSTEM_ADDRESS); + Pte++) + { + /* Is the PXE already valid? */ + if (!Pte->u.Hard.Valid) + { + /* It's not Initialize it */ + TmplPte.u.Flush.PageFrameNumber = MiEarlyAllocPage(0); + *Pte = TmplPte; + + /* Zero the page. The PXE is the PTE for the PDPT. */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); + } + } + + /* Setup the mapping PTEs */ + MmFirstReservedMappingPte = MxGetPte((PVOID)MI_MAPPING_RANGE_START); + MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; + MmLastReservedMappingPte = MiAddressToPte((PVOID)MI_MAPPING_RANGE_END); + +#ifdef _WINKD_ + /* Setup debug mapping PTE */ + MmDebugPte = MxGetPte(MI_DEBUG_MAPPING); +#endif +} + +VOID +NTAPI +MiBuildNonPagedPool(VOID) +{ + PMMPTE Pte; + PFN_COUNT PageCount; + + /* 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; + } + + /* 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) and add 400 KB for each MB above 4 */ + MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; + MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / + 256 * MmMaxAdditionNonPagedPoolPerMb; + } + + /* Don't let the maximum go too high */ + if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) + { + /* Set it to the upper limit */ + MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE; + } + + /* Put non paged pool to the end of the region */ + MmNonPagedPoolStart = (PCHAR)MmNonPagedPoolEnd - MmMaximumNonPagedPoolInBytes; + + /* Make sure it doesn't collide with the PFN database */ + if ((PCHAR)MmNonPagedPoolStart < (PCHAR)MmPfnDatabase + MxPfnSizeInBytes) + { + /* Put non paged pool after the PFN database */ + MmNonPagedPoolStart = (PCHAR)MmPfnDatabase + MxPfnSizeInBytes; + MmMaximumNonPagedPoolInBytes = (ULONG64)MmNonPagedPoolEnd - + (ULONG64)MmNonPagedPoolStart; + } + + ASSERT(IS_PAGE_ALIGNED(MmNonPagedPoolStart)); + + /* Calculate the nonpaged pool expansion start region */ + MmNonPagedPoolExpansionStart = (PCHAR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes; + ASSERT(IS_PAGE_ALIGNED(MmNonPagedPoolExpansionStart)); + + /* Map the nonpaged pool */ + PageCount = (MmSizeOfNonPagedPoolInBytes + PAGE_SIZE - 1) / PAGE_SIZE; + MxMapPageRange(MmNonPagedPoolStart, PageCount); + + /* Loop the non paged pool extension PTEs */ + for (Pte = MiAddressToPte(MmNonPagedPoolExpansionStart); + Pte <= MiAddressToPte(MmNonPagedPoolEnd); + Pte++) + { + /* Create PXE, PPE, PDE and zero the PTE */ + MxGetPte(MiPteToAddress(Pte))->u.Long = 0; + } + + /* Initialize the ARM3 nonpaged pool */ + MiInitializeNonPagedPool(); + + /* Initialize the nonpaged pool */ + InitializePool(NonPagedPool, 0); +} + +VOID +NTAPI +MiBuildSystemPteSpace() +{ + PMMPTE Pte, StartPte, EndPte; + + /* Use the default numer of system PTEs */ + MmNumberOfSystemPtes = MI_NUMBER_SYSTEM_PTES; + + /* System PTE pool is below the PFN database */ + MiNonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; + MmNonPagedSystemStart = (PCHAR)MmPfnDatabase - MiNonPagedSystemSize; + MmNonPagedSystemStart = MM_ROUND_DOWN(MmNonPagedSystemStart, 512 * PAGE_SIZE); + + /* Don't let it go below the minimum */ + if (MmNonPagedSystemStart < (PVOID)MI_NON_PAGED_SYSTEM_START_MIN) + { + /* This is a hard-coded limit in the Windows NT address space */ + MmNonPagedSystemStart = (PVOID)MI_NON_PAGED_SYSTEM_START_MIN; + + /* Reduce the amount of system PTEs to reach this point */ + MmNumberOfSystemPtes = ((ULONG64)MmPfnDatabase - + (ULONG64)MmNonPagedSystemStart) >> + PAGE_SHIFT; + MmNumberOfSystemPtes--; + ASSERT(MmNumberOfSystemPtes > 1000); + } + + /* Set the range of system PTEs */ + StartPte = MiAddressToPte(MI_SYSTEM_PTE_START); + EndPte = StartPte + MmNumberOfSystemPtes - 1; + + /* Loop the system PTEs */ + for (Pte = StartPte; Pte <= EndPte; Pte++) + { + /* Create PXE, PPE, PDE and zero the PTE */ + MxGetPte(MiPteToAddress(Pte))->u.Long = 0; + } + + /* Create the system PTE space */ + Pte = MiAddressToPte(MI_SYSTEM_PTE_START); + MiInitializeSystemPtes(Pte, MmNumberOfSystemPtes, SystemPteSpace); + + /* 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 */ + MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; +} + +VOID +NTAPI +MiBuildPhysicalMemoryBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PPHYSICAL_MEMORY_DESCRIPTOR Buffer; + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; + PLIST_ENTRY ListEntry; + PFN_NUMBER NextPage = -1; + PULONG Bitmap; + ULONG Runs = 0; + ULONG Size; + + /* Calculate size for the PFN bitmap */ + Size = ROUND_UP(MmHighestPhysicalPage + 1, sizeof(ULONG)); + + /* Allocate the PFN bitmap */ + Bitmap = ExAllocatePoolWithTag(NonPagedPool, Size, ' mM'); + + /* Allocate enough memory for the physical memory block */ + Buffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (MiNumberDescriptors - 1), + 'lMmM'); + if (!Bitmap || !Buffer) + { + /* This is critical */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MmLowestPhysicalPage, + MmHighestPhysicalPage, + 0x101); + } + + /* Initialize the bitmap and clear all bits */ + RtlInitializeBitMap(&MiPfnBitMap, Bitmap, MmHighestPhysicalPage + 1); + RtlClearAllBits(&MiPfnBitMap); + + /* Loop the memory descriptors */ + for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + ListEntry != &LoaderBlock->MemoryDescriptorListHead; + ListEntry = ListEntry->Flink) + { + /* Get the memory descriptor */ + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Skip pages that are not part of the PFN database */ + if (!MiIncludeType[Descriptor->MemoryType]) + { + continue; + } + + /* Does the memory block begin where the last ended? */ + if (Descriptor->BasePage == NextPage) + { + /* Add it to the current run */ + Buffer->Run[Runs - 1].PageCount += Descriptor->PageCount; + } + else + { + /* Create a new run */ + Runs++; + Buffer->Run[Runs - 1].BasePage = Descriptor->BasePage; + Buffer->Run[Runs - 1].PageCount = Descriptor->PageCount; + } + + /* Set the bits in the PFN bitmap */ + RtlSetBits(&MiPfnBitMap, Descriptor->BasePage, Descriptor->PageCount); + + /* Set the next page */ + NextPage = Descriptor->BasePage + Descriptor->PageCount; + } + + // FIXME: allocate a buffer of better size + + Buffer->NumberOfRuns = Runs; + Buffer->NumberOfPages = MmNumberOfPhysicalPages; + MmPhysicalMemoryBlock = Buffer; +} + +VOID +NTAPI +MiBuildPagedPool_x(VOID) +{ + PMMPTE Pte; + MMPTE TmplPte; + ULONG Size, BitMapSize; + + /* Default size for paged pool is 4 times non paged pool */ + MmSizeOfPagedPoolInBytes = 4 * MmMaximumNonPagedPoolInBytes; + + /* Make sure it doesn't overflow */ + if (MmSizeOfPagedPoolInBytes > ((ULONG64)MmNonPagedSystemStart - + (ULONG64)MmPagedPoolStart)) + { + MmSizeOfPagedPoolInBytes = (ULONG64)MmNonPagedSystemStart - + (ULONG64)MmPagedPoolStart; + } + + /* Make sure paged pool is big enough */ + if (MmSizeOfPagedPoolInBytes < MI_MIN_INIT_PAGED_POOLSIZE) + { + MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE; + } + + /* Align down to a PDE boundary */ + MmSizeOfPagedPoolInBytes = ROUND_DOWN(MmSizeOfPagedPoolInBytes, + 512 * PAGE_SIZE); + MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT; + + /* This is where paged pool ends */ + MmPagedPoolEnd = (PCHAR)MmPagedPoolStart + MmSizeOfPagedPoolInBytes - 1; + + /* Sanity check */ + ASSERT(MmPagedPoolEnd < MmNonPagedSystemStart); + + /* setup a template PTE */ + TmplPte.u.Long = 0; + TmplPte.u.Flush.Valid = 1; + TmplPte.u.Flush.Write = 1; + + /* Make sure the PXE is valid */ + Pte = MiAddressToPxe(MmPagedPoolStart); + if (!Pte->u.Flush.Valid) + { + /* Map it! */ + TmplPte.u.Flush.PageFrameNumber = MmAllocPage(MC_SYSTEM); + *Pte = TmplPte; + } + + /* Map all page directories (max 128) */ + for (Pte = MiAddressToPpe(MmPagedPoolStart); + Pte <= MiAddressToPpe(MmPagedPoolEnd); + Pte++) + { + if (!Pte->u.Flush.Valid) + { + /* Map it! */ + TmplPte.u.Flush.PageFrameNumber = MiEarlyAllocPage(); + *Pte = TmplPte; + } + } + + /* Create and map the first PTE for paged pool */ + Pte = MxGetPte(MmPagedPoolStart); + TmplPte.u.Flush.PageFrameNumber = MiEarlyAllocPage(); + *Pte = TmplPte; + + /* Save the first and last paged pool PTE */ + MmPagedPoolInfo.FirstPteForPagedPool = MiAddressToPte(MmPagedPoolStart); + MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd); + + MmPagedPoolInfo.NextPdeForPagedPoolExpansion = + MiAddressToPde(MmPagedPoolStart) + 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. + + /* The size of the bitmap in bits is the size in pages */ + BitMapSize = MmSizeOfPagedPoolInPages; + + /* Calculate buffer size in bytes, aligned to 32 bits */ + Size = sizeof(RTL_BITMAP) + ROUND_UP(BitMapSize, 32) / 8; + + // 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, 512); + + // 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); + + /* Initialize the bitmap */ + RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap, + (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1), + BitMapSize); + + /* No allocations, no allocation ends; clear all bits. */ + RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap); + + /* Initialize the paged pool mutex */ + KeInitializeGuardedMutex(&MmPagedPoolMutex); + + /* Initialize the paged pool */ + InitializePool(PagedPool, 0); +} + + +NTSTATUS +NTAPI +MmArmInitSystem_x(IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + if (Phase == 0) + { + MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned * PAGE_SIZE; + MmBootImageSize = ROUND_UP(MmBootImageSize, PAGE_SIZE); + + /* Parse memory descriptors, find free pages */ + MiEvaluateMemoryDescriptors(LoaderBlock); + + /* Start PFN database at hardcoded address */ + MmPfnDatabase = MI_PFN_DATABASE; + + /* Prepare PFN database mappings */ + MiPreparePfnDatabse(LoaderBlock); + + /* Initialize the session space */ + MiInitializeSessionSpace(LoaderBlock); + + /* Initialize some mappings */ + MiInitializePageTable(); + + /* Update the memory descriptor, to make sure the pages we used + won't get inserted into the PFN database */ + MxOldFreeDescriptor = *MxFreeDescriptor; + MxFreeDescriptor->BasePage = MxFreePageBase; + MxFreeDescriptor->PageCount = MxFreePageCount; + } + else if (Phase == 1) + { + /* The PFN database was created, restore the free descriptor */ + *MxFreeDescriptor = MxOldFreeDescriptor; + + /* The pfn database is ready now */ + MiPfnsInitialized = TRUE; + + /* Initialize the nonpaged pool */ + MiBuildNonPagedPool(); + + /* Initialize system PTE handling */ + MiBuildSystemPteSpace(); + + /* Build the physical memory block */ + MiBuildPhysicalMemoryBlock(LoaderBlock); + + /* Size up paged pool and build the shadow system page directory */ + //MiBuildPagedPool(); + + // This is the old stuff: + MmPagedPoolBase = (PVOID)((PCHAR)MmPagedPoolEnd + 1); + MmPagedPoolSize = MM_PAGED_POOL_SIZE; + ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart); + + + HalInitializeBios(0, LoaderBlock); + } + + return STATUS_SUCCESS; +} + +VOID +FASTCALL +MiSyncARM3WithROS(IN PVOID AddressStart, + IN PVOID AddressEnd) +{ + +} + +NTSTATUS +NTAPI +MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c new file mode 100644 index 00000000000..d9830b409e8 --- /dev/null +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -0,0 +1,534 @@ +/* + * COPYRIGHT: GPL, See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/mm/amd64/page.c + * PURPOSE: Low level memory managment manipulation + * + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ***************************************************************/ + +#include +#define NDEBUG +#include + +#undef InterlockedExchangePte +#define InterlockedExchangePte(pte1, pte2) \ + InterlockedExchange64((LONG64*)&pte1->u.Long, pte2.u.Long) + +#define PAGE_EXECUTE_ANY (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY) +#define PAGE_WRITE_ANY (PAGE_EXECUTE_READWRITE|PAGE_READWRITE|PAGE_EXECUTE_WRITECOPY|PAGE_WRITECOPY) +#define PAGE_WRITECOPY_ANY (PAGE_EXECUTE_WRITECOPY|PAGE_WRITECOPY) + +extern MMPTE HyperTemplatePte; + +/* GLOBALS *****************************************************************/ + + +/* PRIVATE FUNCTIONS *******************************************************/ + +BOOLEAN +FORCEINLINE +MiIsHyperspaceAddress(PVOID Address) +{ + return ((ULONG64)Address >= HYPER_SPACE && + (ULONG64)Address <= HYPER_SPACE_END); +} + +VOID +MiFlushTlb(PMMPTE Pte, PVOID Address) +{ + if (MiIsHyperspaceAddress(Pte)) + { + MmDeleteHyperspaceMapping((PVOID)PAGE_ROUND_DOWN(Pte)); + } + else + { + __invlpg(Address); + } +} + +static +PMMPTE +MiGetPteForProcess( + PEPROCESS Process, + PVOID Address, + BOOLEAN Create) +{ + MMPTE TmplPte, *Pte; + + /* Check if we need hypersapce mapping */ + if (Address < MmSystemRangeStart && + Process && Process != PsGetCurrentProcess()) + { + UNIMPLEMENTED; + return NULL; + } + else if (Create) + { + TmplPte.u.Long = 0; + TmplPte.u.Flush.Valid = 1; + TmplPte.u.Flush.Write = 1; + + /* Get the PXE */ + Pte = MiAddressToPxe(Address); + if (!Pte->u.Hard.Valid) + { +// TmplPte.u.Hard.PageFrameNumber = MiAllocPage(TRUE); + InterlockedExchangePte(Pte, TmplPte); + } + + /* Get the PPE */ + Pte = MiAddressToPpe(Address); + if (!Pte->u.Hard.Valid) + { +// TmplPte.u.Hard.PageFrameNumber = MiAllocPage(TRUE); + InterlockedExchangePte(Pte, TmplPte); + } + + /* Get the PDE */ + Pte = MiAddressToPde(Address); + if (!Pte->u.Hard.Valid) + { +// TmplPte.u.Hard.PageFrameNumber = MiAllocPage(TRUE); + InterlockedExchangePte(Pte, TmplPte); + } + } + else + { + /* Get the PXE */ + Pte = MiAddressToPxe(Address); + if (!Pte->u.Hard.Valid) + return NULL; + + /* Get the PPE */ + Pte = MiAddressToPpe(Address); + if (!Pte->u.Hard.Valid) + return NULL; + + /* Get the PDE */ + Pte = MiAddressToPde(Address); + if (!Pte->u.Hard.Valid) + return NULL; + } + + return MiAddressToPte(Address); +} + +static +ULONG64 +MiGetPteValueForProcess( + PEPROCESS Process, + PVOID Address) +{ + PMMPTE Pte; + ULONG64 PteValue; + + Pte = MiGetPteForProcess(Process, Address, FALSE); + PteValue = Pte ? Pte->u.Long : 0; + + if (MiIsHyperspaceAddress(Pte)) + MmDeleteHyperspaceMapping((PVOID)PAGE_ROUND_DOWN(Pte)); + + return PteValue; +} + +ULONG +NTAPI +MiGetPteProtection(MMPTE Pte) +{ + ULONG Protect; + + if (!Pte.u.Flush.Valid) + { + Protect = PAGE_NOACCESS; + } + else if (Pte.u.Flush.NoExecute) + { + if (Pte.u.Flush.CopyOnWrite) + Protect = PAGE_WRITECOPY; + else if (Pte.u.Flush.Write) + Protect = PAGE_READWRITE; + else + Protect = PAGE_READONLY; + } + else + { + if (Pte.u.Flush.CopyOnWrite) + Protect = PAGE_EXECUTE_WRITECOPY; + else if (Pte.u.Flush.Write) + Protect = PAGE_EXECUTE_READWRITE; + else + Protect = PAGE_EXECUTE_READ; + } + + if (Pte.u.Flush.CacheDisable) + Protect |= PAGE_NOCACHE; + + if (Pte.u.Flush.WriteThrough) + Protect |= PAGE_WRITETHROUGH; + + // PAGE_GUARD ? + return Protect; +} + +VOID +NTAPI +MiSetPteProtection(PMMPTE Pte, ULONG Protection) +{ + Pte->u.Flush.CopyOnWrite = (Protection & PAGE_WRITECOPY_ANY) ? 1 : 0; + Pte->u.Flush.Write = (Protection & PAGE_WRITE_ANY) ? 1 : 0; + Pte->u.Flush.CacheDisable = (Protection & PAGE_NOCACHE) ? 1 : 0; + Pte->u.Flush.WriteThrough = (Protection & PAGE_WRITETHROUGH) ? 1 : 0; + + // FIXME: This doesn't work. Why? +// Pte->u.Flush.NoExecute = (Protection & PAGE_EXECUTE_ANY) ? 0 : 1; +} + +/* FUNCTIONS ***************************************************************/ + +PFN_NUMBER +NTAPI +MmGetPfnForProcess(PEPROCESS Process, + PVOID Address) +{ + MMPTE Pte; + Pte.u.Long = MiGetPteValueForProcess(Process, Address); + return Pte.u.Hard.Valid ? Pte.u.Hard.PageFrameNumber : 0; +} + +PHYSICAL_ADDRESS +NTAPI +MmGetPhysicalAddress(PVOID Address) +{ + PHYSICAL_ADDRESS p; + MMPTE Pte; + + Pte.u.Long = MiGetPteValueForProcess(NULL, Address); + if (Pte.u.Hard.Valid) + { + p.QuadPart = Pte.u.Hard.PageFrameNumber * PAGE_SIZE; + p.u.LowPart |= (ULONG_PTR)Address & (PAGE_SIZE - 1); + } + else + { + p.QuadPart = 0; + } + + return p; +} + +BOOLEAN +NTAPI +MmIsPagePresent(PEPROCESS Process, PVOID Address) +{ + MMPTE Pte; + Pte.u.Long = MiGetPteValueForProcess(Process, Address); + return Pte.u.Hard.Valid; +} + +BOOLEAN +NTAPI +MmIsPageSwapEntry(PEPROCESS Process, PVOID Address) +{ + MMPTE Pte; + Pte.u.Long = MiGetPteValueForProcess(Process, Address); + return Pte.u.Hard.Valid && Pte.u.Soft.Transition; +} + +BOOLEAN +NTAPI +MmIsDirtyPage(PEPROCESS Process, PVOID Address) +{ + MMPTE Pte; + Pte.u.Long = MiGetPteValueForProcess(Process, Address); + return Pte.u.Hard.Valid && Pte.u.Hard.Dirty; +} + +ULONG +NTAPI +MmGetPageProtect(PEPROCESS Process, PVOID Address) +{ + MMPTE Pte; + + Pte.u.Long = MiGetPteValueForProcess(Process, Address); + + return MiGetPteProtection(Pte); +} + +VOID +NTAPI +MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) +{ + PMMPTE Pte; + MMPTE NewPte; + + Pte = MiGetPteForProcess(Process, Address, FALSE); + ASSERT(Pte != NULL); + + NewPte = *Pte; + + MiSetPteProtection(&NewPte, flProtect); + + InterlockedExchangePte(Pte, NewPte); + + MiFlushTlb(Pte, Address); +} + +VOID +NTAPI +MmSetCleanPage(PEPROCESS Process, PVOID Address) +{ + PMMPTE Pte; + + Pte = MiGetPteForProcess(Process, Address, FALSE); + if (!Pte) + { + KeBugCheckEx(MEMORY_MANAGEMENT, 0x1234, (ULONG64)Address, 0, 0); + } + + /* Ckear the dirty bit */ + if (InterlockedBitTestAndReset64((PVOID)Pte, 6)) + { + if (!MiIsHyperspaceAddress(Pte)) + __invlpg(Address); + } + + MiFlushTlb(Pte, Address); +} + +VOID +NTAPI +MmSetDirtyPage(PEPROCESS Process, PVOID Address) +{ + PMMPTE Pte; + + Pte = MiGetPteForProcess(Process, Address, FALSE); + if (!Pte) + { + KeBugCheckEx(MEMORY_MANAGEMENT, 0x1234, (ULONG64)Address, 0, 0); + } + + /* Ckear the dirty bit */ + if (InterlockedBitTestAndSet64((PVOID)Pte, 6)) + { + if (!MiIsHyperspaceAddress(Pte)) + __invlpg(Address); + } + + MiFlushTlb(Pte, Address); +} + + +NTSTATUS +NTAPI +Mmi386ReleaseMmInfo(PEPROCESS Process) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +VOID +NTAPI +MmDisableVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN* WasDirty, PPFN_NUMBER Page) +{ + UNIMPLEMENTED; +} + +VOID +NTAPI +MmRawDeleteVirtualMapping(PVOID Address) +{ + UNIMPLEMENTED; +} + +VOID +NTAPI +MmDeleteVirtualMapping( + PEPROCESS Process, + PVOID Address, + BOOLEAN FreePage, + BOOLEAN* WasDirty, + PPFN_NUMBER Page) +{ + PFN_NUMBER Pfn; + PMMPTE Pte; + MMPTE OldPte; + + Pte = MiGetPteForProcess(Process, Address, FALSE); + + if (Pte) + { + /* Atomically set the entry to zero and get the old value. */ + OldPte.u.Long = InterlockedExchange64((LONG64*)&Pte->u.Long, 0); + + if (OldPte.u.Hard.Valid) + { + Pfn = OldPte.u.Hard.PageFrameNumber; + + if (FreePage) + MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); + } + else + Pfn = 0; + } + else + { + OldPte.u.Long = 0; + Pfn = 0; + } + + /* Return information to the caller */ + if (WasDirty) + *WasDirty = OldPte.u.Hard.Dirty;; + + if (Page) + *Page = Pfn; + + MiFlushTlb(Pte, Address); +} + +VOID +NTAPI +MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, + SWAPENTRY* SwapEntry) +{ + UNIMPLEMENTED; +} + + +VOID +NTAPI +MmEnableVirtualMapping(PEPROCESS Process, PVOID Address) +{ + UNIMPLEMENTED; +} + + +NTSTATUS +NTAPI +MmCreatePageFileMapping(PEPROCESS Process, + PVOID Address, + SWAPENTRY SwapEntry) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + + +NTSTATUS +NTAPI +MmCreateVirtualMappingUnsafe( + PEPROCESS Process, + PVOID Address, + ULONG PageProtection, + PPFN_NUMBER Pages, + ULONG PageCount) +{ + ULONG i; + MMPTE TmplPte, *Pte; + + /* Check if the range is valid */ + if ((Process == NULL && Address < MmSystemRangeStart) || + (Process != NULL && Address > MmHighestUserAddress)) + { + DPRINT1("Address 0x%p is invalid for process %p\n", Address, Process); + ASSERT(FALSE); + } + + TmplPte.u.Long = 0; + TmplPte.u.Hard.Valid = 1; + MiSetPteProtection(&TmplPte, PageProtection); + +//__debugbreak(); + + for (i = 0; i < PageCount; i++) + { + TmplPte.u.Hard.PageFrameNumber = Pages[i]; + + Pte = MiGetPteForProcess(Process, Address, TRUE); + +DPRINT1("MmCreateVirtualMappingUnsafe, Address=%p, TmplPte=%p, Pte=%p\n", + Address, TmplPte.u.Long, Pte); + + if (InterlockedExchangePte(Pte, TmplPte)) + { + KeInvalidateTlbEntry(Address); + } + + if (MiIsHyperspaceAddress(Pte)) + MmDeleteHyperspaceMapping((PVOID)PAGE_ROUND_DOWN(Pte)); + + Address = (PVOID)((ULONG64)Address + PAGE_SIZE); + } + + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmCreateVirtualMapping(PEPROCESS Process, + PVOID Address, + ULONG Protect, + PPFN_NUMBER Pages, + ULONG PageCount) +{ + ULONG i; + + for (i = 0; i < PageCount; i++) + { + if (!MmIsPageInUse(Pages[i])) + { + DPRINT1("Page %x not in use\n", Pages[i]); + KeBugCheck(MEMORY_MANAGEMENT); + } + } + + return MmCreateVirtualMappingUnsafe(Process, Address, Protect, Pages, PageCount); +} + +NTSTATUS +NTAPI +MmInitializeHandBuiltProcess(IN PEPROCESS Process, + IN PULONG_PTR DirectoryTableBase) +{ + /* Share the directory base with the idle process */ + DirectoryTableBase[0] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[0]; + DirectoryTableBase[1] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[1]; + + /* Initialize the Addresss Space */ + KeInitializeGuardedMutex(&Process->AddressCreationLock); + Process->Vm.WorkingSetExpansionLinks.Flink = NULL; + ASSERT(Process->VadRoot.NumberGenericTableElements == 0); + Process->VadRoot.BalancedRoot.u1.Parent = &Process->VadRoot.BalancedRoot; + + /* The process now has an address space */ + Process->HasAddressSpace = TRUE; + return STATUS_SUCCESS; +} + +BOOLEAN +NTAPI +MmCreateProcessAddressSpace(IN ULONG MinWs, + IN PEPROCESS Process, + IN PULONG_PTR DirectoryTableBase) +{ + UNIMPLEMENTED; + return 0; +} + +BOOLEAN +NTAPI +_MmIsAddressValid(IN PVOID VirtualAddress) +{ + /* Check all four page table levels */ + return (MiAddressToPxe(VirtualAddress)->u.Hard.Valid != 0 && + MiAddressToPpe(VirtualAddress)->u.Hard.Valid != 0 && + MiAddressToPde(VirtualAddress)->u.Hard.Valid != 0 && + MiAddressToPte(VirtualAddress)->u.Hard.Valid != 0); +} + + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 03ce565623a..6b7cc84eca8 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -84,6 +84,22 @@ ctxhelp.S + + + boot.S + context.c + cpu.c + ctxswitch.S + except.c + interrupt.c + irql.c + kiinit.c + spinlock.c + stubs.c + thrdini.c + trap.S + + apc.c balmgr.c bug.c @@ -93,7 +109,9 @@ dpc.c eventobj.c except.c - freeldr.c + + freeldr.c + freeze.c gate.c gmutex.c @@ -125,6 +143,11 @@ cmhardwr.c + + + cmhardwr.c + + cmhardwr.c @@ -178,6 +201,11 @@ ioport.S + + + fastinterlck.c + + atom.c callback.c dbgctrl.c @@ -299,6 +327,17 @@ + + + + + i386-dis.c + kdb_help.S + kdb.c + + + + kdb.c kdb_cli.c @@ -321,6 +360,12 @@ kdbg.c + + + kd.c + kdmemsup.c + + kdinit.c kdio.c kdmain.c @@ -379,6 +424,12 @@ page.c + + + init.c + page.c + + @@ -462,6 +513,11 @@ psctx.c + + + psctx.c + + debug.c job.c kill.c diff --git a/reactos/ntoskrnl/ps/amd64/psctx.c b/reactos/ntoskrnl/ps/amd64/psctx.c new file mode 100644 index 00000000000..57ed4daa639 --- /dev/null +++ b/reactos/ntoskrnl/ps/amd64/psctx.c @@ -0,0 +1,95 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ps/amd64/pxctx.c + * PURPOSE: Process Manager: Set/Get Context for i386 + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +PspGetContext(IN PKTRAP_FRAME TrapFrame, + IN PVOID NonVolatileContext, + IN OUT PCONTEXT Context) +{ + PAGED_CODE(); + + /* Convert the trap frame to a context */ + KeTrapFrameToContext(TrapFrame, NULL, Context); +} + +VOID +NTAPI +PspSetContext(OUT PKTRAP_FRAME TrapFrame, + OUT PVOID NonVolatileContext, + IN PCONTEXT Context, + IN KPROCESSOR_MODE Mode) +{ + PAGED_CODE(); + + /* Convert the context to a trap frame structure */ + KeContextToTrapFrame(Context, NULL, TrapFrame, Context->ContextFlags, Mode); +} + +VOID +NTAPI +PspGetOrSetContextKernelRoutine(IN PKAPC Apc, + IN OUT PKNORMAL_ROUTINE* NormalRoutine, + IN OUT PVOID* NormalContext, + IN OUT PVOID* SystemArgument1, + IN OUT PVOID* SystemArgument2) +{ + PGET_SET_CTX_CONTEXT GetSetContext; + PKEVENT Event; + PCONTEXT Context; + PKTHREAD Thread; + KPROCESSOR_MODE Mode; + PKTRAP_FRAME TrapFrame = NULL; + PAGED_CODE(); + + /* Get the Context Structure */ + GetSetContext = CONTAINING_RECORD(Apc, GET_SET_CTX_CONTEXT, Apc); + Context = &GetSetContext->Context; + Event = &GetSetContext->Event; + Mode = GetSetContext->Mode; + Thread = Apc->SystemArgument2; + + /* If this is a kernel-mode request, grab the saved trap frame */ + if (Mode == KernelMode) TrapFrame = Thread->TrapFrame; + + /* If we don't have one, grab it from the stack */ + if (!TrapFrame) + { + DPRINT1("FIXME!!!!\n"); + /* Trap frame is right under our initial stack */ +// TrapFrame = (PKTRAP_FRAME)((ULONG_PTR)Thread->InitialStack - +// ROUND_UP(sizeof(KTRAP_FRAME), KTRAP_FRAME_ALIGN) - +// sizeof(FX_SAVE_AREA)); + } + + /* Check if it's a set or get */ + if (Apc->SystemArgument1) + { + /* Get the Context */ + PspSetContext(TrapFrame, NULL, Context, Mode); + } + else + { + /* Set the Context */ + PspGetContext(TrapFrame, NULL, Context); + } + + /* Notify the Native API that we are done */ + KeSetEvent(Event, IO_NO_INCREMENT, FALSE); +} + +/* EOF */ From be9e04b5cb0dbc7809c8b21f50dad79ee89c4378 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 24 Jul 2010 04:00:22 +0000 Subject: [PATCH 70/82] [NTOS]: Implement an AVL node deletion algorithm (RtlpDeleteAvlTreeNode). Use it in MiRemoveNode, now implemeneted, and RtlDeleteElementGenericTableAvl, also now implemented. It hopefully works. svn path=/trunk/; revision=48223 --- reactos/lib/rtl/avlsupp.c | 98 ++++++++++++++++++++++++++++++ reactos/lib/rtl/avltable.c | 26 +++++++- reactos/lib/rtl/rtlavl.h | 8 +++ reactos/ntoskrnl/mm/ARM3/miarm.h | 7 +++ reactos/ntoskrnl/mm/ARM3/miavl.h | 10 +++ reactos/ntoskrnl/mm/ARM3/vadnode.c | 12 ++++ 6 files changed, 159 insertions(+), 2 deletions(-) diff --git a/reactos/lib/rtl/avlsupp.c b/reactos/lib/rtl/avlsupp.c index b5546b76cf3..74d5163922b 100644 --- a/reactos/lib/rtl/avlsupp.c +++ b/reactos/lib/rtl/avlsupp.c @@ -292,4 +292,102 @@ RtlpInsertAvlTreeNode(IN PRTL_AVL_TABLE Table, } } +VOID +FORCEINLINE +RtlpDeleteAvlTreeNode(IN PRTL_AVL_TABLE Table, + IN PRTL_BALANCED_LINKS Node) +{ + PRTL_BALANCED_LINKS DeleteNode, ParentNode; + PRTL_BALANCED_LINKS *Node1, *Node2; + CHAR Balance; + + /* Take one of the children if possible */ + if (!(RtlLeftChildAvl(Node)) || !(RtlRightChildAvl(Node))) DeleteNode = Node; + + /* Otherwise, check if one side is longer */ + if (!(DeleteNode) && (RtlBalance(Node) >= RtlBalancedAvlTree)) + { + /* Pick the successor which will be the longest side in this case */ + DeleteNode = RtlRightChildAvl(Node); + while (RtlLeftChildAvl(DeleteNode)) DeleteNode = RtlLeftChildAvl(DeleteNode); + } + else if (!DeleteNode) + { + /* Pick the predecessor which will be the longest side in this case */ + DeleteNode = RtlLeftChildAvl(Node); + while (RtlRightChildAvl(DeleteNode)) DeleteNode = RtlRightChildAvl(DeleteNode); + } + + /* Get the parent node */ + ParentNode = RtlParentAvl(DeleteNode); + + /* Pick which now to use based on whether or not we have a left child */ + Node1 = RtlLeftChildAvl(DeleteNode) ? &DeleteNode->LeftChild : &DeleteNode->RightChild; + + /* Pick which node to swap based on if we're already a left child or not */ + Node2 = RtlIsLeftChildAvl(DeleteNode) ? &ParentNode->LeftChild : &ParentNode->RightChild; + + /* Pick the correct balance depending on which side will get heavier */ + Balance = RtlIsLeftChildAvl(DeleteNode) ? RtlLeftHeavyAvlTree : RtlRightHeavyAvlTree; + + /* Swap the children nodes, making one side heavier */ + *Node2 = *Node1; + + /* If the node has a child now, update its parent */ + if (*Node1) RtlSetParent(*Node1, ParentNode); + + /* Assume balanced root for loop optimization */ + RtlSetBalance(&Table->BalancedRoot, RtlBalancedAvlTree); + + /* Loop up the tree by parents */ + while (TRUE) + { + /* Check if the tree's balance increased */ + if (RtlBalance(ParentNode) == Balance) + { + /* Now the tree is balanced */ + RtlSetBalance(ParentNode, RtlBalancedAvlTree); + } + else if (RtlBalance(ParentNode) == RtlBalancedAvlTree) + { + /* The tree has now become less balanced, since it was balanced */ + RtlSetBalance(ParentNode, -Balance); + + /* Deal with the loop optimization to detect loss of a tree level */ + if (RtlBalance(&Table->BalancedRoot) != RtlBalancedAvlTree) Table->DepthOfTree--; + break; + } + else + { + /* The tree has become unbalanced, so a rebalance is needed */ + if (RtlpRebalanceAvlTreeNode(ParentNode)) break; + + /* Get the new parent after the balance */ + ParentNode = RtlParentAvl(ParentNode); + } + + /* Choose which balance factor to use based on which side we're on */ + Balance = RtlIsRightChild(ParentNode) ? + RtlRightHeavyAvlTree : RtlLeftHeavyAvlTree; + + /* Iterate up the tree */ + ParentNode = RtlParentAvl(ParentNode); + } + + /* Check if this isn't the node we ended up deleting directly */ + if (Node == DeleteNode) return; + + /* Copy the deleted node itself */ + RtlpCopyAvlNodeData(DeleteNode, Node); + + /* Pick the right node to unlink */ + Node1 = RtlIsLeftChildAvl(Node) ? + &(RtlParentAvl(DeleteNode))->LeftChild : &(RtlParentAvl(DeleteNode))->RightChild; + *Node1 = DeleteNode; + + /* Reparent as appropriate */ + if (RtlLeftChildAvl(DeleteNode)) RtlSetParent(RtlLeftChildAvl(DeleteNode), DeleteNode); + if (RtlRightChildAvl(DeleteNode)) RtlSetParent(RtlRightChildAvl(DeleteNode), DeleteNode); +} + /* EOF */ diff --git a/reactos/lib/rtl/avltable.c b/reactos/lib/rtl/avltable.c index f85025b6d64..acfb99d4a64 100644 --- a/reactos/lib/rtl/avltable.c +++ b/reactos/lib/rtl/avltable.c @@ -296,8 +296,30 @@ NTAPI RtlDeleteElementGenericTableAvl(IN PRTL_AVL_TABLE Table, IN PVOID Buffer) { - UNIMPLEMENTED; - return FALSE; + PRTL_BALANCED_LINKS Node; + TABLE_SEARCH_RESULT SearchResult; + + /* Find the node */ + SearchResult = RtlpFindAvlTableNodeOrParent(Table, Buffer, &Node); + if (SearchResult != TableFoundNode) return FALSE; + + /* If this node was the key, update it */ + if (Node == Table->RestartKey) Table->RestartKey = RtlRealPredecessorAvl(Node); + + /* Do the delete */ + Table->DeleteCount++; + RtlpDeleteAvlTreeNode(Table, Node); + Table->NumberGenericTableElements--; + + /* Reset accounting */ + Table->WhichOrderedElement = 0; + Table->OrderedPointer = NULL; + + /* Free the node's data */ + Table->FreeRoutine(Table, Node); + + /* It's done */ + return TRUE; } /* EOF */ diff --git a/reactos/lib/rtl/rtlavl.h b/reactos/lib/rtl/rtlavl.h index b320ad449f5..7088ce1ecfe 100644 --- a/reactos/lib/rtl/rtlavl.h +++ b/reactos/lib/rtl/rtlavl.h @@ -24,6 +24,14 @@ #define RtlInsertAsLeftChildAvl RtlInsertAsLeftChild #define RtlIsLeftChildAvl RtlIsLeftChild +VOID +FORCEINLINE +RtlpCopyAvlNodeData(IN PRTL_BALANCED_LINKS Node1, + IN PRTL_BALANCED_LINKS Node2) +{ + *Node1 = *Node2; +} + RTL_GENERIC_COMPARE_RESULTS FORCEINLINE RtlpAvlCompareRoutine(IN PRTL_AVL_TABLE Table, diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 417544c0913..7d82887c08e 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -1107,4 +1107,11 @@ MiInsertNode( IN PMM_AVL_TABLE Table ); +VOID +NTAPI +MiRemoveNode( + IN PMMADDRESS_NODE Node, + IN PMM_AVL_TABLE Table +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/miavl.h b/reactos/ntoskrnl/mm/ARM3/miavl.h index e32d00ab530..8b0ce6db62c 100644 --- a/reactos/ntoskrnl/mm/ARM3/miavl.h +++ b/reactos/ntoskrnl/mm/ARM3/miavl.h @@ -28,6 +28,16 @@ #define PRTL_BALANCED_LINKS PMMADDRESS_NODE #define MI_ASSERT(x) ASSERT(x) +VOID +FORCEINLINE +RtlpCopyAvlNodeData(IN PRTL_BALANCED_LINKS Node1, + IN PRTL_BALANCED_LINKS Node2) +{ + Node1->u1.Parent = Node2->u1.Parent; + Node1->LeftChild = Node2->LeftChild; + Node1->RightChild = Node2->RightChild; +} + RTL_GENERIC_COMPARE_RESULTS FORCEINLINE RtlpAvlCompareRoutine(IN PRTL_AVL_TABLE Table, diff --git a/reactos/ntoskrnl/mm/ARM3/vadnode.c b/reactos/ntoskrnl/mm/ARM3/vadnode.c index f87c58536a4..c6f8be6ff86 100644 --- a/reactos/ntoskrnl/mm/ARM3/vadnode.c +++ b/reactos/ntoskrnl/mm/ARM3/vadnode.c @@ -107,6 +107,18 @@ MiInsertNode(IN PMMADDRESS_NODE NewNode, RtlpInsertAvlTreeNode(Table, NewNode, NodeOrParent, Result); } +VOID +NTAPI +MiRemoveNode(IN PMMADDRESS_NODE Node, + IN PMM_AVL_TABLE Table) +{ + /* Call the AVL code */ + RtlpDeleteAvlTreeNode(Table, Node); + + /* Decrease element count */ + Table->NumberGenericTableElements--; +} + PMMADDRESS_NODE NTAPI MiGetPreviousNode(IN PMMADDRESS_NODE Node) From 74f12eeaf79071a032c7cc9788766dbb540b6ae9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 09:20:56 +0000 Subject: [PATCH 71/82] [XDK] - Make sure FORCEINLINE comes as first in declarations. [DDK] - Update DDK to reflect the XDK changes. svn path=/trunk/; revision=48224 --- reactos/include/ddk/ntddk.h | 2 +- reactos/include/ddk/ntifs.h | 4 ++-- reactos/include/ddk/wdm.h | 6 +++--- reactos/include/xdk/fsrtlfuncs.h | 2 +- reactos/include/xdk/iofuncs.h | 8 ++++---- reactos/include/xdk/rtlfuncs.h | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 24f3026de7e..be27ea014af 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -3780,8 +3780,8 @@ HalBugCheckSystem( */ #define IoDeassignArcName IoDeleteSymbolicLink -VOID FORCEINLINE +VOID NTAPI IoInitializeDriverCreateContext( PIO_DRIVER_CREATE_CONTEXT DriverContext) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 52f93324601..8c4f1a1bbad 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -5904,8 +5904,8 @@ IoEnumerateRegisteredFiltersList( #if (NTDDI_VERSION >= NTDDI_VISTA) -VOID FORCEINLINE +VOID NTAPI IoInitializePriorityInfo( IN PIO_PRIORITY_INFO PriorityInfo) @@ -7942,8 +7942,8 @@ extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ NULL) -VOID FORCEINLINE +VOID NTAPI FsRtlSetupAdvancedHeader( IN PVOID AdvHdr, diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index ae738fd80aa..4ac1c25b456 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -8154,8 +8154,8 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } -BOOLEAN FORCEINLINE +BOOLEAN IsListEmpty( IN CONST LIST_ENTRY * ListHead) { @@ -12895,8 +12895,8 @@ IoMarkIrpPending( IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \ HighWatermark, sizeof(IO_REMOVE_LOCK)) -VOID FORCEINLINE +VOID IoInitializeDpcRequest( IN PDEVICE_OBJECT DeviceObject, IN PIO_DPC_ROUTINE DpcRoutine) @@ -12949,8 +12949,8 @@ IoGetRemainingStackSize(VOID) } #if (NTDDI_VERSION >= NTDDI_WS03) -VOID FORCEINLINE +VOID IoInitializeThreadedDpcRequest( IN PDEVICE_OBJECT DeviceObject, IN PIO_DPC_ROUTINE DpcRoutine) diff --git a/reactos/include/xdk/fsrtlfuncs.h b/reactos/include/xdk/fsrtlfuncs.h index 05fdb7e19b1..3b411e76461 100644 --- a/reactos/include/xdk/fsrtlfuncs.h +++ b/reactos/include/xdk/fsrtlfuncs.h @@ -1463,8 +1463,8 @@ extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ NULL) -VOID FORCEINLINE +VOID NTAPI FsRtlSetupAdvancedHeader( IN PVOID AdvHdr, diff --git a/reactos/include/xdk/iofuncs.h b/reactos/include/xdk/iofuncs.h index 526dab3fe21..32b473e6e72 100644 --- a/reactos/include/xdk/iofuncs.h +++ b/reactos/include/xdk/iofuncs.h @@ -562,8 +562,8 @@ $if (_NTDDK_) */ #define IoDeassignArcName IoDeleteSymbolicLink -VOID FORCEINLINE +VOID NTAPI IoInitializeDriverCreateContext( PIO_DRIVER_CREATE_CONTEXT DriverContext) @@ -2308,8 +2308,8 @@ IoIsFileObjectIgnoringSharing( $endif (_NTDDK_) $if (_NTIFS_) -VOID FORCEINLINE +VOID NTAPI IoInitializePriorityInfo( IN PIO_PRIORITY_INFO PriorityInfo) @@ -2582,8 +2582,8 @@ IoMarkIrpPending( IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \ HighWatermark, sizeof(IO_REMOVE_LOCK)) -VOID FORCEINLINE +VOID IoInitializeDpcRequest( IN PDEVICE_OBJECT DeviceObject, IN PIO_DPC_ROUTINE DpcRoutine) @@ -2636,8 +2636,8 @@ IoGetRemainingStackSize(VOID) } #if (NTDDI_VERSION >= NTDDI_WS03) -VOID FORCEINLINE +VOID IoInitializeThreadedDpcRequest( IN PDEVICE_OBJECT DeviceObject, IN PIO_DPC_ROUTINE DpcRoutine) diff --git a/reactos/include/xdk/rtlfuncs.h b/reactos/include/xdk/rtlfuncs.h index a8cd1c6d490..af347f4f2aa 100644 --- a/reactos/include/xdk/rtlfuncs.h +++ b/reactos/include/xdk/rtlfuncs.h @@ -16,8 +16,8 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } -BOOLEAN FORCEINLINE +BOOLEAN IsListEmpty( IN CONST LIST_ENTRY * ListHead) { From e7cebee70600d6b0082c87b29450124dddcf6f54 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 09:52:46 +0000 Subject: [PATCH 72/82] [CRT] - Add __MINGW_ATTRIB_UNUSED macro. svn path=/trunk/; revision=48225 --- reactos/include/crt/_mingw.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/include/crt/_mingw.h b/reactos/include/crt/_mingw.h index cff811248d8..3ab124d91a1 100644 --- a/reactos/include/crt/_mingw.h +++ b/reactos/include/crt/_mingw.h @@ -116,6 +116,12 @@ #define __MINGW_ATTRIB_NONNULL(arg) #endif /* GNUC >= 3.3 */ +#ifdef __GNUC__ +#define __MINGW_ATTRIB_UNUSED __attribute__ ((__unused__)) +#else +#define __MINGW_ATTRIB_UNUSED +#endif /* ATTRIBUTE_UNUSED */ + #if __MINGW_GNUC_PREREQ (3, 1) #define __MINGW_ATTRIB_DEPRECATED __attribute__ ((__deprecated__)) #elif __MINGW_MSC_PREREQ(12, 0) From 0e192aab8145d7201e6efa9f50abb4d7a0d66ac2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 09:59:34 +0000 Subject: [PATCH 73/82] [MINGW-W64] - Sync gs_support.c now that our patches are committed upstream. svn path=/trunk/; revision=48226 --- reactos/lib/3rdparty/mingw/gs_support.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reactos/lib/3rdparty/mingw/gs_support.c b/reactos/lib/3rdparty/mingw/gs_support.c index 4be8fe45736..dd072382339 100644 --- a/reactos/lib/3rdparty/mingw/gs_support.c +++ b/reactos/lib/3rdparty/mingw/gs_support.c @@ -4,7 +4,14 @@ * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#define WIN32_NO_STATUS +#include /* abort () */ #include +#undef WIN32_NO_STATUS +#include /* STATUS macros */ #ifdef _WIN64 #include #endif @@ -22,10 +29,9 @@ PVOID RtlVirtualUnwind (ULONG HandlerType, ULONG64, ULONG64, PRUNTIME_FUNCTION, PCONTEXT, PVOID *, PULONG64, PVOID); #endif -typedef LONG NTSTATUS; +typedef LONG NTSTATUS; /* same as in ntdef.h / winternl.h */ #define UNW_FLAG_NHANDLER 0x00 -#define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409L) typedef union { @@ -101,7 +107,7 @@ __declspec(noreturn) void __cdecl __report_gsfailure (ULONGLONG); __declspec(noreturn) void __cdecl __report_gsfailure (ULONGLONG StackCookie) { - volatile UINT_PTR __UNUSED_PARAM(cookie[2]); + volatile UINT_PTR cookie[2] __MINGW_ATTRIB_UNUSED; #ifdef _WIN64 ULONG64 controlPC, imgBase, establisherFrame; PRUNTIME_FUNCTION fctEntry; From e1e0ed63e2e164fac80fa21f3a76c77fbcb4006b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 10:10:15 +0000 Subject: [PATCH 74/82] [[MINGW-W64] - Tighten up reactos.diff now that we have all those diffs (except one) committed upstream. svn path=/trunk/; revision=48227 --- reactos/lib/3rdparty/mingw/reactos.diff | 75 ------------------------- 1 file changed, 75 deletions(-) diff --git a/reactos/lib/3rdparty/mingw/reactos.diff b/reactos/lib/3rdparty/mingw/reactos.diff index 88d81ed1570..8b7d045d9d1 100644 --- a/reactos/lib/3rdparty/mingw/reactos.diff +++ b/reactos/lib/3rdparty/mingw/reactos.diff @@ -1,38 +1,3 @@ -Index: CRT_fp10.c -=================================================================== ---- CRT_fp10.c (Revision 43956) -+++ CRT_fp10.c (Arbeitskopie) -@@ -7,6 +7,16 @@ - void _fpreset (void); - - void _fpreset (void) -- { __asm__ ("fninit" ) ;} -+{ -+#ifdef __GNUC__ -+ __asm__ ("fninit" ); -+#else -+ __asm fninit; -+#endif -+} - -+#ifdef __GNUC__ - void __attribute__ ((alias ("_fpreset"))) fpreset(void); -+#else -+void fpreset(void) { _fpreset(); } -+#endif -Index: CRT_fp8.c -=================================================================== ---- CRT_fp8.c (Revision 43956) -+++ CRT_fp8.c (Arbeitskopie) -@@ -14,4 +14,8 @@ - (* __MINGW_IMP_SYMBOL(_fpreset))(); - } - -+#ifdef __GNUC__ - void __attribute__ ((alias ("_fpreset"))) fpreset(void); -+#else -+void fpreset(void) { _fpreset(); } -+#endif Index: crtexe.c =================================================================== --- crtexe.c (Revision 43956) @@ -45,43 +10,3 @@ Index: crtexe.c #ifndef __winitenv extern wchar_t *** __MINGW_IMP_SYMBOL(__winitenv); -@@ -51,7 +52,11 @@ - #define _commode (* __MINGW_IMP_SYMBOL(_commode)) - extern int _dowildcard; - -+#if defined(__GNUC__) - int _MINGW_INSTALL_DEBUG_MATHERR __attribute__((weak)) = 0; -+#else -+int _MINGW_INSTALL_DEBUG_MATHERR = 0; -+#endif - extern int __defaultmatherr; - extern _CRTIMP void __cdecl _initterm(_PVFV *, _PVFV *); - -Index: gs_support.c -=================================================================== ---- gs_support.c (Revision 43956) -+++ gs_support.c (Arbeitskopie) -@@ -112,6 +112,7 @@ - else - #endif - { -+#ifdef __GNUC__ - #ifdef _WIN64 - GS_ContextRecord.Rip = (ULONGLONG) __builtin_return_address (0); - GS_ContextRecord.Rsp = (ULONGLONG) __builtin_frame_address (0) + 8; -@@ -119,6 +120,15 @@ - GS_ContextRecord.Eip = (DWORD) __builtin_return_address (0); - GS_ContextRecord.Esp = (DWORD) __builtin_frame_address (0) + 4; - #endif -+#else -+#ifdef _WIN64 -+ GS_ContextRecord.Rip = (ULONGLONG) _ReturnAddress(); -+ GS_ContextRecord.Rsp = (ULONGLONG) _AddressOfReturnAddress(); -+#else -+ GS_ContextRecord.Eip = (DWORD) _ReturnAddress(); -+ GS_ContextRecord.Esp = (DWORD) _AddressOfReturnAddress(); -+#endif -+#endif - } - - #ifdef _WIN64 From 39cec38832eafc1a85b98ebed69a239b278e3c6d Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 10:51:22 +0000 Subject: [PATCH 75/82] [XDK] - Missed this one (FORCEINLINE) [DDK] - Update DDK to reflect the XDK changes. svn path=/trunk/; revision=48228 --- reactos/include/ddk/wdm.h | 2 +- reactos/include/xdk/rtlfuncs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 4ac1c25b456..3b4e063e831 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -9521,8 +9521,8 @@ InitializeSListHead( #else -VOID FORCEINLINE +VOID InitializeSListHead( OUT PSLIST_HEADER SListHead) { diff --git a/reactos/include/xdk/rtlfuncs.h b/reactos/include/xdk/rtlfuncs.h index af347f4f2aa..d0657f6dd41 100644 --- a/reactos/include/xdk/rtlfuncs.h +++ b/reactos/include/xdk/rtlfuncs.h @@ -2855,8 +2855,8 @@ InitializeSListHead( #else -VOID FORCEINLINE +VOID InitializeSListHead( OUT PSLIST_HEADER SListHead) { From e297cfa30634a1e8ac5b4416c2fc24d5ba934aa9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 13:47:41 +0000 Subject: [PATCH 76/82] [NDIS] - Move NDIS_HARDWARE_STATUS, GEN_GET_TIME_CAPS, GEN_GET_NETCARD_TIME, NDIS_MEDIA_STATE, NDIS_GUID, NDIS_PM_PACKET_PATTERN, NETWORK_ADDRESS, NETWORK_ADDRESS_LIST, TRANSPORT_HEADER_OFFSET and NDIS_CO_LINK_SPEED from ndis.h to ntddndis.h (where they should belong). - typedef NDIS_STATUS for ntddndis.h - Group some related definitions in ndis.h - Some _ANONYMOUS_* -> __MINGW_EXTENSION conversions. - Guard some definitions against NDIS_LEGACY_DRIVER. - Add some missing definitions. - NDIS_MINIPORT_BLOCK : PVOID Signature; -> NDIS_OBJECT_HEADER Header; - Add missing xfilter.h inclusion. - Add some missing function declarations. - Convert some function declarations into macros. - Guard some definitions against NDIS_LEGACY_MINIPORT. svn path=/trunk/; revision=48229 --- reactos/include/ddk/ndis.h | 1264 ++++++++++++++++--------------- reactos/include/psdk/ntddndis.h | 75 ++ 2 files changed, 725 insertions(+), 614 deletions(-) diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index afc55c1c64f..1edfaace36c 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -3,7 +3,7 @@ * * Network Device Interface Specification definitions * - * This file is part of the w32api package. + * This file is part of the ReactOS DDK package. * * Contributors: * Created by Casper S. Hornstrup @@ -323,6 +323,8 @@ typedef struct _X_FILTER FDDI_FILTER, *PFDDI_FILTER; typedef struct _X_FILTER TR_FILTER, *PTR_FILTER; typedef struct _X_FILTER NULL_FILTER, *PNULL_FILTER; +typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK, *PNDIS_MINIPORT_BLOCK; + typedef struct _REFERENCE { KSPIN_LOCK SpinLock; USHORT ReferenceCount; @@ -652,21 +654,6 @@ typedef CM_EISA_SLOT_INFORMATION NDIS_EISA_SLOT_INFORMATION, *PNDIS_EISA_SLOT_IN typedef CM_EISA_FUNCTION_INFORMATION NDIS_EISA_FUNCTION_INFORMATION, *PNDIS_EISA_FUNCTION_INFORMATION; typedef CM_PARTIAL_RESOURCE_LIST NDIS_RESOURCE_LIST, *PNDIS_RESOURCE_LIST; -/* Hardware status codes (OID_GEN_HARDWARE_STATUS) */ -typedef enum _NDIS_HARDWARE_STATUS { - NdisHardwareStatusReady, - NdisHardwareStatusInitializing, - NdisHardwareStatusReset, - NdisHardwareStatusClosing, - NdisHardwareStatusNotReady -} NDIS_HARDWARE_STATUS, *PNDIS_HARDWARE_STATUS; - -/* OID_GEN_GET_TIME_CAPS */ -typedef struct _GEN_GET_TIME_CAPS { - ULONG Flags; - ULONG ClockPrecision; -} GEN_GET_TIME_CAPS, *PGEN_GET_TIME_CAPS; - /* Flag bits */ #define READABLE_LOCAL_CLOCK 0x00000001 #define CLOCK_NETWORK_DERIVED 0x00000002 @@ -675,11 +662,6 @@ typedef struct _GEN_GET_TIME_CAPS { #define TIMED_SEND_CAPABLE 0x00000010 #define TIME_STAMP_CAPABLE 0x00000020 -/* OID_GEN_GET_NETCARD_TIME */ -typedef struct _GEN_GET_NETCARD_TIME { - ULONGLONG ReadTime; -} GEN_GET_NETCARD_TIME, *PGEN_GET_NETCARD_TIME; - /* NDIS packet filter bits (OID_GEN_CURRENT_PACKET_FILTER) */ #define NDIS_PACKET_TYPE_DIRECTED 0x00000001 #define NDIS_PACKET_TYPE_MULTICAST 0x00000002 @@ -709,23 +691,6 @@ typedef struct _GEN_GET_NETCARD_TIME { #define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040 #define NDIS_MAC_OPTION_RESERVED 0x80000000 -/* State of the LAN media (OID_GEN_MEDIA_CONNECT_STATUS) */ -typedef enum _NDIS_MEDIA_STATE { - NdisMediaStateConnected, - NdisMediaStateDisconnected -} NDIS_MEDIA_STATE, *PNDIS_MEDIA_STATE; - -/* OID_GEN_SUPPORTED_GUIDS */ -typedef struct _NDIS_GUID { - GUID Guid; - union { - NDIS_OID Oid; - NDIS_STATUS Status; - } u; - ULONG Size; - ULONG Flags; -} NDIS_GUID, *PNDIS_GUID; - #define NDIS_GUID_TO_OID 0x00000001 #define NDIS_GUID_TO_STATUS 0x00000002 #define NDIS_GUID_ANSI_STRING 0x00000004 @@ -823,15 +788,6 @@ typedef struct _NDIS_PACKET_OOB_DATA { } NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA; #endif -typedef struct _NDIS_PM_PACKET_PATTERN { - ULONG Priority; - ULONG Reserved; - ULONG MaskSize; - ULONG PatternOffset; - ULONG PatternSize; - ULONG PatternFlags; -} NDIS_PM_PACKET_PATTERN, *PNDIS_PM_PACKET_PATTERN; - /* Request types used by NdisRequest */ typedef enum _NDIS_REQUEST_TYPE { NdisRequestQueryInformation, @@ -1016,23 +972,19 @@ typedef struct _NDIS_WAN_LINE_UP { NDIS_STRING DeviceName; } NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP; -typedef VOID -(NTAPI *ADAPTER_SHUTDOWN_HANDLER)( - IN PVOID ShutdownContext); - typedef NTSTATUS (NTAPI *TDI_REGISTER_CALLBACK)( - IN PUNICODE_STRING DeviceName, - OUT HANDLE* TdiHandle); + IN PUNICODE_STRING DeviceName, + OUT HANDLE *TdiHandle); typedef NTSTATUS (NTAPI *TDI_PNP_HANDLER)( - IN PUNICODE_STRING UpperComponent, - IN PUNICODE_STRING LowerComponent, - IN PUNICODE_STRING BindList, - IN PVOID ReconfigBuffer, - IN UINT ReconfigBufferSize, - IN UINT Operation); + IN PUNICODE_STRING UpperComponent, + IN PUNICODE_STRING LowerComponent, + IN PUNICODE_STRING BindList, + IN PVOID ReconfigBuffer, + IN UINT ReconfigBufferSize, + IN UINT Operation); typedef struct _OID_LIST OID_LIST, *POID_LIST; @@ -1058,20 +1010,6 @@ typedef enum _NDIS_PNP_DEVICE_STATE { #define NDIS_DEVICE_DISABLE_WAKE_ON_MAGIC_PACKET 0x00000080 #define NDIS_DEVICE_DISABLE_WAKE_ON_PATTERN_MATCH 0x00000100 - -/* OID_GEN_NETWORK_LAYER_ADDRESSES */ -typedef struct _NETWORK_ADDRESS { - USHORT AddressLength; - USHORT AddressType; - UCHAR Address[1]; -} NETWORK_ADDRESS, *PNETWORK_ADDRESS; - -typedef struct _NETWORK_ADDRESS_LIST { - LONG AddressCount; - USHORT AddressType; - NETWORK_ADDRESS Address[1]; -} NETWORK_ADDRESS_LIST, *PNETWORK_ADDRESS_LIST; - /* Protocol types supported by NDIS */ #define NDIS_PROTOCOL_ID_DEFAULT 0x00 #define NDIS_PROTOCOL_ID_TCP_IP 0x02 @@ -1080,18 +1018,6 @@ typedef struct _NETWORK_ADDRESS_LIST { #define NDIS_PROTOCOL_ID_MAX 0x0F #define NDIS_PROTOCOL_ID_MASK 0x0F -/* OID_GEN_TRANSPORT_HEADER_OFFSET */ -typedef struct _TRANSPORT_HEADER_OFFSET { - USHORT ProtocolType; - USHORT HeaderOffset; -} TRANSPORT_HEADER_OFFSET, *PTRANSPORT_HEADER_OFFSET; - -/* OID_GEN_CO_LINK_SPEED / OID_GEN_CO_MINIMUM_LINK_SPEED */ -typedef struct _NDIS_CO_LINK_SPEED { - ULONG Outbound; - ULONG Inbound; -} NDIS_CO_LINK_SPEED, *PNDIS_CO_LINK_SPEED; - typedef ULONG NDIS_AF, *PNDIS_AF; #define CO_ADDRESS_FAMILY_Q2931 ((NDIS_AF)0x1) @@ -1161,20 +1087,39 @@ typedef struct _CO_SAP { UCHAR Sap[1]; } CO_SAP, *PCO_SAP; +#if NDIS_LEGACY_DRIVER typedef struct _NDIS_IPSEC_PACKET_INFO { - _ANONYMOUS_UNION union { + __MINGW_EXTENSION union { struct { - NDIS_HANDLE OffloadHandle; - NDIS_HANDLE NextOffloadHandle; + NDIS_HANDLE OffloadHandle; + NDIS_HANDLE NextOffloadHandle; } Transmit; struct { - ULONG SA_DELETE_REQ : 1; - ULONG CRYPTO_DONE : 1; - ULONG NEXT_CRYPTO_DONE : 1; - ULONG CryptoStatus; + ULONG SA_DELETE_REQ:1; + ULONG CRYPTO_DONE:1; + ULONG NEXT_CRYPTO_DONE:1; + ULONG CryptoStatus; } Receive; - } DUMMYUNIONNAME; + }; } NDIS_IPSEC_PACKET_INFO, *PNDIS_IPSEC_PACKET_INFO; +#endif + +#if (NDIS_SUPPORT_NDIS6 || NDIS60) +typedef struct _NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO { + __MINGW_EXTENSION union { + struct { + NDIS_HANDLE OffloadHandle; + } Transmit; + struct { + USHORT SaDeleteReq:1; + USHORT CryptoDone:1; + USHORT NextCryptoDone:1; + USHORT Pad:13; + USHORT CryptoStatus; + } Receive; + }; +} NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO, *PNDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO; +#endif /* NDIS_MAC_FRAGMENT.Errors constants */ #define WAN_ERROR_CRC 0x00000001 @@ -1236,6 +1181,127 @@ typedef struct _NDIS_PACKET_EXTENSION { PVOID NdisPacketInfo[MaxPerPacketInfo]; } NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION; +typedef enum _NDIS_TASK { + TcpIpChecksumNdisTask, + IpSecNdisTask, + TcpLargeSendNdisTask, + MaxNdisTask +} NDIS_TASK, *PNDIS_TASK; + +typedef enum _NDIS_ENCAPSULATION { + UNSPECIFIED_Encapsulation, + NULL_Encapsulation, + IEEE_802_3_Encapsulation, + IEEE_802_5_Encapsulation, + LLC_SNAP_ROUTED_Encapsulation, + LLC_SNAP_BRIDGED_Encapsulation +} NDIS_ENCAPSULATION; + +typedef struct _NDIS_ENCAPSULATION_FORMAT { + NDIS_ENCAPSULATION Encapsulation; + struct { + ULONG FixedHeaderSize:1; + ULONG Reserved:31; + } Flags; + ULONG EncapsulationHeaderSize; +} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT; + +typedef struct _NDIS_TASK_OFFLOAD_HEADER { + ULONG Version; + ULONG Size; + ULONG Reserved; + ULONG OffsetFirstTask; + NDIS_ENCAPSULATION_FORMAT EncapsulationFormat; +} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER; + +typedef struct _NDIS_TASK_OFFLOAD { + ULONG Version; + ULONG Size; + NDIS_TASK Task; + ULONG OffsetNextTask; + ULONG TaskBufferLength; + UCHAR TaskBuffer[1]; +} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD; + +typedef struct _NDIS_TASK_TCP_IP_CHECKSUM { + struct { + ULONG IpOptionsSupported:1; + ULONG TcpOptionsSupported:1; + ULONG TcpChecksum:1; + ULONG UdpChecksum:1; + ULONG IpChecksum:1; + } V4Transmit; + struct { + ULONG IpOptionsSupported:1; + ULONG TcpOptionsSupported:1; + ULONG TcpChecksum:1; + ULONG UdpChecksum:1; + ULONG IpChecksum:1; + } V4Receive; + struct { + ULONG IpOptionsSupported:1; + ULONG TcpOptionsSupported:1; + ULONG TcpChecksum:1; + ULONG UdpChecksum:1; + } V6Transmit; + struct { + ULONG IpOptionsSupported:1; + ULONG TcpOptionsSupported:1; + ULONG TcpChecksum:1; + ULONG UdpChecksum:1; + } V6Receive; +} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM; + +#define NDIS_TASK_TCP_LARGE_SEND_V0 0 + +typedef struct _NDIS_TASK_TCP_LARGE_SEND { + ULONG Version; + ULONG MaxOffLoadSize; + ULONG MinSegmentCount; + BOOLEAN TcpOptions; + BOOLEAN IpOptions; +} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND; + +typedef struct _NDIS_TASK_IPSEC { + struct { + ULONG AH_ESP_COMBINED; + ULONG TRANSPORT_TUNNEL_COMBINED; + ULONG V4_OPTIONS; + ULONG RESERVED; + } Supported; + struct { + ULONG MD5:1; + ULONG SHA_1:1; + ULONG Transport:1; + ULONG Tunnel:1; + ULONG Send:1; + ULONG Receive:1; + } V4AH; + struct { + ULONG DES:1; + ULONG RESERVED:1; + ULONG TRIPLE_DES:1; + ULONG NULL_ESP:1; + ULONG Transport:1; + ULONG Tunnel:1; + ULONG Send:1; + ULONG Receive:1; + } V4ESP; +} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC; + +#endif /* NDIS_LEGACY_DRIVER */ + +#define IPSEC_TPT_UDPESP_ENCAPTYPE_IKE 0x00000001 +#define IPSEC_TUN_UDPESP_ENCAPTYPE_IKE 0x00000002 +#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_IKE 0x00000004 +#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_IKE 0x00000008 +#define IPSEC_TPT_UDPESP_ENCAPTYPE_OTHER 0x00000010 +#define IPSEC_TUN_UDPESP_ENCAPTYPE_OTHER 0x00000020 +#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_OTHER 0x00000040 +#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_OTHER 0x00000080 + +#if NDIS_LEGACY_DRIVER + /* * PNDIS_PACKET * NDIS_GET_ORIGINAL_PACKET( @@ -1303,119 +1369,20 @@ typedef struct _NDIS_GENERIC_OBJECT { } NDIS_GENERIC_OBJECT, *PNDIS_GENERIC_OBJECT; #endif -typedef enum _NDIS_TASK { - TcpIpChecksumNdisTask, - IpSecNdisTask, - TcpLargeSendNdisTask, - MaxNdisTask -} NDIS_TASK, *PNDIS_TASK; - -typedef struct _NDIS_TASK_IPSEC { - struct { - ULONG AH_ESP_COMBINED; - ULONG TRANSPORT_TUNNEL_COMBINED; - ULONG V4_OPTIONS; - ULONG RESERVED; - } Supported; - - struct { - ULONG MD5 : 1; - ULONG SHA_1 : 1; - ULONG Transport : 1; - ULONG Tunnel : 1; - ULONG Send : 1; - ULONG Receive : 1; - } V4AH; - - struct { - ULONG DES : 1; - ULONG RESERVED : 1; - ULONG TRIPLE_DES : 1; - ULONG NULL_ESP : 1; - ULONG Transport : 1; - ULONG Tunnel : 1; - ULONG Send : 1; - ULONG Receive : 1; - } V4ESP; -} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC; - -typedef enum _NDIS_ENCAPSULATION { - UNSPECIFIED_Encapsulation, - NULL_Encapsulation, - IEEE_802_3_Encapsulation, - IEEE_802_5_Encapsulation, - LLC_SNAP_ROUTED_Encapsulation, - LLC_SNAP_BRIDGED_Encapsulation -} NDIS_ENCAPSULATION; - -typedef struct _NDIS_ENCAPSULATION_FORMAT { - NDIS_ENCAPSULATION Encapsulation; - struct { - ULONG FixedHeaderSize : 1; - ULONG Reserved : 31; - } Flags; - ULONG EncapsulationHeaderSize; -} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT; - -typedef struct _NDIS_TASK_OFFLOAD_HEADER { - ULONG Version; - ULONG Size; - ULONG Reserved; - ULONG OffsetFirstTask; - NDIS_ENCAPSULATION_FORMAT EncapsulationFormat; -} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER; - -typedef struct _NDIS_TASK_OFFLOAD { - ULONG Version; - ULONG Size; - NDIS_TASK Task; - ULONG OffsetNextTask; - ULONG TaskBufferLength; - UCHAR TaskBuffer[1]; -} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD; - /* NDIS_TASK_OFFLOAD_HEADER.Version constants */ #define NDIS_TASK_OFFLOAD_VERSION 1 -typedef struct _NDIS_TASK_TCP_IP_CHECKSUM { - struct { - ULONG IpOptionsSupported:1; - ULONG TcpOptionsSupported:1; - ULONG TcpChecksum:1; - ULONG UdpChecksum:1; - ULONG IpChecksum:1; - } V4Transmit; +#define MAX_HASHES 4 +#define TRUNCATED_HASH_LEN 12 - struct { - ULONG IpOptionsSupported : 1; - ULONG TcpOptionsSupported : 1; - ULONG TcpChecksum : 1; - ULONG UdpChecksum : 1; - ULONG IpChecksum : 1; - } V4Receive; - - struct { - ULONG IpOptionsSupported : 1; - ULONG TcpOptionsSupported : 1; - ULONG TcpChecksum : 1; - ULONG UdpChecksum : 1; - } V6Transmit; - - struct { - ULONG IpOptionsSupported : 1; - ULONG TcpOptionsSupported : 1; - ULONG TcpChecksum : 1; - ULONG UdpChecksum : 1; - } V6Receive; -} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM; - -typedef struct _NDIS_TASK_TCP_LARGE_SEND { - ULONG Version; - ULONG MaxOffLoadSize; - ULONG MinSegmentCount; - BOOLEAN TcpOptions; - BOOLEAN IpOptions; -} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND; +#define CRYPTO_SUCCESS 0 +#define CRYPTO_GENERIC_ERROR 1 +#define CRYPTO_TRANSPORT_AH_AUTH_FAILED 2 +#define CRYPTO_TRANSPORT_ESP_AUTH_FAILED 3 +#define CRYPTO_TUNNEL_AH_AUTH_FAILED 4 +#define CRYPTO_TUNNEL_ESP_AUTH_FAILED 5 +#define CRYPTO_INVALID_PACKET_SYNTAX 6 +#define CRYPTO_INVALID_PROTOCOL 7 typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO { __MINGW_EXTENSION union { @@ -1555,20 +1522,44 @@ typedef NDIS_STATUS (NTAPI *CO_DELETE_VC_HANDLER)( IN NDIS_HANDLE ProtocolVcContext); +#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID)) + +/* Prototypes for NDIS 5.0 protocol characteristics */ + typedef VOID -(NTAPI *CO_REQUEST_COMPLETE_HANDLER)( - IN NDIS_STATUS Status, - IN NDIS_HANDLE ProtocolAfContext OPTIONAL, - IN NDIS_HANDLE ProtocolVcContext OPTIONAL, - IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, - IN PNDIS_REQUEST NdisRequest); +(NTAPI *CO_SEND_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolVcContext, + IN PNDIS_PACKET Packet); + +typedef VOID +(NTAPI *CO_STATUS_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE ProtocolVcContext OPTIONAL, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize); + +typedef UINT +(NTAPI *CO_RECEIVE_PACKET_HANDLER)( + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE ProtocolVcContext, + IN PNDIS_PACKET Packet); typedef NDIS_STATUS (NTAPI *CO_REQUEST_HANDLER)( - IN NDIS_HANDLE ProtocolAfContext, - IN NDIS_HANDLE ProtocolVcContext OPTIONAL, - IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); + IN NDIS_HANDLE ProtocolAfContext, + IN NDIS_HANDLE ProtocolVcContext OPTIONAL, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); + +typedef VOID +(NTAPI *CO_REQUEST_COMPLETE_HANDLER)( + IN NDIS_STATUS Status, + IN NDIS_HANDLE ProtocolAfContext OPTIONAL, + IN NDIS_HANDLE ProtocolVcContext OPTIONAL, + IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, + IN PNDIS_REQUEST NdisRequest); typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS { UCHAR MajorVersion; @@ -1712,81 +1703,79 @@ typedef struct _NDIS_CLIENT_CHARACTERISTICS { typedef VOID (NTAPI *OPEN_ADAPTER_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS Status, - IN NDIS_STATUS OpenErrorStatus); + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenErrorStatus); typedef VOID (NTAPI *CLOSE_ADAPTER_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS Status); + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status); typedef VOID (NTAPI *RESET_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS Status); + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS Status); typedef VOID (NTAPI *REQUEST_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_REQUEST NdisRequest, - IN NDIS_STATUS Status); + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_REQUEST NdisRequest, + IN NDIS_STATUS Status); typedef VOID (NTAPI *STATUS_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer, - IN UINT StatusBufferSize); + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize); typedef VOID (NTAPI *STATUS_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext); + IN NDIS_HANDLE ProtocolBindingContext); typedef VOID (NTAPI *SEND_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status); + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status); typedef VOID (NTAPI *WAN_SEND_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_WAN_PACKET Packet, - IN NDIS_STATUS Status); + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_WAN_PACKET Packet, + IN NDIS_STATUS Status); typedef VOID (NTAPI *TRANSFER_DATA_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status, - IN UINT BytesTransferred); + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred); typedef VOID (NTAPI *WAN_TRANSFER_DATA_COMPLETE_HANDLER)( - VOID); - + VOID); typedef NDIS_STATUS (NTAPI *RECEIVE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE MacReceiveContext, - IN PVOID HeaderBuffer, - IN UINT HeaderBufferSize, - IN PVOID LookAheadBuffer, - IN UINT LookaheadBufferSize, - IN UINT PacketSize); + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE MacReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookAheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize); typedef NDIS_STATUS (NTAPI *WAN_RECEIVE_HANDLER)( - IN NDIS_HANDLE NdisLinkHandle, - IN PUCHAR Packet, - IN ULONG PacketSize); + IN NDIS_HANDLE NdisLinkHandle, + IN PUCHAR Packet, + IN ULONG PacketSize); typedef VOID (NTAPI *RECEIVE_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext); - + IN NDIS_HANDLE ProtocolBindingContext); /* Protocol characteristics for NDIS 3.0 protocols */ @@ -1828,221 +1817,213 @@ typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS { typedef INT (NTAPI *RECEIVE_PACKET_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_PACKET Packet); + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_PACKET Packet); typedef VOID (NTAPI *BIND_HANDLER)( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE BindContext, - IN PNDIS_STRING DeviceName, - IN PVOID SystemSpecific1, - IN PVOID SystemSpecific2); + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE BindContext, + IN PNDIS_STRING DeviceName, + IN PVOID SystemSpecific1, + IN PVOID SystemSpecific2); typedef VOID (NTAPI *UNBIND_HANDLER)( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE UnbindContext); + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ProtocolBindingContext, + IN NDIS_HANDLE UnbindContext); typedef NDIS_STATUS (NTAPI *PNP_EVENT_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNET_PNP_EVENT NetPnPEvent); + IN NDIS_HANDLE ProtocolBindingContext, + IN PNET_PNP_EVENT NetPnPEvent); typedef VOID (NTAPI *UNLOAD_PROTOCOL_HANDLER)( VOID); - /* Protocol characteristics for NDIS 4.0 protocols */ -#ifdef __cplusplus - -#define NDIS40_PROTOCOL_CHARACTERISTICS_S \ - NDIS30_PROTOCOL_CHARACTERISTICS Ndis30Chars; \ - RECEIVE_PACKET_HANDLER ReceivePacketHandler; \ - BIND_HANDLER BindAdapterHandler; \ - UNBIND_HANDLER UnbindAdapterHandler; \ - PNP_EVENT_HANDLER PnPEventHandler; \ - UNLOAD_PROTOCOL_HANDLER UnloadHandler; - -#else /* !__cplusplus */ - -#define NDIS40_PROTOCOL_CHARACTERISTICS_S \ - NDIS30_PROTOCOL_CHARACTERISTICS_S \ - RECEIVE_PACKET_HANDLER ReceivePacketHandler; \ - BIND_HANDLER BindAdapterHandler; \ - UNBIND_HANDLER UnbindAdapterHandler; \ - PNP_EVENT_HANDLER PnPEventHandler; \ - UNLOAD_PROTOCOL_HANDLER UnloadHandler; - -#endif /* __cplusplus */ - typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS { - NDIS40_PROTOCOL_CHARACTERISTICS_S -} NDIS40_PROTOCOL_CHARACTERISTICS, *PNDIS40_PROTOCOL_CHARACTERISTICS; - -/* Prototypes for NDIS 5.0 protocol characteristics */ + UCHAR MajorNdisVersion; + UCHAR MinorNdisVersion; + USHORT Filler; + __MINGW_EXTENSION union { + UINT Reserved; + UINT Flags; + }; + OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler; + CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler; + __MINGW_EXTENSION union { + SEND_COMPLETE_HANDLER SendCompleteHandler; + WAN_SEND_COMPLETE_HANDLER WanSendCompleteHandler; + }; + __MINGW_EXTENSION union { + TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; + WAN_TRANSFER_DATA_COMPLETE_HANDLER WanTransferDataCompleteHandler; + }; + RESET_COMPLETE_HANDLER ResetCompleteHandler; + REQUEST_COMPLETE_HANDLER RequestCompleteHandler; + __MINGW_EXTENSION union { + RECEIVE_HANDLER ReceiveHandler; + WAN_RECEIVE_HANDLER WanReceiveHandler; + }; + RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; + STATUS_HANDLER StatusHandler; + STATUS_COMPLETE_HANDLER StatusCompleteHandler; + NDIS_STRING Name; + RECEIVE_PACKET_HANDLER ReceivePacketHandler; + BIND_HANDLER BindAdapterHandler; + UNBIND_HANDLER UnbindAdapterHandler; + PNP_EVENT_HANDLER PnPEventHandler; + UNLOAD_PROTOCOL_HANDLER UnloadHandler; +} NDIS40_PROTOCOL_CHARACTERISTICS; typedef VOID -(NTAPI *CO_SEND_COMPLETE_HANDLER)( - IN NDIS_STATUS Status, - IN NDIS_HANDLE ProtocolVcContext, - IN PNDIS_PACKET Packet); +(NTAPI PROTCOL_CO_AF_REGISTER_NOTIFY)( + IN NDIS_HANDLE ProtocolBindingContext, + IN PCO_ADDRESS_FAMILY AddressFamily); +typedef PROTCOL_CO_AF_REGISTER_NOTIFY *CO_AF_REGISTER_NOTIFY_HANDLER; -typedef VOID -(NTAPI *CO_STATUS_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE ProtocolVcContext OPTIONAL, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer, - IN UINT StatusBufferSize); - -typedef UINT -(NTAPI *CO_RECEIVE_PACKET_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE ProtocolVcContext, - IN PNDIS_PACKET Packet); - -typedef VOID -(NTAPI *CO_AF_REGISTER_NOTIFY_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PCO_ADDRESS_FAMILY AddressFamily); - -#ifdef __cplusplus \ - -#define NDIS50_PROTOCOL_CHARACTERISTICS_S \ - NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars; \ - PVOID ReservedHandlers[4]; \ - CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; \ - CO_STATUS_HANDLER CoStatusHandler; \ - CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; \ - CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; - -#else /* !__cplusplus */ - -#define NDIS50_PROTOCOL_CHARACTERISTICS_S \ - NDIS40_PROTOCOL_CHARACTERISTICS_S \ - PVOID ReservedHandlers[4]; \ - CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; \ - CO_STATUS_HANDLER CoStatusHandler; \ - CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; \ - CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; - -#endif /* !__cplusplus */ +#if NDIS_LEGACY_PROTOCOL typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS { - NDIS50_PROTOCOL_CHARACTERISTICS_S -} NDIS50_PROTOCOL_CHARACTERISTICS, *PNDIS50_PROTOCOL_CHARACTERISTICS; +#ifdef __cplusplus + NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars; +#else + NDIS40_PROTOCOL_CHARACTERISTICS; +#endif + PVOID ReservedHandlers[4]; + CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler; + CO_STATUS_HANDLER CoStatusHandler; + CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler; + CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler; +} NDIS50_PROTOCOL_CHARACTERISTICS; -#if defined(NDIS50) || defined(NDIS51) -typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { - NDIS50_PROTOCOL_CHARACTERISTICS_S -} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; -#elif defined(NDIS40) -typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { - NDIS40_PROTOCOL_CHARACTERISTICS_S -} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; -#else /* NDIS30 */ -typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { - NDIS30_PROTOCOL_CHARACTERISTICS_S -} NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; +#if (defined(NDIS50) || defined(NDIS51)) +typedef NDIS50_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS; +#else +typedef NDIS40_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS; #endif -#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID)) +typedef NDIS_PROTOCOL_CHARACTERISTICS *PNDIS_PROTOCOL_CHARACTERISTICS; + +#endif /* NDIS_LEGACY_PROTOCOL */ /* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */ typedef BOOLEAN (NTAPI *W_CHECK_FOR_HANG_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + IN NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_DISABLE_INTERRUPT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + IN NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_ENABLE_INTERRUPT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + IN NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_HALT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + IN NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_HANDLE_INTERRUPT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + IN NDIS_HANDLE MiniportAdapterContext); typedef NDIS_STATUS (NTAPI *W_INITIALIZE_HANDLER)( - OUT PNDIS_STATUS OpenErrorStatus, - OUT PUINT SelectedMediumIndex, - IN PNDIS_MEDIUM MediumArray, - IN UINT MediumArraySize, - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE WrapperConfigurationContext); + OUT PNDIS_STATUS OpenErrorStatus, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE WrapperConfigurationContext); typedef VOID (NTAPI *W_ISR_HANDLER)( - OUT PBOOLEAN InterruptRecognized, - OUT PBOOLEAN QueueMiniportHandleInterrupt, - IN NDIS_HANDLE MiniportAdapterContext); + OUT PBOOLEAN InterruptRecognized, + OUT PBOOLEAN QueueMiniportHandleInterrupt, + IN NDIS_HANDLE MiniportAdapterContext); typedef NDIS_STATUS (NTAPI *W_QUERY_INFORMATION_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_OID Oid, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength, - OUT PULONG BytesWritten, - OUT PULONG BytesNeeded); + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded); typedef NDIS_STATUS (NTAPI *W_RECONFIGURE_HANDLER)( - OUT PNDIS_STATUS OpenErrorStatus, - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE WrapperConfigurationContext); + OUT PNDIS_STATUS OpenErrorStatus, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE WrapperConfigurationContext); typedef NDIS_STATUS (NTAPI *W_RESET_HANDLER)( - OUT PBOOLEAN AddressingReset, - IN NDIS_HANDLE MiniportAdapterContext); + OUT PBOOLEAN AddressingReset, + IN NDIS_HANDLE MiniportAdapterContext); typedef NDIS_STATUS (NTAPI *W_SEND_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PNDIS_PACKET Packet, - IN UINT Flags); + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags); typedef NDIS_STATUS (NTAPI *WM_SEND_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE NdisLinkHandle, - IN PNDIS_WAN_PACKET Packet); + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE NdisLinkHandle, + IN PNDIS_WAN_PACKET Packet); typedef NDIS_STATUS (NTAPI *W_SET_INFORMATION_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_OID Oid, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength, - OUT PULONG BytesRead, - OUT PULONG BytesNeeded); + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded); typedef NDIS_STATUS (NTAPI *W_TRANSFER_DATA_HANDLER)( - OUT PNDIS_PACKET Packet, - OUT PUINT BytesTransferred, - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE MiniportReceiveContext, - IN UINT ByteOffset, - IN UINT BytesToTransfer); + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer); typedef NDIS_STATUS (NTAPI *WM_TRANSFER_DATA_HANDLER)( VOID); +typedef VOID +(NTAPI *ADAPTER_SHUTDOWN_HANDLER)( + IN PVOID ShutdownContext); + +typedef VOID +(NTAPI *W_RETURN_PACKET_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet); + +typedef VOID +(NTAPI *W_SEND_PACKETS_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); + +typedef VOID +(NTAPI *W_ALLOCATE_COMPLETE_HANDLER)( + IN NDIS_HANDLE MiniportAdapterContext, + IN PVOID VirtualAddress, + IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG Length, + IN PVOID Context); /* NDIS structures available only to miniport drivers */ @@ -2068,28 +2049,6 @@ typedef struct _NDIS30_MINIPORT_CHARACTERISTICS { NDIS30_MINIPORT_CHARACTERISTICS_S } NDIS30_MINIPORT_CHARACTERISTICS, *PSNDIS30_MINIPORT_CHARACTERISTICS; - -/* Extensions for NDIS 4.0 miniports */ - -typedef VOID -(NTAPI *W_SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); - -typedef VOID -(NTAPI *W_RETURN_PACKET_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PNDIS_PACKET Packet); - -typedef VOID -(NTAPI *W_ALLOCATE_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PVOID VirtualAddress, - IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG Length, - IN PVOID Context); - #ifdef __cplusplus #define NDIS40_MINIPORT_CHARACTERISTICS_S \ @@ -2112,39 +2071,42 @@ typedef struct _NDIS40_MINIPORT_CHARACTERISTICS { NDIS40_MINIPORT_CHARACTERISTICS_S } NDIS40_MINIPORT_CHARACTERISTICS, *PNDIS40_MINIPORT_CHARACTERISTICS; - /* Extensions for NDIS 5.0 miniports */ typedef NDIS_STATUS -(NTAPI *W_CO_CREATE_VC_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE NdisVcHandle, - OUT PNDIS_HANDLE MiniportVcContext); +(NTAPI MINIPORT_CO_CREATE_VC)( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE NdisVcHandle, + OUT PNDIS_HANDLE MiniportVcContext); +typedef MINIPORT_CO_CREATE_VC *W_CO_CREATE_VC_HANDLER; typedef NDIS_STATUS -(NTAPI *W_CO_DELETE_VC_HANDLER)( - IN NDIS_HANDLE MiniportVcContext); +(NTAPI MINIPORT_CO_DELETE_VC)( + IN NDIS_HANDLE MiniportVcContext); +typedef MINIPORT_CO_DELETE_VC *W_CO_DELETE_VC_HANDLER; typedef NDIS_STATUS -(NTAPI *W_CO_ACTIVATE_VC_HANDLER)( - IN NDIS_HANDLE MiniportVcContext, - IN OUT PCO_CALL_PARAMETERS CallParameters); +(NTAPI MINIPORT_CO_ACTIVATE_VC)( + IN NDIS_HANDLE MiniportVcContext, + IN OUT PCO_CALL_PARAMETERS CallParameters); +typedef MINIPORT_CO_ACTIVATE_VC *W_CO_ACTIVATE_VC_HANDLER; typedef NDIS_STATUS -(NTAPI *W_CO_DEACTIVATE_VC_HANDLER)( - IN NDIS_HANDLE MiniportVcContext); +(NTAPI MINIPORT_CO_DEACTIVATE_VC)( + IN NDIS_HANDLE MiniportVcContext); +typedef MINIPORT_CO_DEACTIVATE_VC *W_CO_DEACTIVATE_VC_HANDLER; typedef VOID (NTAPI *W_CO_SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportVcContext, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + IN NDIS_HANDLE MiniportVcContext, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); typedef NDIS_STATUS (NTAPI *W_CO_REQUEST_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE MiniportVcContext OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportVcContext OPTIONAL, + IN OUT PNDIS_REQUEST NdisRequest); #ifdef __cplusplus @@ -2174,7 +2136,6 @@ typedef struct _NDIS50_MINIPORT_CHARACTERISTICS { NDIS50_MINIPORT_CHARACTERISTICS_S } NDIS50_MINIPORT_CHARACTERISTICS, *PSNDIS50_MINIPORT_CHARACTERISTICS; - /* Extensions for NDIS 5.1 miniports */ typedef VOID @@ -2212,7 +2173,7 @@ typedef VOID #endif typedef struct _NDIS51_MINIPORT_CHARACTERISTICS { - NDIS51_MINIPORT_CHARACTERISTICS_S + NDIS51_MINIPORT_CHARACTERISTICS_S } NDIS51_MINIPORT_CHARACTERISTICS, *PSNDIS51_MINIPORT_CHARACTERISTICS; #if defined(NDIS51_MINIPORT) @@ -2233,6 +2194,21 @@ typedef struct _NDIS_MINIPORT_CHARACTERISTICS { } NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; #endif +typedef struct _NDIS_MINIPORT_INTERRUPT { + PKINTERRUPT InterruptObject; + KSPIN_LOCK DpcCountLock; + PVOID Reserved; + W_ISR_HANDLER MiniportIsr; + W_HANDLE_INTERRUPT_HANDLER MiniportDpc; + KDPC InterruptDpc; + PNDIS_MINIPORT_BLOCK Miniport; + UCHAR DpcCount; + BOOLEAN Filler1; + KEVENT DpcsCompletedEvent; + BOOLEAN SharedInterrupt; + BOOLEAN IsrRequested; +} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT; + /* Structures available only to full MAC drivers */ typedef BOOLEAN @@ -2250,7 +2226,6 @@ typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, *PNDIS_WRAPPER_HANDLE; typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK; typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK; typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK; -typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK,*PNDIS_MINIPORT_BLOCK; typedef struct _NDIS_OFFLOAD NDIS_OFFLOAD, *PNDIS_OFFLOAD; typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST; typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER; @@ -2258,21 +2233,6 @@ typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER; typedef USHORT NET_FRAME_TYPE, *PNET_FRAME_TYPE; #endif -typedef struct _NDIS_MINIPORT_INTERRUPT { - PKINTERRUPT InterruptObject; - KSPIN_LOCK DpcCountLock; - PVOID MiniportIdField; - W_ISR_HANDLER MiniportIsr; - W_HANDLE_INTERRUPT_HANDLER MiniportDpc; - KDPC InterruptDpc; - PNDIS_MINIPORT_BLOCK Miniport; - UCHAR DpcCount; - BOOLEAN Filler1; - KEVENT DpcsCompletedEvent; - BOOLEAN SharedInterrupt; - BOOLEAN IsrRequested; -} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT; - typedef struct _NDIS_MINIPORT_TIMER { KTIMER Timer; KDPC Dpc; @@ -2508,9 +2468,8 @@ typedef struct _FILTERDBS { FILTERDBS_S } FILTERDBS, *PFILTERDBS; - struct _NDIS_MINIPORT_BLOCK { - PVOID Signature; + NDIS_OBJECT_HEADER Header; PNDIS_MINIPORT_BLOCK NextMiniport; PNDIS_M_DRIVER_BLOCK DriverHandle; NDIS_HANDLE MiniportAdapterContext; @@ -2734,9 +2693,9 @@ typedef NDIS_STATUS #if defined(NDIS_WRAPPER) #define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S \ - ULONG Flags; \ - ULONG References; \ - KSPIN_LOCK SpinLock; \ + ULONG Flags; \ + ULONG References; \ + KSPIN_LOCK SpinLock; \ NDIS_HANDLE FilterHandle; \ ULONG ProtocolOptions; \ USHORT CurrentLookahead; \ @@ -2804,6 +2763,10 @@ struct _NDIS_OPEN_BLOCK #endif }; +#include + +#define NDIS_M_MAX_LOOKAHEAD 526 + NDISAPI VOID NTAPI @@ -3270,13 +3233,6 @@ NdisCopyBuffer( } #endif -NDISAPI -VOID -NTAPI -NdisReturnPackets( - IN PNDIS_PACKET *PacketsToReturn, - IN UINT NumberOfPackets); - /* NDISAPI VOID @@ -3293,17 +3249,25 @@ NdisAdjustBufferLength( (((_Mdl)->ByteCount) = (_Length)) #endif +/* NDISAPI ULONG NTAPI NdisBufferLength( - IN PNDIS_BUFFER Buffer); + IN PNDIS_BUFFER Buffer); +*/ +#define NdisBufferLength MmGetMdlByteCount +/* NDISAPI PVOID NTAPI NdisBufferVirtualAddress( - IN PNDIS_BUFFER Buffer); + IN PNDIS_BUFFER Buffer); +*/ +#define NdisBufferVirtualAddress MmGetSystemAddressForMdl + +#define NdisBufferVirtualAddressSafe MmGetSystemAddressForMdlSafe NDISAPI ULONG @@ -3619,14 +3583,6 @@ NdisQueryPacket( #endif /* NDIS_LEGACY_DRIVER */ -/* - * VOID - * NdisSetSendFlags( - * IN PNDIS_PACKET Packet, - * IN UINT Flags); - */ -#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags) - /* Memory management routines */ /* @@ -4500,14 +4456,6 @@ NdisAllocateMemoryWithTag( IN UINT Length, IN ULONG Tag); -NDISAPI -VOID -NTAPI -NdisCompletePnPEvent( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNET_PNP_EVENT NetPnPEvent); - NDISAPI VOID NTAPI @@ -4516,20 +4464,6 @@ NdisGetCurrentProcessorCounts( OUT PULONG pKernelAndUser, OUT PULONG pIndex); -NDISAPI -VOID -NTAPI -NdisGetDriverHandle( - IN PNDIS_HANDLE NdisBindingHandle, - OUT PNDIS_HANDLE NdisDriverHandle); - -NDISAPI -PNDIS_PACKET -NTAPI -NdisGetReceivedPacket( - IN PNDIS_HANDLE NdisBindingHandle, - IN PNDIS_HANDLE MacContext); - #if NDIS_LEGACY_DRIVER NDISAPI VOID @@ -4674,20 +4608,27 @@ NDISAPI NDIS_STATUS NTAPI NdisQueryAdapterInstanceName( - OUT PNDIS_STRING AdapterInstanceName, - IN NDIS_HANDLE NdisBindingHandle); + OUT PNDIS_STRING AdapterInstanceName, + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +NDIS_STATUS +NTAPI +NdisQueryBindInstanceName( + OUT PNDIS_STRING pAdapterInstanceName, + IN NDIS_HANDLE BindingContext); NDISAPI NDIS_STATUS NTAPI NdisWriteEventLogEntry( - IN PVOID LogHandle, - IN NDIS_STATUS EventCode, - IN ULONG UniqueEventValue, - IN USHORT NumStrings, - IN PVOID StringsList OPTIONAL, - IN ULONG DataSize, - IN PVOID Data OPTIONAL); + IN PVOID LogHandle, + IN NDIS_STATUS EventCode, + IN ULONG UniqueEventValue, + IN USHORT NumStrings, + IN PVOID StringsList OPTIONAL, + IN ULONG DataSize, + IN PVOID Data OPTIONAL); /* Connectionless services */ @@ -5252,11 +5193,50 @@ NTAPI NdisMDeregisterAdapterShutdownHandler( IN NDIS_HANDLE MiniportHandle); +#if NDIS_LEGACY_MINIPORT + NDISAPI VOID NTAPI NdisMDeregisterInterrupt( - IN PNDIS_MINIPORT_INTERRUPT Interrupt); + IN PNDIS_MINIPORT_INTERRUPT Interrupt); + +NDISAPI +VOID +NTAPI +NdisMRegisterAdapterShutdownHandler( + IN NDIS_HANDLE MiniportHandle, + IN PVOID ShutdownContext, + IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMRegisterInterrupt( + OUT PNDIS_MINIPORT_INTERRUPT Interrupt, + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InterruptVector, + IN UINT InterruptLevel, + IN BOOLEAN RequestIsr, + IN BOOLEAN SharedInterrupt, + IN NDIS_INTERRUPT_MODE InterruptMode); + +NDISAPI +NDIS_STATUS +NTAPI +NdisMRegisterMiniport( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, + IN UINT CharacteristicsLength); + +NDISAPI +BOOLEAN +NTAPI +NdisMSynchronizeWithInterrupt( + IN PNDIS_MINIPORT_INTERRUPT Interrupt, + IN PVOID SynchronizeFunction, + IN PVOID SynchronizeContext); +#endif /* NDIS_LEGACY_MINIPORT */ NDISAPI VOID @@ -5437,26 +5417,6 @@ NdisMMapIoSpace( #define NdisMQueryInformationComplete(MiniportAdapterHandle, Status) \ (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->QueryCompleteHandler)(MiniportAdapterHandle, Status) -NDISAPI -VOID -NTAPI -NdisMRegisterAdapterShutdownHandler( - IN NDIS_HANDLE MiniportHandle, - IN PVOID ShutdownContext, - IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler); - -NDISAPI -NDIS_STATUS -NTAPI -NdisMRegisterInterrupt( - OUT PNDIS_MINIPORT_INTERRUPT Interrupt, - IN NDIS_HANDLE MiniportAdapterHandle, - IN UINT InterruptVector, - IN UINT InterruptLevel, - IN BOOLEAN RequestIsr, - IN BOOLEAN SharedInterrupt, - IN NDIS_INTERRUPT_MODE InterruptMode); - NDISAPI NDIS_STATUS NTAPI @@ -5466,14 +5426,6 @@ NdisMRegisterIoPortRange( IN UINT InitialPort, IN UINT NumberOfPorts); -NDISAPI -NDIS_STATUS -NTAPI -NdisMRegisterMiniport( - IN NDIS_HANDLE NdisWrapperHandle, - IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, - IN UINT CharacteristicsLength); - NDISAPI VOID NTAPI @@ -5612,14 +5564,6 @@ NTAPI NdisMSleep( IN ULONG MicrosecondsToSleep); -NDISAPI -BOOLEAN -NTAPI -NdisMSynchronizeWithInterrupt( - IN PNDIS_MINIPORT_INTERRUPT Interrupt, - IN PVOID SynchronizeFunction, - IN PVOID SynchronizeContext); - /* * VOID * NdisMTrIndicateReceive( @@ -5743,16 +5687,6 @@ NdisIMDeInitializeDeviceInstance( #define NdisIMInitializeDeviceInstance(DriverHandle, DeviceInstance) \ NdisIMInitializeDeviceInstanceEx(DriverHandle, DeviceInstance, NULL) -NDISAPI -NDIS_STATUS -NTAPI -NdisIMRegisterLayeredMiniport( - IN NDIS_HANDLE NdisWrapperHandle, - IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, - IN UINT CharacteristicsLength, - OUT PNDIS_HANDLE DriverHandle); - - /* Functions obsoleted by NDIS 5.0 */ NDISAPI @@ -5785,110 +5719,212 @@ NdisUpcaseUnicodeString( /* Routines for NDIS protocol drivers */ -NDISAPI -VOID -NTAPI -NdisRequest( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNDIS_REQUEST NdisRequest); +#if NDIS_LEGACY_PROTOCOL NDISAPI -VOID +NDIS_STATUS NTAPI -NdisReset( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle); - -NDISAPI -VOID -NTAPI -NdisSend( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNDIS_PACKET Packet); - -NDISAPI -VOID -NTAPI -NdisSendPackets( - IN NDIS_HANDLE NdisBindingHandle, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); +NdisIMRegisterLayeredMiniport( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, + IN UINT CharacteristicsLength, + OUT PNDIS_HANDLE DriverHandle); NDISAPI VOID NTAPI NdisTransferData( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN NDIS_HANDLE MacReceiveContext, - IN UINT ByteOffset, - IN UINT BytesToTransfer, - IN OUT PNDIS_PACKET Packet, - OUT PUINT BytesTransferred); + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + IN OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred); NDISAPI VOID NTAPI -NdisCloseAdapter( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle); +NdisSend( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_PACKET Packet); NDISAPI VOID NTAPI -NdisCompleteBindAdapter( - IN NDIS_HANDLE BindAdapterContext, - IN NDIS_STATUS Status, - IN NDIS_STATUS OpenStatus); +NdisSendPackets( + IN NDIS_HANDLE NdisBindingHandle, + IN PPNDIS_PACKET PacketArray, + IN UINT NumberOfPackets); NDISAPI VOID NTAPI -NdisCompleteUnbindAdapter( - IN NDIS_HANDLE UnbindAdapterContext, - IN NDIS_STATUS Status); +NdisRequest( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_REQUEST NdisRequest); + +NDISAPI +VOID +NTAPI +NdisReset( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle); NDISAPI VOID NTAPI NdisDeregisterProtocol( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisProtocolHandle); + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisProtocolHandle); NDISAPI VOID NTAPI NdisOpenAdapter( - OUT PNDIS_STATUS Status, - OUT PNDIS_STATUS OpenErrorStatus, - OUT PNDIS_HANDLE NdisBindingHandle, - OUT PUINT SelectedMediumIndex, - IN PNDIS_MEDIUM MediumArray, - IN UINT MediumArraySize, - IN NDIS_HANDLE NdisProtocolHandle, - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_STRING AdapterName, - IN UINT OpenOptions, - IN PSTRING AddressingInformation); + OUT PNDIS_STATUS Status, + OUT PNDIS_STATUS OpenErrorStatus, + OUT PNDIS_HANDLE NdisBindingHandle, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE NdisProtocolHandle, + IN NDIS_HANDLE ProtocolBindingContext, + IN PNDIS_STRING AdapterName, + IN UINT OpenOptions, + IN PSTRING AddressingInformation OPTIONAL); + +NDISAPI +VOID +NTAPI +NdisCloseAdapter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle); + +NDISAPI +VOID +NTAPI +NdisCompleteBindAdapter( + IN NDIS_HANDLE BindAdapterContext, + IN NDIS_STATUS Status, + IN NDIS_STATUS OpenStatus); + +NDISAPI +VOID +NTAPI +NdisCompleteUnbindAdapter( + IN NDIS_HANDLE UnbindAdapterContext, + IN NDIS_STATUS Status); + +NDISAPI +VOID +NTAPI +NdisSetProtocolFilter( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN RECEIVE_HANDLER ReceiveHandler, + IN RECEIVE_PACKET_HANDLER ReceivePacketHandler, + IN NDIS_MEDIUM Medium, + IN UINT Offset, + IN UINT Size, + IN PUCHAR Pattern); + +NDISAPI +VOID +NTAPI +NdisGetDriverHandle( + IN PNDIS_HANDLE NdisBindingHandle, + OUT PNDIS_HANDLE NdisDriverHandle); NDISAPI VOID NTAPI NdisOpenProtocolConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING ProtocolSection); + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING ProtocolSection); + +NDISAPI +VOID +NTAPI +NdisCompletePnPEvent( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNET_PNP_EVENT NetPnPEvent); + +/* + * VOID + * NdisSetSendFlags( + * IN PNDIS_PACKET Packet, + * IN UINT Flags); + */ +#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags) + +#define NdisQuerySendFlags(_Packet,_Flags) *(_Flags) = (_Packet)->Private.Flags + +NDISAPI +VOID +NTAPI +NdisReturnPackets( + IN PNDIS_PACKET *PacketsToReturn, + IN UINT NumberOfPackets); + +NDISAPI +PNDIS_PACKET +NTAPI +NdisGetReceivedPacket( + IN PNDIS_HANDLE NdisBindingHandle, + IN PNDIS_HANDLE MacContext); + +NDISAPI +VOID +NTAPI +NdisCancelSendPackets( + IN NDIS_HANDLE NdisBindingHandle, + IN PVOID CancelId); + +NDISAPI +NDIS_STATUS +NTAPI +NdisQueryPendingIOCount( + IN PVOID NdisBindingHandle, + OUT PULONG IoCount); NDISAPI VOID NTAPI NdisRegisterProtocol( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE NdisProtocolHandle, - IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, - IN UINT CharacteristicsLength); + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE NdisProtocolHandle, + IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, + IN UINT CharacteristicsLength); + +#endif /* NDIS_LEGACY_PROTOCOL */ + +NDISAPI +UCHAR +NTAPI +NdisGeneratePartialCancelId(VOID); + +NDISAPI +VOID +NTAPI +NdisReEnumerateProtocolBindings( + IN NDIS_HANDLE NdisProtocolHandle); + +NDISAPI +VOID +NTAPI +NdisRegisterTdiCallBack( + IN TDI_REGISTER_CALLBACK RegisterCallback, + IN TDI_PNP_HANDLER PnPHandler); + +NDISAPI +VOID +NTAPI +NdisDeregisterTdiCallBack(VOID); /* Obsoleted in Windows XP */ diff --git a/reactos/include/psdk/ntddndis.h b/reactos/include/psdk/ntddndis.h index 721093969bc..f4278cc4909 100644 --- a/reactos/include/psdk/ntddndis.h +++ b/reactos/include/psdk/ntddndis.h @@ -300,6 +300,81 @@ typedef ULONG NDIS_OID, *PNDIS_OID; METHOD_OUT_DIRECT, \ FILE_ANY_ACCESS) +/* Hardware status codes (OID_GEN_HARDWARE_STATUS) */ +typedef enum _NDIS_HARDWARE_STATUS { + NdisHardwareStatusReady, + NdisHardwareStatusInitializing, + NdisHardwareStatusReset, + NdisHardwareStatusClosing, + NdisHardwareStatusNotReady +} NDIS_HARDWARE_STATUS, *PNDIS_HARDWARE_STATUS; + +/* OID_GEN_GET_TIME_CAPS */ +typedef struct _GEN_GET_TIME_CAPS { + ULONG Flags; + ULONG ClockPrecision; +} GEN_GET_TIME_CAPS, *PGEN_GET_TIME_CAPS; + +/* OID_GEN_GET_NETCARD_TIME */ +typedef struct _GEN_GET_NETCARD_TIME { + ULONGLONG ReadTime; +} GEN_GET_NETCARD_TIME, *PGEN_GET_NETCARD_TIME; + +/* State of the LAN media (OID_GEN_MEDIA_CONNECT_STATUS) */ +typedef enum _NDIS_MEDIA_STATE { + NdisMediaStateConnected, + NdisMediaStateDisconnected +} NDIS_MEDIA_STATE, *PNDIS_MEDIA_STATE; + +#ifndef __NDIS_H +typedef int NDIS_STATUS, *PNDIS_STATUS; +#endif + +/* OID_GEN_SUPPORTED_GUIDS */ +typedef struct _NDIS_GUID { + GUID Guid; + union { + NDIS_OID Oid; + NDIS_STATUS Status; + } u; + ULONG Size; + ULONG Flags; +} NDIS_GUID, *PNDIS_GUID; + +typedef struct _NDIS_PM_PACKET_PATTERN { + ULONG Priority; + ULONG Reserved; + ULONG MaskSize; + ULONG PatternOffset; + ULONG PatternSize; + ULONG PatternFlags; +} NDIS_PM_PACKET_PATTERN, *PNDIS_PM_PACKET_PATTERN; + +/* OID_GEN_NETWORK_LAYER_ADDRESSES */ +typedef struct _NETWORK_ADDRESS { + USHORT AddressLength; + USHORT AddressType; + UCHAR Address[1]; +} NETWORK_ADDRESS, *PNETWORK_ADDRESS; + +typedef struct _NETWORK_ADDRESS_LIST { + LONG AddressCount; + USHORT AddressType; + NETWORK_ADDRESS Address[1]; +} NETWORK_ADDRESS_LIST, *PNETWORK_ADDRESS_LIST; + +/* OID_GEN_TRANSPORT_HEADER_OFFSET */ +typedef struct _TRANSPORT_HEADER_OFFSET { + USHORT ProtocolType; + USHORT HeaderOffset; +} TRANSPORT_HEADER_OFFSET, *PTRANSPORT_HEADER_OFFSET; + +/* OID_GEN_CO_LINK_SPEED / OID_GEN_CO_MINIMUM_LINK_SPEED */ +typedef struct _NDIS_CO_LINK_SPEED { + ULONG Outbound; + ULONG Inbound; +} NDIS_CO_LINK_SPEED, *PNDIS_CO_LINK_SPEED; + #ifdef __cplusplus } #endif From 3bb2ea0d09b46ddadb0cc73eeec5381fb86ab923 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 24 Jul 2010 14:49:46 +0000 Subject: [PATCH 77/82] [KMIXER] - Remove memset and memcpy implementations from pin.c svn path=/trunk/; revision=48230 --- .../drivers/wdm/audio/filters/kmixer/pin.c | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/reactos/drivers/wdm/audio/filters/kmixer/pin.c b/reactos/drivers/wdm/audio/filters/kmixer/pin.c index f52a7557034..8d37b1548f9 100644 --- a/reactos/drivers/wdm/audio/filters/kmixer/pin.c +++ b/reactos/drivers/wdm/audio/filters/kmixer/pin.c @@ -731,30 +731,3 @@ void free(PVOID Block) { ExFreePool(Block); } - -void *memset( - void* dest, - int c, - size_t count) -{ - ULONG Index; - PUCHAR Block = (PUCHAR)dest; - - for(Index = 0; Index < count; Index++) - Block[Index] = c; - - return dest; -} - -void * memcpy( - void* dest, - const void* src, - size_t count) -{ - ULONG Index; - PUCHAR Src = (PUCHAR)src, Dest = (PUCHAR)dest; - - for(Index = 0; Index < count; Index++) - Dest[Index] = Src[Index]; - return dest; -} From 7ea7b76e51ae8b49e92fc3fc05d3962abf7f8a9a Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 24 Jul 2010 15:01:05 +0000 Subject: [PATCH 78/82] [NTOS]: Take over MmInitializeProcessAddressSpace, MmInitializeHandBuiltProcess, MmInitializeHandBuiltProcess2 into ARM3, and cleanup the code. [NTOS]: Prepare to take over MmCreateProcessAddressSpace. svn path=/trunk/; revision=48231 --- reactos/ntoskrnl/mm/ARM3/pfnlist.c | 4 +- reactos/ntoskrnl/mm/ARM3/procsup.c | 159 +++++++++++++++++++++++++++++ reactos/ntoskrnl/mm/i386/page.c | 22 +--- reactos/ntoskrnl/mm/procsup.c | 126 ----------------------- 4 files changed, 162 insertions(+), 149 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c index fb24d9fdbff..294f6560ceb 100644 --- a/reactos/ntoskrnl/mm/ARM3/pfnlist.c +++ b/reactos/ntoskrnl/mm/ARM3/pfnlist.c @@ -700,8 +700,8 @@ MiInitializePfn(IN PFN_NUMBER PageFrameIndex, /* Check if this PFN is part of a valid address space */ if (PointerPte->u.Hard.Valid == 1) { - /* FIXME: TODO */ - ASSERT(FALSE); + /* Only valid from MmCreateProcessAddressSpace path */ + ASSERT(PsGetCurrentProcess()->Vm.WorkingSetSize == 0); } /* Otherwise this is a fresh page -- set it up */ diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 00020a44338..b4fa2dede99 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -832,6 +832,165 @@ MmCreateTeb(IN PEPROCESS Process, return Status; } +NTSTATUS +NTAPI +MmInitializeProcessAddressSpace(IN PEPROCESS Process, + IN PEPROCESS ProcessClone OPTIONAL, + IN PVOID Section OPTIONAL, + IN OUT PULONG Flags, + IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL) +{ + NTSTATUS Status = STATUS_SUCCESS; + SIZE_T ViewSize = 0; + PVOID ImageBase = 0; + PROS_SECTION_OBJECT SectionObject = Section; + PMMPTE PointerPte; + KIRQL OldIrql; + PMMPDE PointerPde; + PFN_NUMBER PageFrameNumber; + UNICODE_STRING FileName; + PWCHAR Source; + PCHAR Destination; + USHORT Length = 0; + + /* We should have a PDE */ + ASSERT(Process->Pcb.DirectoryTableBase[0] != 0); + ASSERT(Process->PdeUpdateNeeded == FALSE); + + /* Attach to the process */ + KeAttachProcess(&Process->Pcb); + + /* The address space should now been in phase 1 or 0 */ + ASSERT(Process->AddressSpaceInitialized <= 1); + Process->AddressSpaceInitialized = 2; + + /* Initialize the Addresss Space lock */ + KeInitializeGuardedMutex(&Process->AddressCreationLock); + Process->Vm.WorkingSetExpansionLinks.Flink = NULL; + + /* Initialize AVL tree */ + ASSERT(Process->VadRoot.NumberGenericTableElements == 0); + Process->VadRoot.BalancedRoot.u1.Parent = &Process->VadRoot.BalancedRoot; + + /* Lock PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Setup the PFN for the PDE base of this process */ + PointerPte = MiAddressToPte(PDE_BASE); + PageFrameNumber = PFN_FROM_PTE(PointerPte); + //MiInitializePfn(PageFrameNumber, PointerPte, TRUE); + + /* Do the same for hyperspace */ + PointerPde = MiAddressToPde(HYPER_SPACE); + PageFrameNumber = PFN_FROM_PTE(PointerPde); + //MiInitializePfn(PageFrameNumber, PointerPde, TRUE); + + /* Release PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Lock the VAD, ARM3-owned ranges away */ + MiRosTakeOverPebTebRanges(Process); + + /* Check if there's a Section Object */ + if (SectionObject) + { + /* Determine the image file name and save it to EPROCESS */ + FileName = SectionObject->FileObject->FileName; + Source = (PWCHAR)((PCHAR)FileName.Buffer + FileName.Length); + if (FileName.Buffer) + { + /* Loop the file name*/ + while (Source > FileName.Buffer) + { + /* Make sure this isn't a backslash */ + if (*--Source == OBJ_NAME_PATH_SEPARATOR) + { + /* If so, stop it here */ + Source++; + break; + } + else + { + /* Otherwise, keep going */ + Length++; + } + } + } + + /* Copy the to the process and truncate it to 15 characters if necessary */ + Destination = Process->ImageFileName; + Length = min(Length, sizeof(Process->ImageFileName) - 1); + while (Length--) *Destination++ = (UCHAR)*Source++; + *Destination = ANSI_NULL; + + /* Check if caller wants an audit name */ + if (AuditName) + { + /* Setup the audit name */ + Status = SeInitializeProcessAuditName(SectionObject->FileObject, + FALSE, + AuditName); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + KeDetachProcess(); + return Status; + } + } + + /* Map the section */ + Status = MmMapViewOfSection(Section, + Process, + (PVOID*)&ImageBase, + 0, + 0, + NULL, + &ViewSize, + 0, + MEM_COMMIT, + PAGE_READWRITE); + + /* Save the pointer */ + Process->SectionBaseAddress = ImageBase; + } + + /* Be nice and detach */ + KeDetachProcess(); + + /* Return status to caller */ + return Status; +} + +NTSTATUS +NTAPI +MmInitializeHandBuiltProcess(IN PEPROCESS Process, + IN PULONG_PTR DirectoryTableBase) +{ + /* Share the directory base with the idle process */ + DirectoryTableBase[0] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[0]; + DirectoryTableBase[1] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[1]; + + /* Initialize the Addresss Space */ + KeInitializeGuardedMutex(&Process->AddressCreationLock); + KeInitializeSpinLock(&Process->HyperSpaceLock); + Process->Vm.WorkingSetExpansionLinks.Flink = NULL; + ASSERT(Process->VadRoot.NumberGenericTableElements == 0); + Process->VadRoot.BalancedRoot.u1.Parent = &Process->VadRoot.BalancedRoot; + + /* Done */ + Process->HasAddressSpace = TRUE;//?? + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmInitializeHandBuiltProcess2(IN PEPROCESS Process) +{ + /* Lock the VAD, ARM3-owned ranges away */ + MiRosTakeOverPebTebRanges(Process); + return STATUS_SUCCESS; +} + /* SYSTEM CALLS ***************************************************************/ NTSTATUS diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index a675924ad17..ac05ecc8713 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -122,7 +122,7 @@ Mmi386ReleaseMmInfo(PEPROCESS Process) ULONG i; DPRINT("Mmi386ReleaseMmInfo(Process %x)\n",Process); - + LdtDescriptor = (PUSHORT) &Process->Pcb.LdtDescriptor; LdtBase = LdtDescriptor[1] | ((LdtDescriptor[2] & 0xff) << 16) | @@ -155,26 +155,6 @@ Mmi386ReleaseMmInfo(PEPROCESS Process) return(STATUS_SUCCESS); } -NTSTATUS -NTAPI -MmInitializeHandBuiltProcess(IN PEPROCESS Process, - IN PULONG DirectoryTableBase) -{ - /* Share the directory base with the idle process */ - DirectoryTableBase[0] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[0]; - DirectoryTableBase[1] = PsGetCurrentProcess()->Pcb.DirectoryTableBase[1]; - - /* Initialize the Addresss Space */ - KeInitializeGuardedMutex(&Process->AddressCreationLock); - Process->Vm.WorkingSetExpansionLinks.Flink = NULL; - ASSERT(Process->VadRoot.NumberGenericTableElements == 0); - Process->VadRoot.BalancedRoot.u1.Parent = &Process->VadRoot.BalancedRoot; - - /* The process now has an address space */ - Process->HasAddressSpace = TRUE; - return STATUS_SUCCESS; -} - BOOLEAN NTAPI MmCreateProcessAddressSpace(IN ULONG MinWs, diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index 8694acf0376..5867d29e47e 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -13,134 +13,8 @@ #define NDEBUG #include -VOID NTAPI MiRosTakeOverPebTebRanges(IN PEPROCESS Process); - /* FUNCTIONS *****************************************************************/ -NTSTATUS -NTAPI -MmInitializeHandBuiltProcess2(IN PEPROCESS Process) -{ - /* Lock the VAD, ARM3-owned ranges away */ - MiRosTakeOverPebTebRanges(Process); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -MmInitializeProcessAddressSpace(IN PEPROCESS Process, - IN PEPROCESS ProcessClone OPTIONAL, - IN PVOID Section OPTIONAL, - IN OUT PULONG Flags, - IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL) -{ - NTSTATUS Status = STATUS_SUCCESS; - PMMSUPPORT ProcessAddressSpace = &Process->Vm; - SIZE_T ViewSize = 0; - PVOID ImageBase = 0; - PROS_SECTION_OBJECT SectionObject = Section; - - /* Initialize the Addresss Space lock */ - KeInitializeGuardedMutex(&Process->AddressCreationLock); - Process->Vm.WorkingSetExpansionLinks.Flink = NULL; - - /* Initialize AVL tree */ - ASSERT(Process->VadRoot.NumberGenericTableElements == 0); - Process->VadRoot.BalancedRoot.u1.Parent = &Process->VadRoot.BalancedRoot; - - /* Acquire the Lock */ - MmLockAddressSpace(ProcessAddressSpace); - - /* Lock the VAD, ARM3-owned ranges away */ - MiRosTakeOverPebTebRanges(Process); - - /* The process now has an address space */ - Process->HasAddressSpace = TRUE; - - /* Check if there's a Section Object */ - if (SectionObject) - { - UNICODE_STRING FileName; - PWCHAR szSrc; - PCHAR szDest; - USHORT lnFName = 0; - - /* Unlock the Address Space */ - DPRINT("Unlocking\n"); - MmUnlockAddressSpace(ProcessAddressSpace); - - DPRINT("Mapping process image. Section: %p, Process: %p, ImageBase: %p\n", - SectionObject, Process, &ImageBase); - Status = MmMapViewOfSection(Section, - (PEPROCESS)Process, - (PVOID*)&ImageBase, - 0, - 0, - NULL, - &ViewSize, - 0, - MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to map process Image\n"); - return Status; - } - - /* Save the pointer */ - Process->SectionBaseAddress = ImageBase; - - /* Determine the image file name and save it to EPROCESS */ - DPRINT("Getting Image name\n"); - FileName = SectionObject->FileObject->FileName; - szSrc = (PWCHAR)((PCHAR)FileName.Buffer + FileName.Length); - if (FileName.Buffer) - { - /* Loop the file name*/ - while (szSrc > FileName.Buffer) - { - /* Make sure this isn't a backslash */ - if (*--szSrc == OBJ_NAME_PATH_SEPARATOR) - { - /* If so, stop it here */ - szSrc++; - break; - } - else - { - /* Otherwise, keep going */ - lnFName++; - } - } - } - - /* Copy the to the process and truncate it to 15 characters if necessary */ - szDest = Process->ImageFileName; - lnFName = min(lnFName, sizeof(Process->ImageFileName) - 1); - while (lnFName--) *szDest++ = (UCHAR)*szSrc++; - *szDest = ANSI_NULL; - - /* Check if caller wants an audit name */ - if (AuditName) - { - /* Setup the audit name */ - SeInitializeProcessAuditName(SectionObject->FileObject, - FALSE, - AuditName); - } - - /* Return status to caller */ - return Status; - } - - /* Unlock the Address Space */ - DPRINT("Unlocking\n"); - MmUnlockAddressSpace(ProcessAddressSpace); - - /* Return status to caller */ - return Status; -} - VOID NTAPI MmCleanProcessAddressSpace(IN PEPROCESS Process) From ecd26cf41a95dc601c3bdbbb5a255345ca9571a0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 24 Jul 2010 15:04:24 +0000 Subject: [PATCH 79/82] [DHCPCSVC] - Initialize length to prevent a possible buffer overflow - Thanks to janderwald for finding my mistake svn path=/trunk/; revision=48232 --- reactos/dll/win32/dhcpcsvc/dhcp/adapter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c index c0ba02db40e..ffa176fc1ab 100644 --- a/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c +++ b/reactos/dll/win32/dhcpcsvc/dhcp/adapter.c @@ -147,7 +147,7 @@ cleanup: BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { HKEY AdapterKey; - DWORD Error = ERROR_SUCCESS, DhcpEnabled, Length; + DWORD Error = ERROR_SUCCESS, DhcpEnabled, Length = sizeof(DWORD); Adapter->DhclientState.config = &Adapter->DhclientConfig; strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr, From 3ec9a11a16cf445c1a9a766ca12ca9f2f3d1e29e Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 24 Jul 2010 15:30:24 +0000 Subject: [PATCH 80/82] [NTOS]: Reimplement MmCreateProcessAddressSpace in ARM3. Basically the same as before but using the ARM3 PFN list APIs, the ARM3 macros, etc. Once change is processes are now populating the MmProcessList, and the "MmGlobalKernelPageTable" isn't used anymore for new processes. Also the mappings come from SysPTE space, not hyperspace. [NTOS]: More work will be needed in this area, but this gets rid of another ReactOS dinosaur. svn path=/trunk/; revision=48233 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 7 +++ reactos/ntoskrnl/mm/ARM3/procsup.c | 96 +++++++++++++++++++++++++++++- reactos/ntoskrnl/mm/i386/page.c | 88 --------------------------- reactos/ntoskrnl/mm/procsup.c | 2 - 4 files changed, 101 insertions(+), 92 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 7d82887c08e..0b4cb68050e 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -485,6 +485,7 @@ extern PMMPTE MiHighestUserPte; extern PMMPDE MiHighestUserPde; extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT]; extern PMMPTE MmSharedUserDataPte; +extern LIST_ENTRY MmProcessList; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) @@ -1031,6 +1032,12 @@ MiRemoveZeroPage( IN ULONG Color ); +VOID +NTAPI +MiZeroPhysicalPage( + IN PFN_NUMBER PageFrameIndex +); + VOID NTAPI MiInsertPageInFreeList( diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index b4fa2dede99..946485a11ed 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -878,12 +878,12 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, /* Setup the PFN for the PDE base of this process */ PointerPte = MiAddressToPte(PDE_BASE); PageFrameNumber = PFN_FROM_PTE(PointerPte); - //MiInitializePfn(PageFrameNumber, PointerPte, TRUE); + MiInitializePfn(PageFrameNumber, PointerPte, TRUE); /* Do the same for hyperspace */ PointerPde = MiAddressToPde(HYPER_SPACE); PageFrameNumber = PFN_FROM_PTE(PointerPde); - //MiInitializePfn(PageFrameNumber, PointerPde, TRUE); + MiInitializePfn(PageFrameNumber, PointerPde, TRUE); /* Release PFN lock */ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); @@ -991,6 +991,98 @@ MmInitializeHandBuiltProcess2(IN PEPROCESS Process) return STATUS_SUCCESS; } +/* FIXME: Evaluate ways to make this portable yet arch-specific */ +BOOLEAN +NTAPI +MmCreateProcessAddressSpace(IN ULONG MinWs, + IN PEPROCESS Process, + OUT PULONG_PTR DirectoryTableBase) +{ + KIRQL OldIrql; + PFN_NUMBER PdeIndex, HyperIndex; + PMMPTE PointerPte; + MMPTE TempPte, PdePte; + ULONG PdeOffset; + PMMPTE SystemTable; + + /* No page colors yet */ + Process->NextPageColor = 0; + + /* Setup the hyperspace lock */ + KeInitializeSpinLock(&Process->HyperSpaceLock); + + /* Lock PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Get a page for the PDE */ + PdeIndex = MiRemoveAnyPage(0); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + MiZeroPhysicalPage(PdeIndex); + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Get a page for hyperspace */ + HyperIndex = MiRemoveAnyPage(0); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + MiZeroPhysicalPage(HyperIndex); + + /* Switch to phase 1 initialization */ + ASSERT(Process->AddressSpaceInitialized == 0); + Process->AddressSpaceInitialized = 1; + + /* Set the base directory pointers */ + DirectoryTableBase[0] = PdeIndex << PAGE_SHIFT; + DirectoryTableBase[1] = HyperIndex << PAGE_SHIFT; + + /* Make sure we don't already have a page directory setup */ + ASSERT(Process->Pcb.DirectoryTableBase[0] == 0); + + /* Insert us into the Mm process list */ + InsertTailList(&MmProcessList, &Process->MmProcessLinks); + + /* Get a PTE to map the page directory */ + PointerPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(PointerPte != NULL); + + /* Build it */ + MI_MAKE_HARDWARE_PTE_KERNEL(&PdePte, + PointerPte, + MM_READWRITE, + PdeIndex); + + /* Set it dirty and map it */ + PdePte.u.Hard.Dirty = TRUE; + MI_WRITE_VALID_PTE(PointerPte, PdePte); + + /* Now get the page directory (which we'll double map, so call it a page table */ + SystemTable = MiPteToAddress(PointerPte); + + /* Copy all the kernel mappings */ + PdeOffset = MiGetPdeOffset(MmSystemRangeStart); + + RtlCopyMemory(&SystemTable[PdeOffset], + MiAddressToPde(MmSystemRangeStart), + PAGE_SIZE - PdeOffset * sizeof(MMPTE)); + + /* Now write the PTE/PDE entry for hyperspace itself */ + TempPte = ValidKernelPte; + TempPte.u.Hard.PageFrameNumber = HyperIndex; + PdeOffset = MiGetPdeOffset(HYPER_SPACE); + SystemTable[PdeOffset] = TempPte; + + /* Sanity check */ + PdeOffset++; + ASSERT(MiGetPdeOffset(MmHyperSpaceEnd) >= PdeOffset); + + /* Now do the x86 trick of making the PDE a page table itself */ + PdeOffset = MiGetPdeOffset(PTE_BASE); + TempPte.u.Hard.PageFrameNumber = PdeIndex; + SystemTable[PdeOffset] = TempPte; + + /* Let go of the system PTE */ + MiReleaseSystemPtes(PointerPte, 1, SystemPteSpace); + return TRUE; +} + /* SYSTEM CALLS ***************************************************************/ NTSTATUS diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index ac05ecc8713..8945ff24c43 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -112,94 +112,6 @@ ProtectToPTE(ULONG flProtect) return(Attributes); } -NTSTATUS -NTAPI -Mmi386ReleaseMmInfo(PEPROCESS Process) -{ - PUSHORT LdtDescriptor; - ULONG LdtBase; - PULONG PageDir; - ULONG i; - - DPRINT("Mmi386ReleaseMmInfo(Process %x)\n",Process); - - LdtDescriptor = (PUSHORT) &Process->Pcb.LdtDescriptor; - LdtBase = LdtDescriptor[1] | - ((LdtDescriptor[2] & 0xff) << 16) | - ((LdtDescriptor[3] & ~0xff) << 16); - - DPRINT("LdtBase: %x\n", LdtBase); - - if (LdtBase) - { - ExFreePool((PVOID) LdtBase); - } - - PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); - for (i = 0; i < ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i++) - { - if (PageDir[i] != 0) - { - MiZeroPage(PTE_TO_PFN(PageDir[i])); - MmReleasePageMemoryConsumer(MC_NPPOOL, PTE_TO_PFN(PageDir[i])); - } - } - MmReleasePageMemoryConsumer(MC_NPPOOL, PTE_TO_PFN(PageDir[ADDR_TO_PDE_OFFSET(HYPERSPACE)])); - MmDeleteHyperspaceMapping(PageDir); - MmReleasePageMemoryConsumer(MC_NPPOOL, PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); - - Process->Pcb.DirectoryTableBase[0] = 0; - Process->Pcb.DirectoryTableBase[1] = 0; - - DPRINT("Finished Mmi386ReleaseMmInfo()\n"); - return(STATUS_SUCCESS); -} - -BOOLEAN -NTAPI -MmCreateProcessAddressSpace(IN ULONG MinWs, - IN PEPROCESS Process, - IN PULONG DirectoryTableBase) -{ - NTSTATUS Status; - ULONG i, j; - PFN_NUMBER Pfn[2]; - PULONG PageDirectory; - - DPRINT("MmCopyMmInfo(Src %x, Dest %x)\n", MinWs, Process); - - for (i = 0; i < 2; i++) - { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn[i]); - if (!NT_SUCCESS(Status)) - { - for (j = 0; j < i; j++) - { - MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn[j]); - } - - return FALSE; - } - } - - PageDirectory = MmCreateHyperspaceMapping(Pfn[0]); - - memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(MmSystemRangeStart), - MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(MmSystemRangeStart), - (1024 - ADDR_TO_PDE_OFFSET(MmSystemRangeStart)) * sizeof(ULONG)); - - DPRINT("Addr %x\n",ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)); - PageDirectory[ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)] = PFN_TO_PTE(Pfn[0]) | PA_PRESENT | PA_READWRITE; - PageDirectory[ADDR_TO_PDE_OFFSET(HYPERSPACE)] = PFN_TO_PTE(Pfn[1]) | PA_PRESENT | PA_READWRITE; - - MmDeleteHyperspaceMapping(PageDirectory); - - DirectoryTableBase[0] = PFN_TO_PTE(Pfn[0]); - DirectoryTableBase[1] = 0; - DPRINT("Finished MmCopyMmInfo(): 0x%x\n", DirectoryTableBase[0]); - return TRUE; -} - static PULONG MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) { diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index 5867d29e47e..b8c541e7242 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -61,8 +61,6 @@ MmDeleteProcessAddressSpace(PEPROCESS Process) } } - Mmi386ReleaseMmInfo(Process); - MmUnlockAddressSpace(&Process->Vm); DPRINT("Finished MmReleaseMmInfo()\n"); From 2384532846b36161e19a658c9c9414eae4ecfd13 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 24 Jul 2010 16:12:39 +0000 Subject: [PATCH 81/82] [NTOS]: Implement MmCleanProcessAddressSpace in ARM3, now the PEB/TEB VADs are removed when the process exits (although the pages are still leaking, for now), and the pool allocation for the VAD is also freed. [NTOS]: Use ARM3 paged pool up until smss.exe starts. There's a last bug in the expansion code before we can get rid of the old paged pool. svn path=/trunk/; revision=48234 --- reactos/lib/rtl/avlsupp.c | 8 +++-- reactos/ntoskrnl/ex/init.c | 4 +++ reactos/ntoskrnl/mm/ARM3/procsup.c | 51 ++++++++++++++++++++++++++++++ reactos/ntoskrnl/mm/mminit.c | 6 ---- reactos/ntoskrnl/mm/procsup.c | 7 ---- 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/reactos/lib/rtl/avlsupp.c b/reactos/lib/rtl/avlsupp.c index 74d5163922b..50b96ce2874 100644 --- a/reactos/lib/rtl/avlsupp.c +++ b/reactos/lib/rtl/avlsupp.c @@ -297,7 +297,7 @@ FORCEINLINE RtlpDeleteAvlTreeNode(IN PRTL_AVL_TABLE Table, IN PRTL_BALANCED_LINKS Node) { - PRTL_BALANCED_LINKS DeleteNode, ParentNode; + PRTL_BALANCED_LINKS DeleteNode = NULL, ParentNode; PRTL_BALANCED_LINKS *Node1, *Node2; CHAR Balance; @@ -320,15 +320,19 @@ RtlpDeleteAvlTreeNode(IN PRTL_AVL_TABLE Table, /* Get the parent node */ ParentNode = RtlParentAvl(DeleteNode); + DPRINT("Parent: %p\n", ParentNode); /* Pick which now to use based on whether or not we have a left child */ Node1 = RtlLeftChildAvl(DeleteNode) ? &DeleteNode->LeftChild : &DeleteNode->RightChild; + DPRINT("Node 1: %p %p\n", Node1, *Node1); /* Pick which node to swap based on if we're already a left child or not */ Node2 = RtlIsLeftChildAvl(DeleteNode) ? &ParentNode->LeftChild : &ParentNode->RightChild; - + DPRINT("Node 2: %p %p\n", Node2, *Node2); + /* Pick the correct balance depending on which side will get heavier */ Balance = RtlIsLeftChildAvl(DeleteNode) ? RtlLeftHeavyAvlTree : RtlRightHeavyAvlTree; + DPRINT("Balance: %lx\n", Balance); /* Swap the children nodes, making one side heavier */ *Node2 = *Node1; diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index cc8a9adcb4a..048d6393f49 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -1859,6 +1859,10 @@ Phase1InitializationDiscard(IN PVOID Context) /* Allow strings to be displayed */ InbvEnableDisplayString(TRUE); + /* Enough fun for now */ + extern BOOLEAN AllowPagedPool; + AllowPagedPool = FALSE; + /* Wait 5 seconds for it to initialize */ Timeout.QuadPart = Int32x32To64(5, -10000000); Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout); diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 946485a11ed..e10fe3c8193 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -1083,6 +1083,57 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, return TRUE; } +VOID +NTAPI +MmCleanProcessAddressSpace(IN PEPROCESS Process) +{ + PMMVAD Vad; + PMM_AVL_TABLE VadTree; + PETHREAD Thread = PsGetCurrentThread(); + + /* Lock the process address space from changes */ + MmLockAddressSpace(&Process->Vm); + + /* Enumerate the VADs */ + VadTree = &Process->VadRoot; + DPRINT("Cleaning up VADs: %d\n", VadTree->NumberGenericTableElements); + while (VadTree->NumberGenericTableElements) + { + /* Grab the current VAD */ + Vad = (PMMVAD)VadTree->BalancedRoot.RightChild; + + /* Lock the working set */ + MiLockProcessWorkingSet(Process, Thread); + + /* Remove this VAD from the tree */ + ASSERT(VadTree->NumberGenericTableElements >= 1); + DPRINT("Removing node for VAD: %lx %lx\n", Vad->StartingVpn, Vad->EndingVpn); + MiRemoveNode((PMMADDRESS_NODE)Vad, VadTree); + DPRINT("Moving on: %d\n", VadTree->NumberGenericTableElements); + + /* Check if this VAD was the hint */ + if (VadTree->NodeHint == Vad) + { + /* Get a new hint, unless we're empty now, in which case nothing */ + VadTree->NodeHint = VadTree->BalancedRoot.RightChild; + if (!VadTree->NumberGenericTableElements) VadTree->NodeHint = NULL; + } + + /* Only PEB/TEB VADs supported for now */ + ASSERT(Vad->u.VadFlags.PrivateMemory == 1); + ASSERT(Vad->u.VadFlags.VadType == VadNone); + + /* Release the working set */ + MiUnlockProcessWorkingSet(Process, Thread); + + /* Free the VAD memory */ + ExFreePool(Vad); + } + + /* Release the address space */ + MmUnlockAddressSpace(&Process->Vm); +} + /* SYSTEM CALLS ***************************************************************/ NTSTATUS diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 669870dcb2b..d2db58eaaa5 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -436,12 +436,6 @@ MmInitSystem(IN ULONG Phase, /* Initialize the balance set manager */ MmInitBsmThread(); } - else if (Phase == 2) - { - /* Enough fun for now */ - extern BOOLEAN AllowPagedPool; - AllowPagedPool = FALSE; - } return TRUE; } diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index b8c541e7242..b550f508b36 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -15,13 +15,6 @@ /* FUNCTIONS *****************************************************************/ -VOID -NTAPI -MmCleanProcessAddressSpace(IN PEPROCESS Process) -{ - /* FIXME: Add part of MmDeleteProcessAddressSpace here */ -} - NTSTATUS NTAPI MmDeleteProcessAddressSpace(PEPROCESS Process) From a28e7980069abd0a74a88b6acb2550547497ca2f Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sat, 24 Jul 2010 16:28:51 +0000 Subject: [PATCH 82/82] [NTOS]: Implement MmDeleteTeb, VADs are now deleted/freed on thread exit as well (but the underlying page is still leaked). Should fix the advapi32 security crash. [NTOS]: Sometimes it seems we hit some bad VADs due to bugs? in the AVL tree implementation. I'm going on vacation for a month and can't look at this, so I've hacked the code to ignore such VADs for now, in the interest of fixing the winetest regression. svn path=/trunk/; revision=48235 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 12 +++++++ reactos/ntoskrnl/mm/ARM3/procsup.c | 53 ++++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 0b4cb68050e..c5776338d94 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -1121,4 +1121,16 @@ MiRemoveNode( IN PMM_AVL_TABLE Table ); +PMMADDRESS_NODE +NTAPI +MiGetPreviousNode( + IN PMMADDRESS_NODE Node +); + +PMMADDRESS_NODE +NTAPI +MiGetNextNode( + IN PMMADDRESS_NODE Node +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index e10fe3c8193..857a181fefd 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -149,8 +149,57 @@ NTAPI MmDeleteTeb(IN PEPROCESS Process, IN PTEB Teb) { - /* Oops J */ - DPRINT("Leaking 4KB at thread exit, this will be fixed later\n"); + ULONG_PTR TebEnd; + PETHREAD Thread = PsGetCurrentThread(); + PMMVAD Vad; + PMM_AVL_TABLE VadTree = &Process->VadRoot; + DPRINT("Deleting TEB: %p in %16s\n", Teb, Process->ImageFileName); + + /* TEB is one page */ + TebEnd = (ULONG_PTR)Teb + ROUND_TO_PAGES(sizeof(TEB)) - 1; + + /* Attach to the process */ + KeAttachProcess(&Process->Pcb); + + /* Lock the process address space */ + KeAcquireGuardedMutex(&Process->AddressCreationLock); + + /* Find the VAD, make sure it's a TEB VAD */ + Vad = MiLocateAddress(Teb); + DPRINT("Removing node for VAD: %lx %lx\n", Vad->StartingVpn, Vad->EndingVpn); + ASSERT(Vad != NULL); + if (Vad->StartingVpn != ((ULONG_PTR)Teb >> PAGE_SHIFT)) + { + /* Bug in the AVL code? */ + DPRINT1("Corrupted VAD!\n"); + } + else + { + /* Sanity checks for a valid TEB VAD */ + ASSERT((Vad->StartingVpn == ((ULONG_PTR)Teb >> PAGE_SHIFT) && + (Vad->EndingVpn == (TebEnd >> PAGE_SHIFT)))); + ASSERT(Vad->u.VadFlags.NoChange == TRUE); + ASSERT(Vad->u2.VadFlags2.MultipleSecured == FALSE); + + /* Lock the working set */ + MiLockProcessWorkingSet(Process, Thread); + + /* Remove this VAD from the tree */ + ASSERT(VadTree->NumberGenericTableElements >= 1); + MiRemoveNode((PMMADDRESS_NODE)Vad, VadTree); + + /* Release the working set */ + MiUnlockProcessWorkingSet(Process, Thread); + + /* Remove the VAD */ + ExFreePool(Vad); + } + + /* Release the address space lock */ + KeReleaseGuardedMutex(&Process->AddressCreationLock); + + /* Detach */ + KeDetachProcess(); } VOID