mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
Merge 25584, 25588.
svn path=/branches/ros-branch-0_3_1/; revision=25730
This commit is contained in:
commit
0a0fa78d34
5 changed files with 376 additions and 78 deletions
|
@ -51,3 +51,4 @@ IDR_GPL RT_TEXT "COPYING"
|
||||||
#include "syssetup_Es.rc"
|
#include "syssetup_Es.rc"
|
||||||
#include "syssetup_Hu.rc"
|
#include "syssetup_Hu.rc"
|
||||||
#include "syssetup_Uk.rc"
|
#include "syssetup_Uk.rc"
|
||||||
|
#include "syssetup_It.rc"
|
||||||
|
|
214
reactos/dll/win32/syssetup/syssetup_It.rc
Normal file
214
reactos/dll/win32/syssetup/syssetup_It.rc
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: System Setup
|
||||||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
|
* FILE: dll/win32/syssetup/syssetup_It.rc
|
||||||
|
* PURPOSE: Italian Translation of dll/win32/syssetup/syssetup_En.rc
|
||||||
|
* PROGRAMMERS: Copyright (C) 2004 Filip Navara
|
||||||
|
* Copyright (C) 2004 Eric Kohl
|
||||||
|
* Copyright (C) 2007 Daniele Forsi (dforsi at gmail.com) Italian Translation
|
||||||
|
*/
|
||||||
|
|
||||||
|
LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
|
||||||
|
|
||||||
|
|
||||||
|
IDD_WELCOMEPAGE DIALOG DISCARDABLE 0, 0, 317, 193
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Benvenuti alla configurazione guidata di ReactOS.", IDC_WELCOMETITLE, 115, 8, 195, 24
|
||||||
|
LTEXT "Questa procedura guidata installa ReactOS su questo computer. La procedura "\
|
||||||
|
"deve raccogliere alcune informazioni sull'utente e sul computer "\
|
||||||
|
"per configurare ReactOS adeguatamente.", IDC_STATIC, 115, 40, 195, 100
|
||||||
|
LTEXT "Selezionare Continua per proseguire con la configurazione.", IDC_STATIC, 115, 169, 195, 17
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_ACKPAGE DIALOGEX 0, 0, 317, 143
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Gli sviluppatori di ReactOS desiderano citare i seguenti progetti Open Source, "\
|
||||||
|
"che sono stati usati (in tutto o in parte) per creare ReactOS:",
|
||||||
|
IDC_STATIC,15,7,286,19
|
||||||
|
LISTBOX IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS |
|
||||||
|
LBS_NOINTEGRALHEIGHT | WS_VSCROLL
|
||||||
|
LTEXT "ReactOS è soggetto alla licenza GPL, per cui se si desidera riusarlo o ridistribuirlo "\
|
||||||
|
"(in tutto o in parte) è necessario rispettare la GPL",
|
||||||
|
IDC_STATIC,15,110,227,19
|
||||||
|
PUSHBUTTON "&Mostra la GPL...",IDC_VIEWGPL,251,110,50,19
|
||||||
|
LTEXT "Selezionare Continua per proseguire con la configurazione.",IDC_STATIC,15,136,
|
||||||
|
195,17
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_OWNERPAGE DIALOG DISCARDABLE 0, 0, 317, 143
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Scrivere il proprio nome completo e il nome della propria ditta o organizzazione.",
|
||||||
|
IDC_STATIC, 54, 7, 242, 21
|
||||||
|
LTEXT "No&me:", IDC_STATIC, 54, 37, 44, 8
|
||||||
|
EDITTEXT IDC_OWNERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL
|
||||||
|
LTEXT "&Organizzazione:", IDC_STATIC, 54, 57, 44, 8
|
||||||
|
EDITTEXT IDC_OWNERORGANIZATION, 132, 55, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_COMPUTERPAGE DIALOG DISCARDABLE 0, 0, 317, 143
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Scrivere un nome per il computer che sia lungo al massimo 63 caratteri. "\
|
||||||
|
"Se si è in rete, il nome del computer deve essere univoco.",
|
||||||
|
IDC_STATIC, 54, 7, 250, 24
|
||||||
|
LTEXT "Nome del &computer:", IDC_STATIC, 54, 38, 75, 8
|
||||||
|
EDITTEXT IDC_COMPUTERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_UPPERCASE
|
||||||
|
LTEXT "Questa procedura creerà su questo computer un account utente chiamato Administrator. "\
|
||||||
|
"Si potrà usare questo account se si necessita l'accesso completo al computer.",
|
||||||
|
IDC_STATIC, 54, 57, 250, 25
|
||||||
|
LTEXT "Scrivere una password per Administrator che sia lunga al massimo 14 caratteri.",
|
||||||
|
IDC_STATIC, 54, 87, 250, 8
|
||||||
|
LTEXT "Password per &Administrator:", IDC_STATIC, 54, 104, 75, 8
|
||||||
|
EDITTEXT IDC_ADMINPASSWORD1, 132, 101, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD
|
||||||
|
LTEXT "C&onfermare la password:", IDC_STATIC, 54, 123, 75, 8
|
||||||
|
EDITTEXT IDC_ADMINPASSWORD2, 132, 120, 172, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_LOCALEPAGE DIALOG DISCARDABLE 0, 0, 317, 143
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Le impostazioni linguistiche del sistema devono coincidere con la lingua degli applicativi "\
|
||||||
|
"che si desidera usare. Le impostazioni linguistiche dell'utente stabiliscono come appaiono "\
|
||||||
|
"i numeri, i valori monetari e le date.", IDC_STATIC, 53, 7, 253, 20
|
||||||
|
LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16
|
||||||
|
LTEXT "Per cambiare le impostazioni linguistiche del sistema o dell'utente, selezionare Personalizza.",
|
||||||
|
IDC_STATIC, 53, 60, 184, 8
|
||||||
|
PUSHBUTTON "&Personalizza...", IDC_CUSTOMLOCALE, 245, 57, 50, 14
|
||||||
|
LTEXT "Il formato della tastiera stabilisce i caratteri che appaiono quando si preme un tasto.",
|
||||||
|
IDC_STATIC, 53, 86, 253, 8
|
||||||
|
LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16
|
||||||
|
LTEXT "Per cambiare il formato della tastiera, selezionare Personalizza.",
|
||||||
|
IDC_STATIC, 53, 126, 184, 8
|
||||||
|
PUSHBUTTON "P&ersonalizza...", IDC_CUSTOMLAYOUT, 245, 122, 50, 14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_DATETIMEPAGE DIALOG DISCARDABLE 0, 0, 317, 143
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Data e ora", IDC_STATIC, 53, 7, 253, 8
|
||||||
|
CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
|
||||||
|
DTS_LONGDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 53, 17, 137, 14
|
||||||
|
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
|
||||||
|
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 17, 54, 14
|
||||||
|
LTEXT "Fuso orario", IDC_STATIC, 53, 42, 253, 8
|
||||||
|
COMBOBOX IDC_TIMEZONELIST, 53, 52, 201, 93,
|
||||||
|
CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
|
||||||
|
AUTOCHECKBOX "Cambia automaticamente con l'ora &legale",
|
||||||
|
IDC_AUTODAYLIGHT, 53, 124, 201, 10
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_PROCESSPAGE DIALOG 0, 0, 317, 143
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Installazione di ReactOS"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "", IDC_ACTIVITY, 53, 7, 253, 20
|
||||||
|
LTEXT "", IDC_ITEM, 53, 29, 253, 20
|
||||||
|
CONTROL "", IDC_PROCESSPROGRESS, "msctls_progress32",
|
||||||
|
PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 53, 70, 253, 8
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 193
|
||||||
|
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "L'installazione di ReactOS è completata"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
LTEXT "Completamento della procedura guidata di installazione di ReactOS", IDC_FINISHTITLE, 115, 8, 195, 24
|
||||||
|
LTEXT "La procedura guidata di installazione di ReactOS è completata.\n\n" \
|
||||||
|
"Selezionando Fine, il computer sarà riavviato.", IDC_STATIC, 115, 40, 195, 100
|
||||||
|
CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 115, 138, 188, 12
|
||||||
|
LTEXT "Se c'è un CD in un lettore, è necessario rimuoverlo. Poi, per riavviare "\
|
||||||
|
"il computer, selezionare Fine.", IDC_STATIC, 115, 169, 195, 17
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IDD_GPL DIALOG 0, 0, 333, 230
|
||||||
|
STYLE DS_CENTER | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "GNU General Public License"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
EDITTEXT IDC_GPL_TEXT,7,7,319,190,ES_MULTILINE | ES_AUTOHSCROLL |
|
||||||
|
ES_READONLY | WS_VSCROLL
|
||||||
|
DEFPUSHBUTTON "OK",IDOK,141,209,50,14
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_ACKTITLE "Riconoscimenti"
|
||||||
|
IDS_ACKSUBTITLE "Le spalle su cui ReactOS poggia e le informazioni sulla licenza"
|
||||||
|
IDS_OWNERTITLE "Personalizzare il software"
|
||||||
|
IDS_OWNERSUBTITLE "La procedura usa queste informazioni su di voi per personalizzare ReactOS."
|
||||||
|
IDS_COMPUTERTITLE "Il nome del computer e la password di Administrator"
|
||||||
|
IDS_COMPUTERSUBTITLE "È necessario fornire un nome e una password di Administrator per il proprio computer."
|
||||||
|
IDS_LOCALETITLE "Impostazioni regionali"
|
||||||
|
IDS_LOCALESUBTITLE "È possibile personalizzare ReactOS per regioni e lingue differenti."
|
||||||
|
IDS_DATETIMETITLE "Data e ora"
|
||||||
|
IDS_DATETIMESUBTITLE "Impostare la data e l'ora corrette per il proprio computer."
|
||||||
|
IDS_PROCESSTITLE "Titolo della pagina di avanzamento"
|
||||||
|
IDS_PROCESSSUBTITLE "Sottotitolo della pagina di avanzamento"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_CMT_WINEFILE "Lancia Winefile"
|
||||||
|
IDS_CMT_IBROWSER "Lancia iBrowser"
|
||||||
|
IDS_CMT_GETFIREFOX "Scarica/installa Firefox"
|
||||||
|
IDS_CMT_DOWNLOADER "Scarica e installa varie applicazioni"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_ACCESSORIES "Accessori"
|
||||||
|
IDS_CMT_CALC "Calcolatrice"
|
||||||
|
IDS_CMT_CMD "Apri la finestra dei comandi"
|
||||||
|
IDS_CMT_EXPLORER "Lancia Explorer"
|
||||||
|
IDS_CMT_NOTEPAD "Lancia l'editor dei testi"
|
||||||
|
IDS_CMT_REGEDIT "Lancia l'editor del registro"
|
||||||
|
IDS_CMT_WORDPAD "Lancia l'editor dei documenti"
|
||||||
|
IDS_CMT_SCREENSHOT "Salva una schermata"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_GAMES "Giochi"
|
||||||
|
IDS_CMT_SOLITAIRE "Solitario"
|
||||||
|
IDS_CMT_WINEMINE "Campo minato"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_REACTOS_SETUP "Installazione di ReactOS"
|
||||||
|
IDS_UNKNOWN_ERROR "Errore sconosciuto"
|
||||||
|
IDS_REGISTERING_COMPONENTS "Registrazione dei componenti..."
|
||||||
|
IDS_LOADLIBRARY_FAILED "LoadLibrary fallito: "
|
||||||
|
IDS_GETPROCADDR_FAILED "GetProcAddr fallito: "
|
||||||
|
IDS_REGSVR_FAILED "DllRegisterServer fallito: "
|
||||||
|
IDS_DLLINSTALL_FAILED "DllInstall fallito: "
|
||||||
|
IDS_TIMEOUT "Tempo scaduto durante la registrazione"
|
||||||
|
IDS_REASON_UNKNOWN ""
|
||||||
|
END
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -1,11 +1,11 @@
|
||||||
/*
|
/*
|
||||||
* PROJECT: ReactOS Kernel
|
* PROJECT: ReactOS Kernel
|
||||||
* LICENSE: GPL - See COPYING in the top level directory
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
* FILE: ntoskrnl/ex/init.c
|
* FILE: ntoskrnl/ex/init.c
|
||||||
* PURPOSE: Executive Initialization Code
|
* PURPOSE: Executive Initialization Code
|
||||||
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
|
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
|
||||||
* Eric Kohl (ekohl@rz-online.de)
|
* Eric Kohl (ekohl@rz-online.de)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* INCLUDES ******************************************************************/
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -341,6 +341,33 @@ ExTimedWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*++
|
||||||
|
* @name ExWaitForUnblockPushLock
|
||||||
|
*
|
||||||
|
* The ExWaitForUnblockPushLock routine waits for a pushlock
|
||||||
|
* to be unblocked, for a specified internal.
|
||||||
|
*
|
||||||
|
* @param PushLock
|
||||||
|
* Pointer to a pushlock whose waiter list needs to be optimized.
|
||||||
|
*
|
||||||
|
* @param WaitBlock
|
||||||
|
* Pointer to the pushlock's wait block.
|
||||||
|
*
|
||||||
|
* @return STATUS_SUCCESS is the pushlock is now unblocked, otherwise the error
|
||||||
|
* code returned by KeWaitForSingleObject.
|
||||||
|
*
|
||||||
|
* @remarks If the wait fails, then a manual unblock is attempted.
|
||||||
|
*
|
||||||
|
*--*/
|
||||||
|
VOID
|
||||||
|
FASTCALL
|
||||||
|
ExWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
|
||||||
|
IN PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock)
|
||||||
|
{
|
||||||
|
/* Call the timed function with no timeout */
|
||||||
|
ExTimedWaitForUnblockPushLock(PushLock, WaitBlock, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
* @name ExBlockPushLock
|
* @name ExBlockPushLock
|
||||||
*
|
*
|
||||||
|
@ -360,25 +387,33 @@ ExTimedWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
ExBlockPushLock(PEX_PUSH_LOCK PushLock,
|
ExBlockPushLock(PEX_PUSH_LOCK PushLock,
|
||||||
PVOID WaitBlock)
|
PVOID pWaitBlock)
|
||||||
{
|
{
|
||||||
PVOID NewValue, OldValue;
|
PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock = pWaitBlock;
|
||||||
|
EX_PUSH_LOCK NewValue, OldValue;
|
||||||
|
|
||||||
|
/* Detect invalid wait block alignment */
|
||||||
|
ASSERT((ULONG_PTR)pWaitBlock & 0x10);
|
||||||
|
|
||||||
/* Set the waiting bit */
|
/* Set the waiting bit */
|
||||||
((PEX_PUSH_LOCK_WAIT_BLOCK)WaitBlock)->Flags |= EX_PUSH_LOCK_FLAGS_WAIT;
|
WaitBlock->Flags = EX_PUSH_LOCK_FLAGS_WAIT;
|
||||||
|
|
||||||
|
/* Get the old value */
|
||||||
|
OldValue = *PushLock;
|
||||||
|
|
||||||
/* Link the wait blocks */
|
/* Start block loop */
|
||||||
((PEX_PUSH_LOCK_WAIT_BLOCK)WaitBlock)->Next = PushLock->Ptr;
|
|
||||||
|
|
||||||
/* Try to set this one as the wait block now */
|
|
||||||
NewValue = PushLock->Ptr;
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
/* Link the wait blocks */
|
||||||
|
WaitBlock->Next = OldValue.Ptr;
|
||||||
|
|
||||||
/* Set the new wait block value */
|
/* Set the new wait block value */
|
||||||
OldValue = InterlockedCompareExchangePointer(&PushLock->Ptr,
|
NewValue.Ptr = InterlockedCompareExchangePointer(&PushLock->Ptr,
|
||||||
WaitBlock,
|
WaitBlock,
|
||||||
NewValue);
|
OldValue.Ptr);
|
||||||
if (OldValue == NewValue) break;
|
if (OldValue.Ptr == NewValue.Ptr) break;
|
||||||
|
|
||||||
|
/* Try again with the new value */
|
||||||
NewValue = OldValue;
|
NewValue = OldValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -404,7 +439,7 @@ VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
{
|
{
|
||||||
EX_PUSH_LOCK_WAIT_BLOCK WaitBlock;
|
DEFINE_WAIT_BLOCK(WaitBlock);
|
||||||
EX_PUSH_LOCK OldValue = *PushLock, NewValue, TempValue;
|
EX_PUSH_LOCK OldValue = *PushLock, NewValue, TempValue;
|
||||||
BOOLEAN NeedWake;
|
BOOLEAN NeedWake;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
@ -435,23 +470,23 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We'll have to create a Waitblock */
|
/* We'll have to create a Waitblock */
|
||||||
WaitBlock.Flags = EX_PUSH_LOCK_FLAGS_EXCLUSIVE |
|
WaitBlock->Flags = EX_PUSH_LOCK_FLAGS_EXCLUSIVE |
|
||||||
EX_PUSH_LOCK_FLAGS_WAIT;
|
EX_PUSH_LOCK_FLAGS_WAIT;
|
||||||
WaitBlock.Previous = NULL;
|
WaitBlock->Previous = NULL;
|
||||||
NeedWake = FALSE;
|
NeedWake = FALSE;
|
||||||
|
|
||||||
/* Check if there is already a waiter */
|
/* Check if there is already a waiter */
|
||||||
if (OldValue.Waiting)
|
if (OldValue.Waiting)
|
||||||
{
|
{
|
||||||
/* Nobody is the last waiter yet */
|
/* Nobody is the last waiter yet */
|
||||||
WaitBlock.Last = NULL;
|
WaitBlock->Last = NULL;
|
||||||
|
|
||||||
/* We are an exclusive waiter */
|
/* We are an exclusive waiter */
|
||||||
WaitBlock.ShareCount = 0;
|
WaitBlock->ShareCount = 0;
|
||||||
|
|
||||||
/* Set the current Wait Block pointer */
|
/* Set the current Wait Block pointer */
|
||||||
WaitBlock.Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
|
WaitBlock->Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
|
||||||
OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
|
OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
|
||||||
|
|
||||||
/* Point to ours */
|
/* Point to ours */
|
||||||
NewValue.Value = (OldValue.Value & EX_PUSH_LOCK_MULTIPLE_SHARED) |
|
NewValue.Value = (OldValue.Value & EX_PUSH_LOCK_MULTIPLE_SHARED) |
|
||||||
|
@ -466,10 +501,10 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We are the first waiter, so loop the wait block */
|
/* We are the first waiter, so loop the wait block */
|
||||||
WaitBlock.Last = &WaitBlock;
|
WaitBlock->Last = WaitBlock;
|
||||||
|
|
||||||
/* Set the share count */
|
/* Set the share count */
|
||||||
WaitBlock.ShareCount = OldValue.Shared;
|
WaitBlock->ShareCount = OldValue.Shared;
|
||||||
|
|
||||||
/* Check if someone is sharing this pushlock */
|
/* Check if someone is sharing this pushlock */
|
||||||
if (OldValue.Shared > 1)
|
if (OldValue.Shared > 1)
|
||||||
|
@ -483,7 +518,7 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No shared count */
|
/* No shared count */
|
||||||
WaitBlock.ShareCount = 0;
|
WaitBlock->ShareCount = 0;
|
||||||
|
|
||||||
/* Point to our wait block */
|
/* Point to our wait block */
|
||||||
NewValue.Value = EX_PUSH_LOCK_LOCK |
|
NewValue.Value = EX_PUSH_LOCK_LOCK |
|
||||||
|
@ -494,10 +529,10 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
|
|
||||||
#if DBG
|
#if DBG
|
||||||
/* Setup the Debug Wait Block */
|
/* Setup the Debug Wait Block */
|
||||||
WaitBlock.Signaled = 0;
|
WaitBlock->Signaled = 0;
|
||||||
WaitBlock.OldValue = OldValue;
|
WaitBlock->OldValue = OldValue;
|
||||||
WaitBlock.NewValue = NewValue;
|
WaitBlock->NewValue = NewValue;
|
||||||
WaitBlock.PushLock = PushLock;
|
WaitBlock->PushLock = PushLock;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
|
@ -524,26 +559,26 @@ ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the Wait Gate */
|
/* Set up the Wait Gate */
|
||||||
KeInitializeGate(&WaitBlock.WakeGate);
|
KeInitializeGate(&WaitBlock->WakeGate);
|
||||||
|
|
||||||
/* Now spin on the push lock if necessary */
|
/* Now spin on the push lock if necessary */
|
||||||
i = ExPushLockSpinCount;
|
i = ExPushLockSpinCount;
|
||||||
if ((i) && (WaitBlock.Flags & EX_PUSH_LOCK_WAITING))
|
if ((i) && (WaitBlock->Flags & EX_PUSH_LOCK_WAITING))
|
||||||
{
|
{
|
||||||
/* Spin */
|
/* Spin */
|
||||||
while (--i) YieldProcessor();
|
while (--i) YieldProcessor();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now try to remove the wait bit */
|
/* Now try to remove the wait bit */
|
||||||
if (InterlockedBitTestAndReset(&WaitBlock.Flags, 1))
|
if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
|
||||||
{
|
{
|
||||||
/* Nobody removed it already, let's do a full wait */
|
/* Nobody removed it already, let's do a full wait */
|
||||||
KeWaitForGate(&WaitBlock.WakeGate, WrPushLock, KernelMode);
|
KeWaitForGate(&WaitBlock->WakeGate, WrPushLock, KernelMode);
|
||||||
ASSERT(WaitBlock.Signaled);
|
ASSERT(WaitBlock->Signaled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We shouldn't be shared anymore */
|
/* We shouldn't be shared anymore */
|
||||||
ASSERT((WaitBlock.ShareCount == 0));
|
ASSERT((WaitBlock->ShareCount == 0));
|
||||||
|
|
||||||
/* Loop again */
|
/* Loop again */
|
||||||
OldValue = NewValue;
|
OldValue = NewValue;
|
||||||
|
@ -570,7 +605,7 @@ VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
{
|
{
|
||||||
EX_PUSH_LOCK_WAIT_BLOCK WaitBlock;
|
DEFINE_WAIT_BLOCK(WaitBlock);
|
||||||
EX_PUSH_LOCK OldValue = *PushLock, NewValue;
|
EX_PUSH_LOCK OldValue = *PushLock, NewValue;
|
||||||
BOOLEAN NeedWake;
|
BOOLEAN NeedWake;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
@ -614,20 +649,20 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We'll have to create a Waitblock */
|
/* We'll have to create a Waitblock */
|
||||||
WaitBlock.Flags = EX_PUSH_LOCK_FLAGS_WAIT;
|
WaitBlock->Flags = EX_PUSH_LOCK_FLAGS_WAIT;
|
||||||
WaitBlock.ShareCount = 0;
|
WaitBlock->ShareCount = 0;
|
||||||
NeedWake = FALSE;
|
NeedWake = FALSE;
|
||||||
WaitBlock.Previous = NULL;
|
WaitBlock->Previous = NULL;
|
||||||
|
|
||||||
/* Check if there is already a waiter */
|
/* Check if there is already a waiter */
|
||||||
if (OldValue.Waiting)
|
if (OldValue.Waiting)
|
||||||
{
|
{
|
||||||
/* Set the current Wait Block pointer */
|
/* Set the current Wait Block pointer */
|
||||||
WaitBlock.Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
|
WaitBlock->Next = (PEX_PUSH_LOCK_WAIT_BLOCK)((ULONG_PTR)
|
||||||
OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
|
OldValue.Ptr &~ EX_PUSH_LOCK_PTR_BITS);
|
||||||
|
|
||||||
/* Nobody is the last waiter yet */
|
/* Nobody is the last waiter yet */
|
||||||
WaitBlock.Last = NULL;
|
WaitBlock->Last = NULL;
|
||||||
|
|
||||||
/* Point to ours */
|
/* Point to ours */
|
||||||
NewValue.Value = (OldValue.Value & (EX_PUSH_LOCK_MULTIPLE_SHARED |
|
NewValue.Value = (OldValue.Value & (EX_PUSH_LOCK_MULTIPLE_SHARED |
|
||||||
|
@ -642,7 +677,7 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We are the first waiter, so loop the wait block */
|
/* We are the first waiter, so loop the wait block */
|
||||||
WaitBlock.Last = &WaitBlock;
|
WaitBlock->Last = WaitBlock;
|
||||||
|
|
||||||
/* Point to our wait block */
|
/* Point to our wait block */
|
||||||
NewValue.Value = (OldValue.Value & (EX_PUSH_LOCK_MULTIPLE_SHARED |
|
NewValue.Value = (OldValue.Value & (EX_PUSH_LOCK_MULTIPLE_SHARED |
|
||||||
|
@ -656,10 +691,10 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
|
|
||||||
#if DBG
|
#if DBG
|
||||||
/* Setup the Debug Wait Block */
|
/* Setup the Debug Wait Block */
|
||||||
WaitBlock.Signaled = 0;
|
WaitBlock->Signaled = 0;
|
||||||
WaitBlock.OldValue = OldValue;
|
WaitBlock->OldValue = OldValue;
|
||||||
WaitBlock.NewValue = NewValue;
|
WaitBlock->NewValue = NewValue;
|
||||||
WaitBlock.PushLock = PushLock;
|
WaitBlock->PushLock = PushLock;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write the new value */
|
/* Write the new value */
|
||||||
|
@ -683,26 +718,26 @@ ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the Wait Gate */
|
/* Set up the Wait Gate */
|
||||||
KeInitializeGate(&WaitBlock.WakeGate);
|
KeInitializeGate(&WaitBlock->WakeGate);
|
||||||
|
|
||||||
/* Now spin on the push lock if necessary */
|
/* Now spin on the push lock if necessary */
|
||||||
i = ExPushLockSpinCount;
|
i = ExPushLockSpinCount;
|
||||||
if ((i) && (WaitBlock.Flags & EX_PUSH_LOCK_WAITING))
|
if ((i) && (WaitBlock->Flags & EX_PUSH_LOCK_WAITING))
|
||||||
{
|
{
|
||||||
/* Spin */
|
/* Spin */
|
||||||
while (--i) YieldProcessor();
|
while (--i) YieldProcessor();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now try to remove the wait bit */
|
/* Now try to remove the wait bit */
|
||||||
if (InterlockedBitTestAndReset(&WaitBlock.Flags, 1))
|
if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
|
||||||
{
|
{
|
||||||
/* Fast-path did not work, we need to do a full wait */
|
/* Fast-path did not work, we need to do a full wait */
|
||||||
KeWaitForGate(&WaitBlock.WakeGate, WrPushLock, KernelMode);
|
KeWaitForGate(&WaitBlock->WakeGate, WrPushLock, KernelMode);
|
||||||
ASSERT(WaitBlock.Signaled);
|
ASSERT(WaitBlock->Signaled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We shouldn't be shared anymore */
|
/* We shouldn't be shared anymore */
|
||||||
ASSERT((WaitBlock.ShareCount == 0));
|
ASSERT((WaitBlock->ShareCount == 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1004,7 +1039,7 @@ VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
{
|
{
|
||||||
EX_PUSH_LOCK NewValue;
|
EX_PUSH_LOCK NewValue, WakeValue;
|
||||||
EX_PUSH_LOCK OldValue = *PushLock;
|
EX_PUSH_LOCK OldValue = *PushLock;
|
||||||
|
|
||||||
/* Loop until we can change */
|
/* Loop until we can change */
|
||||||
|
@ -1024,7 +1059,8 @@ ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
ASSERT(NewValue.Waking && !NewValue.Locked);
|
ASSERT(NewValue.Waking && !NewValue.Locked);
|
||||||
|
|
||||||
/* Write the New Value */
|
/* Write the New Value. Save our original value for waking */
|
||||||
|
WakeValue = NewValue;
|
||||||
NewValue.Ptr = InterlockedCompareExchangePointer(PushLock,
|
NewValue.Ptr = InterlockedCompareExchangePointer(PushLock,
|
||||||
NewValue.Ptr,
|
NewValue.Ptr,
|
||||||
OldValue.Ptr);
|
OldValue.Ptr);
|
||||||
|
@ -1032,14 +1068,10 @@ ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
/* Check if the value changed behind our back */
|
/* Check if the value changed behind our back */
|
||||||
if (NewValue.Value != OldValue.Value)
|
if (NewValue.Value != OldValue.Value)
|
||||||
{
|
{
|
||||||
/* Loop again */
|
/* Wake the Pushlock */
|
||||||
OldValue = NewValue;
|
ExfWakePushLock(PushLock, WakeValue);
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wake the Pushlock */
|
|
||||||
ExfWakePushLock(PushLock, NewValue);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1056,10 +1088,10 @@ ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
|
||||||
|
|
||||||
/* Check if the value changed behind our back */
|
/* Check if the value changed behind our back */
|
||||||
if (NewValue.Value == OldValue.Value) break;
|
if (NewValue.Value == OldValue.Value) break;
|
||||||
|
|
||||||
/* Loop again */
|
|
||||||
OldValue = NewValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Loop again */
|
||||||
|
OldValue = NewValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1128,7 +1160,7 @@ ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
|
||||||
KIRQL OldIrql = DISPATCH_LEVEL;
|
KIRQL OldIrql = DISPATCH_LEVEL;
|
||||||
|
|
||||||
/* Get the wait block and erase the previous one */
|
/* Get the wait block and erase the previous one */
|
||||||
WaitBlock = InterlockedExchangePointer(PushLock->Ptr, 0);
|
WaitBlock = InterlockedExchangePointer(&PushLock->Ptr, NULL);
|
||||||
if (WaitBlock)
|
if (WaitBlock)
|
||||||
{
|
{
|
||||||
/* Check if there is a linked pushlock and raise IRQL appropriately */
|
/* Check if there is a linked pushlock and raise IRQL appropriately */
|
||||||
|
@ -1144,7 +1176,7 @@ ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
|
||||||
if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
|
if (InterlockedBitTestAndReset(&WaitBlock->Flags, 1))
|
||||||
{
|
{
|
||||||
/* Nobody removed the flag before us, so signal the event */
|
/* Nobody removed the flag before us, so signal the event */
|
||||||
KeSetEventBoostPriority(&WaitBlock->WakeEvent, IO_NO_INCREMENT);
|
KeSetEventBoostPriority(&WaitBlock->WakeEvent, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if there was a next block */
|
/* Check if there was a next block */
|
||||||
|
@ -1161,6 +1193,6 @@ ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
|
||||||
EX_PUSH_LOCK_FLAGS_WAIT))
|
EX_PUSH_LOCK_FLAGS_WAIT))
|
||||||
{
|
{
|
||||||
/* Wait for the pushlock to be unblocked */
|
/* Wait for the pushlock to be unblocked */
|
||||||
ExTimedWaitForUnblockPushLock(PushLock, CurrentWaitBlock, NULL);
|
ExWaitForUnblockPushLock(PushLock, CurrentWaitBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,36 @@ PVOID ExpNlsSectionPointer;
|
||||||
#define ExRundownCompleted _ExRundownCompleted
|
#define ExRundownCompleted _ExRundownCompleted
|
||||||
#define ExGetPreviousMode KeGetPreviousMode
|
#define ExGetPreviousMode KeGetPreviousMode
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect GCC 4.1.2+
|
||||||
|
//
|
||||||
|
#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40102
|
||||||
|
|
||||||
|
//
|
||||||
|
// Broken GCC with Alignment Bug. We'll do alignment ourselves at higher cost.
|
||||||
|
//
|
||||||
|
#define DEFINE_WAIT_BLOCK(x) \
|
||||||
|
struct _AlignHack \
|
||||||
|
{ \
|
||||||
|
UCHAR Hack[15]; \
|
||||||
|
EX_PUSH_LOCK_WAIT_BLOCK UnalignedBlock; \
|
||||||
|
} WaitBlockBuffer; \
|
||||||
|
PEX_PUSH_LOCK_WAIT_BLOCK x = (PEX_PUSH_LOCK_WAIT_BLOCK) \
|
||||||
|
((ULONG_PTR)&WaitBlockBuffer.UnalignedBlock &~ 0xF);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is only for compatibility; the compiler will optimize the extra
|
||||||
|
// local variable (the actual pointer) away, so we don't take any perf hit
|
||||||
|
// by doing this.
|
||||||
|
//
|
||||||
|
#define DEFINE_WAIT_BLOCK(x) \
|
||||||
|
EX_PUSH_LOCK_WAIT_BLOCK WaitBlockBuffer; \
|
||||||
|
PEX_PUSH_LOCK_WAIT_BLOCK x = &WaitBlockBuffer;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* INITIALIZATION FUNCTIONS *************************************************/
|
/* INITIALIZATION FUNCTIONS *************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -498,6 +528,23 @@ _ExRundownCompleted(IN PEX_RUNDOWN_REF RunRef)
|
||||||
|
|
||||||
/* PUSHLOCKS *****************************************************************/
|
/* PUSHLOCKS *****************************************************************/
|
||||||
|
|
||||||
|
/* FIXME: VERIFY THESE! */
|
||||||
|
|
||||||
|
VOID
|
||||||
|
FASTCALL
|
||||||
|
ExBlockPushLock(PEX_PUSH_LOCK PushLock,
|
||||||
|
PVOID WaitBlock);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
FASTCALL
|
||||||
|
ExfUnblockPushLock(PEX_PUSH_LOCK PushLock,
|
||||||
|
PVOID CurrentWaitBlock);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
FASTCALL
|
||||||
|
ExWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock,
|
||||||
|
IN PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock);
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
* @name ExInitializePushLock
|
* @name ExInitializePushLock
|
||||||
* INTERNAL MACRO
|
* INTERNAL MACRO
|
||||||
|
@ -653,12 +700,16 @@ VOID
|
||||||
FORCEINLINE
|
FORCEINLINE
|
||||||
ExWaitOnPushLock(PEX_PUSH_LOCK PushLock)
|
ExWaitOnPushLock(PEX_PUSH_LOCK PushLock)
|
||||||
{
|
{
|
||||||
/* Acquire the lock */
|
/* Check if we're locked */
|
||||||
ExfAcquirePushLockExclusive(PushLock);
|
if (PushLock->Locked)
|
||||||
ASSERT(PushLock->Locked);
|
{
|
||||||
|
/* Acquire the lock */
|
||||||
|
ExfAcquirePushLockExclusive(PushLock);
|
||||||
|
ASSERT(PushLock->Locked);
|
||||||
|
|
||||||
/* Release it */
|
/* Release it */
|
||||||
ExfReleasePushLockExclusive(PushLock);
|
ExfReleasePushLockExclusive(PushLock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
Loading…
Reference in a new issue