Commit Graph
4969 Commits
Author SHA1 Message Date
Johannes Anderwald bb403d5976 Fix build breakage
svn path=/trunk/; revision=44329
2009-11-30 14:55:20 +00:00
Aleksey Bragin 1d110c440a [IDL]
- Make our IDLs files to not specify a [range] tag for string datatypes, and 0,256 range for an unsigned type. Fixes compiling with newer WIDL and (probably) MIDL.

svn path=/trunk/; revision=44283
2009-11-24 22:39:25 +00:00
Christoph von Wittich 0b4a63a920 add MUI error codes from wine
svn path=/trunk/; revision=44193
2009-11-16 01:23:20 +00:00
Christoph von Wittich f12b3f3e8d sync mshtml to wine 1.1.33
svn path=/trunk/; revision=44189
2009-11-15 23:44:20 +00:00
Christoph von Wittich 86d5f9981c sync crypt32 with wine 1.1.33
svn path=/trunk/; revision=44184
2009-11-15 22:58:08 +00:00
Aleksey Bragin f0816148d1 - Add VK_ICO_* codes.
svn path=/trunk/; revision=44153
2009-11-14 11:22:29 +00:00
Johannes Anderwald ccc63ddced [PSDK]
- Fix MIXEROPENDESC struct(x64 compability issue)
[MMEBUDDY]
- Fix usage of MIXEROPENDESC
[WDMAUD.DRV]
- Implement a listening thread which waits for volume level / mute control changes

svn path=/trunk/; revision=44133
2009-11-13 14:22:11 +00:00
Aleksey Bragin 8d0de240d5 - Sync rpcrt4 with Wine-1.1.32. ReactOS-specific changes are:
* Use overlapped named pipes access mode, and use GetOverlappedResult for reading/writing too.
 * Add patch for waiting for server calls in RpcMgmtWaitServerListen (not fully correct one, but enough for now).
 * Hacks around ntsecapi.h inclusion (it can't be used properly with winternl.h).
 * Total removal of HTTP transport. Could be enabled when dynamic linking to wininet.dll will be possible.
- Change config.h to include new ASM macros. This is not platform independent.

svn path=/trunk/; revision=44130
2009-11-13 13:26:54 +00:00
Christoph von Wittich f54043e5ae sync dwmapi with wine 1.1.32
svn path=/trunk/; revision=44128
2009-11-13 11:47:11 +00:00
KJK::Hyperion 42f5d69bb4 More _CRTIMP love for non-ANSI symbols
svn path=/trunk/; revision=44102
2009-11-11 11:11:58 +00:00
Johannes Anderwald 844a591298 - Fix problem with ASSERT & ASSERTMSG when compiled with g++
svn path=/trunk/; revision=44101
2009-11-11 10:53:52 +00:00
KJK::Hyperion 49ce5d1d63 Non-ANSI names need _CRTIMP too
svn path=/trunk/; revision=44089
2009-11-11 03:09:42 +00:00
Stefan Ginsberg 662ba31e98 - Fix HalDisableSystemInterrupt -- it doesn't return anything.
- Fix VideoPortEnable/DisableInterrupt -- they should only fail if the driver didn't provide an ISR (documented).

svn path=/trunk/; revision=44085
2009-11-10 23:00:51 +00:00
Stefan Ginsberg b4835e6bad - Add KCALLOUT_FRAME to define the kernel callback stack layout during user mode callbacks. Define the NextCallback and FramePointer members of the debugger data block more portably with this.
- AMD64's is a copy of x86's to match asm.h's the assembly offsets. ARM's is a stub containing two necessary members to have some offsets for the debugger data block.
- Add ARM stub for KiCallUserMode as this is referenced from the debugger data block.

svn path=/trunk/; revision=44063
2009-11-09 23:19:03 +00:00
Stefan Ginsberg a9f0dd5a8d - Implement the generic bus handler support and initialization.
- Add missing hack flags for ACPI hacks.
- Add the hack flags to the registry.

svn path=/trunk/; revision=44061
2009-11-09 22:59:49 +00:00
Johannes Anderwald 43a6379cc0 - Fix bug introduced 18942 revisions ago
svn path=/trunk/; revision=44050
2009-11-09 17:43:12 +00:00
Stefan Ginsberg ef21516cc4 - Disable the MiCacheImageSymbols call in MmLoadSystemImage for KD too as this hack is required for rossym rather than KDBG. Fixes detection of non-boot driver images by WinDbg.
- Add another hack to freeldr.c to make sure that HAL is the second entry in the Load Order list -- detect if it isn't and insert it as the second entry manually if it isn't.
- KdbInitialize can now assume that the 2nd entry in the Load Order list is HAL, just like ExpLoadBootSymbols and KD does, so get the Loader Entry directly instead of searching for it.
- Move KiBootTss and KiBootGdt to freeldr.c as this is where they belong -- they are not required for NTLDR/WINLDR boot style and are only used directly in freeldr.c.
- Get rid of the AcpiTableDetected variable from freeldr.c. Instead, set the AcpiTable entry to something and make PoInitSystem check for that instead to preserve the old behavior.
- Implement KdpGetFirstParameter and KdpGetSecondParameter for ARM too -- just retrieve R3/R4 here. Also rename those macros to clarify what parameters we are retrieving.
- Add MmIsSessionAddress stub and use it from KD handle session space properly in the Memory Query API, and ASSERT that we are not trying to do a copy to/from session space in MmDbgCopyMemory as we don't handle it properly. Put this in mmdbg.c for now as we don't implement session space, and it is only called from KD right now.
- Rename the 3 kdsup.c files to kdx86.c, kdx64.c and kdarm.c to differ them from each other.
- Implement KdpAllowDisable -- just check if any processor breakpoints are set on any processor in the system and disallow the disable if so. The routine is now architecture dependant, so move it to the appropriate files.
- Get rid of the MmFreeLdr* variables too. These have been deprecated for some time now.
- The ModuleObject and ImageBaseAddress parameters of MmLoadSystemImage are not optional so don't treat them as such, and don't zero initialize them as callers shouldn't rely on this.
- Set LDRP_ENTRY_NATIVE instead of LDRP_COMPAT_DATABASE_PROCESSED to mark the image as a native image. Also fix the value of LDRP_ENTRY_NATIVE.
- Fix definition of LDR_DATA_TABLE_ENTRY -- the Checksum member should be in the union too.
- Remove some unnecessary externs for stuff we now define globally in the kernel headers.
- Rename some variables in KD to better match the logic.
- Move some x86 only stuff from global ke.h and ke_x.h to the x86 dependent ke.h. Remove DR_ACTIVE_MASK as it has been deprecated/unused for a while now.

svn path=/trunk/; revision=44023
2009-11-08 01:13:49 +00:00
Aleksey Bragin 4983e19cca - Add defines needed by explorer-new. Fixes build.
svn path=/trunk/; revision=44019
2009-11-07 20:18:04 +00:00
Aleksey Bragin 1baf1655f4 - Remove accidentally committed Wineisms. Build is fixed.
svn path=/trunk/; revision=44015
2009-11-07 19:53:41 +00:00
Aleksey Bragin f7b4286b58 - Update commctrl.h to Wine-1.1.31.
svn path=/trunk/; revision=44013
2009-11-07 19:34:59 +00:00
Johannes Anderwald c20bd4216f - Add a few constants and types required event handling
svn path=/trunk/; revision=43996
2009-11-07 12:57:07 +00:00
Christoph von Wittich 650e86a2df sync wininet with wine 1.1.32
svn path=/trunk/; revision=43948
2009-11-04 11:16:25 +00:00
Stefan Ginsberg 7249a7574f - Fix leftover from 43912: Add KdRefreshDebuggerNotPresent to DDK.
svn path=/trunk/; revision=43915
2009-11-02 18:16:12 +00:00
Stefan Ginsberg f84d5a02f4 - Fix support for /CRASHDEBUG and /NODEBUG; we didn't respect those settings properly and would initialize KD at boot even if they were set.
- Re-enable the breakpoint in vDbgPrintExWithPrefixInternal() as this works properly now. Without this breakpoint some break-in requests got lost if the break-in occurred when handling a debug print (happened a lot at boot).
- Implement Command String support for DbgCommandString() -- we now handle every debug service call.
- Implement NtSetDebugFilterState() and NtQueryDebugFilterState() for KD, meaning we now support debug filters properly.
- Implement KdRefreshDebuggerNotPresent(), KdChangeOption() and KdPowerTransition(). Stub KdSystemDebugControl() to return error status instead of hanging the system.
- Stub the rest of the KD API to print a warning and return a failure packet instead of hanging.
- Set and respect KdpContextSent when getting and setting the thread context -- WinDbg doesn't seem to rely on this, but better safe than sorry.
- Support MP when getting and setting the thread context too -- if the context is operation is for another processor than the current, just get it through the KiProcessorBlock array.
- Initialize the MajorVersion in the KD version block more properly -- the high byte is the major identifier (0 for NT). Add the required DBGKD_MAJOR_TYPES enumeration to wdbgexts.h.
- Simplify setting and clearing the InDbgPrint flag in the TEB to minimize the impact on kernel execution; use 2 dedicated routines instead of a generic one.
- KdpSymbol doesn't return anything, so don't return an ignore status from KdpReportLoadSymbolsStateChange.
- Expose the KdpDefaultRetries and Kd_WIN2000_Mask variables to the registry and add them to KDBG too (unused there).
- No reason to implement KdpSysGetVersion per architecture; move it back to the generic code.
- Add some ARM offsets to the debugger data block that (N/A on other architectures).
- Fix the default size of the DbgPrint log buffer for free builds to save some space. It should be 4 KB for a free build and 32 KB for a checked build.
- Move KeDisableInterrupts to cpu.c as it fits here more than in the IRQ support code in irqobj.c.
- Use KeDisableInterrupts in KeFreezeExecution instead of checking the x86 EFLAG directly.

svn path=/trunk/; revision=43912
2009-11-02 17:45:51 +00:00
Andrew Hill 24c6ff3165 [includes]
- Fix TestCD
- IDeskBar is only defined when WIN32_IE >= _WIN32_IE_IE60, so ITrackShellMenu should also be defined only when WIN32_IE >= _WIN32_IE_IE60

svn path=/trunk/; revision=43878
2009-10-31 16:59:33 +00:00
Andrew Hill 8266299b0e [browseui, shell32, explorer_new, include]
- Convert browseui to C++/ATL. As part of this, classes in browseui and now registered with .rgs files.
- Add AddressBand, AddressEditBox, BandProxy, BaseBar, BaseBarSite, BrandBand, InternetToolbar, ShellBrowser, ToolsBand, and TravelLog.
- Add stub implementations of commonbrowser, globalfoldersettings, and regtreeoptions.
- Clean up some msvc compile problems in a few files.
- Reorganize some headers to make them better match the Platform SDK.
- Move InlineIsEqualGUID to guiddef.h.
- Create new header files shlguid_undoc.h, shlobj_undoc.h, and shlwapi_undoc.h to hold undocumented types, functions, and GUIDs.
- Move some undocumented definitions declared in explorer_new/todo.h and undoc.h to new headers.
- Rename a few interfaces in explorer_new to the correct name
- Add definition of RBSTR_CHANGERECT to commctrl.h
- IDeskBarClient inherits from IOleWindow, not IUnknown
- HMONITOR was declared in both dxsdk/axextend.idl and wine/wined3d.idl, but not in wtypes.idl where it belongs
- Added Init and Term to CComModule
- Thanks to encoded for solving the browseui linking problem!

svn path=/trunk/; revision=43872
2009-10-31 14:25:45 +00:00
Stefan Ginsberg 82bd7858d1 - Add 'simple' implementation of MmDbgCopyMemory to read/write virtual memory in a somewhat safe way (still no support for physical memory). Properly implement KdpCopyMemoryChunks as a wrapper around MmDbgCopyMemory and make most of the remaining unsafe copies use it instead of RtlCopyMemory. This fixes most of the remaining crashes during KD debugging as WinDbg/KD relies on the kernel support to handle bad addresses.
- Stub out the remaining missing global variables for the debugger data block -- fixes some cases of WinDbg failures and gives it a chance to handle errors instead of failing on a NULL read. Several of these variables are for functionality we don't yet implement, so I tried to put them where they are "least wrong". Everything besides the MmLoadedUserImageList variable is left unitialized -- KD should mostly be able to handle this properly.
- Define correctly sized KDDEBUGGER_DATA64 for our kernel (needs to be done in a better way).

svn path=/trunk/; revision=43863
2009-10-31 01:02:35 +00:00
Stefan Ginsberg e90168e57e - Restructure HAL bus routines a bit.
- Fix some incorrect HAL types and add some that were missing.

svn path=/trunk/; revision=43855
2009-10-30 22:07:26 +00:00
Cameron Gutman 92f8240011 - Header updates for winsock rewrite
svn path=/trunk/; revision=43834
2009-10-29 20:56:47 +00:00
Stefan Ginsberg be8d9f285f - INITIAL_STALL_COUNT makes more sense in decimal (100) than hex (0x64) so define it that way.
- Protect CMOS access with the CMOS spinlock.
- Add CMOS initialization to set up the default value of the CMOS century byte offset (not used yet).
- Stub out profile interrupt support in HAL. Register and stub out the profile interrupt handler, but don't handle it yet as vital parts of the rest of the implementation is missing.
- Fix several bugs in the kernel profile implementation:
  - Don't hardcode to PROFILE_LEVEL when raising IRQL : HAL can override this, so use KiProfileIrql. Also, starting/stopping profile interrupts must be done at the profile IRQL, so don't lower it back before calling HAL, which is now enabled.
  - Fix KeSet/QueryIntervalProfile to properly set/query profile intervals through HAL -- pass the correct structures and handle the ProfileAlignmentFixup case properly, and call HAL when setting the timer interval as the interval may be overridden by it.
  - KeStartProfile returns BOOLEAN to tell if the profile was started or not, just like KeStopProfile.
- Make the interrupt implementation more portable for non-PIC architectures.
- Fix HalSystemVectorDispatchEntry; it returns a type (UCHAR), not TRUE/FALSE (BOOLEAN).
- Begin implementing the framework for querying HAL resource usage (keeping track of internal address space and vector registrations/usage).

svn path=/trunk/; revision=43832
2009-10-29 19:58:41 +00:00
Stefan Ginsberg bec72fa6a7 - Implement the ThreadDescriptorTableEntry case for NtQueryInformationThread. This is required for the GetThreadSelectorEntry routine used by user mode debuggers.
- #if out some x86-only LDT code from PS and move it to psldt.c.

svn path=/trunk/; revision=43827
2009-10-29 10:04:15 +00:00
Johannes Anderwald 1f28d44b07 Add StringFromIID prototype
svn path=/trunk/; revision=43807
2009-10-28 11:19:25 +00:00
Timo Kreuzer 0cf8717f6d merge r43777 from amd64 branch
svn path=/trunk/; revision=43800
2009-10-27 23:28:17 +00:00
James Tabor 6185365441 - Move TI flages to main header file.
svn path=/trunk/; revision=43796
2009-10-27 19:02:02 +00:00
Stefan Ginsberg 3cc202c54d Release atsmedia.h, ddkernel.h, dmemmgr.h, dvp.h, ntstrsafe.h, objerror.h and polarity.h into the public domain -- Alex (ntstrsafe.h) and Magnus (the other headers) have agreed to this.
svn path=/trunk/; revision=43794
2009-10-27 16:27:33 +00:00
Johannes Anderwald 3557056c44 - Add missing types
svn path=/trunk/; revision=43793
2009-10-27 15:33:58 +00:00
Dmitry Gorbachev 145fbbd116 - Update address of Free Software Foundation.
- Update obsolete LGPL v2 to LGPL v2.1.

svn path=/trunk/; revision=43790
2009-10-27 10:34:16 +00:00
Johannes Anderwald 47b50e1e0b [WDMAUD.DRV][WDMAUD_KERNEL][MMEBUDDY]
- Implement support for DRV_QUERYDEVICEINTERFACESIZE, DRV_QUERYDEVICEINTERFACE
- Required for DSound support

svn path=/trunk/; revision=43788
2009-10-26 23:10:05 +00:00
Cameron Gutman 79e704337b - Update AFD's shared header
- Add entity type check for IF_MIB_STATS_ID
 - Sort out some confusion with TDI entities
 - Implement IOCTL_AFD_GET_CONTEXT_SIZE
 - Enable debug prints for unimplemented ioctls
 - Add kernel-mode support for setting TTL

svn path=/trunk/; revision=43767
2009-10-26 03:11:44 +00:00
Johannes Anderwald 85cbe2887b [WDMAUD.DRV]
- Set the audio pin to KSSTATE_RUN if it is wave-out pin
- Implement support for manually starting / stopping a pin, which is used for recording
[WINMM]
- Add a hack for handling requests with WAVE_MAPPER
[PORTCLS]
- Pass correct flags to KsProbeStreamIrp when the irp has not already been probed (DirectKs)
[WDMAUD]
- Set correct irp dispatch code
[SYSAUDIO]
- Remove a hack
[MMEBUDDY]
- Return no error for MXDM_INIT message
- Add support for completing multiple wave headers at once
- Use new functions to implement WIDM_START / WIDM_STOP
- ReactOS now "supports" wave in recording. Tested with Audacity / sndrec32 @ XP, WIP


svn path=/trunk/; revision=43765
2009-10-26 00:15:22 +00:00
Christoph von Wittich a0951dacc4 -sync rsaenh with wine 1.1.32
svn path=/trunk/; revision=43755
2009-10-25 21:16:15 +00:00
Christoph von Wittich c7b2548293 -sync netapi32 with wine 1.1.32
svn path=/trunk/; revision=43750
2009-10-25 19:24:08 +00:00
Johannes Anderwald acd8b06824 - Partially sync winmm
- Remove unused code
- Fix function headers

svn path=/trunk/; revision=43747
2009-10-25 17:54:50 +00:00
Gregor Schneider cae8c23a9f [win32k] GetTransform:
- Add support for more transforms
- Fix return value for invalid/unsupported transform types
- Fixes 10 gdi32 mapping winetests

svn path=/trunk/; revision=43745
2009-10-25 17:23:19 +00:00
Christoph von Wittich 01a9e7493e add define for LOCALE_RETURN_GENITIVE_NAMES
svn path=/trunk/; revision=43743
2009-10-25 16:20:45 +00:00
Stefan Ginsberg eae6521fb2 - DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Protocol 6 uses the DBGKD_ANY_WAIT_STATE_CHANGE structure which is sized according to the largest control-report structure (AMD64_DBGKD_CONTROL_REPORT currently), and is larger than DBGKD_WAIT_STATE_CHANGE64 on x86. This worked because our DBGKD_WAIT_STATE_CHANGE32/64 structures contained incorrect DBGKD_CONTROL_REPORT (used) and CONTEXT (unused) members that sized up the wait-state structure to pass WinDbg's length verification! It actually becomes larger than DBGKD_ANY_WAIT_STATE_CHANGE, but WinDbg only seems bail out only if the structure is too small. Remove the incorrect members from the protocol 5 structures and change to DBGKD_ANY_WAIT_STATE_CHANGE everywhere.
- Correct the value of SIZE_OF_FX_REGISTERS -- it was 4 times too low which resulted in KeContextToTrapFrame not properly clearing out the XMM register area. Correct the define and move it out from ke.h to x86's ketypes.h and use it in the FXSAVE format structure. Also remove the IOPM definitions from ke.h as they have been in the NDK for a while.
- KD uses STRINGs, not ANSI_STRINGs -- they are the same thing, but let's be consistent.
- ExceptionRecord32To64 should be available for both 32 and 64 bit builds (and it shouldn't be a forceinline). Get rid of CopyExceptionRecord and determine if we need to convert or can just copy it directly instead.
- Use _WIN64 instead of _M_AMD64 when determining if we need to set the DBGKD_VERS_FLAG_PTR64 flag.
- Don't check Nt/DbgQueryDebugFilterState for zero or nonzero -- it actually returns TRUE, FALSE or STATUS_INVALID_PARAMETER_1! Check for != TRUE in preparation for proper implementation of NtSet/QueryDebugFilterState.
- Fix Format parameter of DbgPrintReturnControlC -- it is const like the other DbgPrint* routines.
- Be consistent with the types used in debug.c and don't set local variables to zero if we are going to return to caller -- this doesn't seem to be required anymore. 
- Fix DebugService and DebugService2: DebugService should take a ULONG followed by 4 pointers and DebugService2 doesn't return anything.
- Use ZwCurrentProcess() instead of -1 or 0xFFFFFFFF (which is incorrect for 64-bit) for the ProcessId parameter of DbgLoad/UnloadImageSymbols to clarify what is being passed. Don't use ZwCurrentProcess() in KeBugCheckWithTf for the pointer parameter of DbgUnLoadImageSymbols either. Use MAXULONG_PTR casted to PVOID instead.
- Use better named and sized variables in KdpTrap for setting the "return register" in the caller's CONTEXT.
- Correct and clarify the comment documenting under what conditions we pass user mode exceptions to the kernel debugger.

svn path=/trunk/; revision=43741
2009-10-25 15:56:38 +00:00
Stefan Ginsberg 10bbe664b7 - Replace RtlpGetExceptionAddress by the _ReturnAddress intrinsic and add it to ARM intrin.h as it was missing.
- Simplify RtlpCheckForActiveDebugger: Remove the BOOLEAN parameter as we would always pass it FALSE. Always return FALSE false from kernel mode for simplicity.
- Fix a critical flaw in our exception support: RtlRaiseException and RtlRaiseStatus were implemented in C on x86. This lead to unpredictable register corruption because the compiler could not know that it had to preserve non-volatile registers before calling RtlCaptureContext as the saved context is later used to restore the caller in case the exception is handled and execution is continued. This made the functions unsafe to return from as any non-volatile register could be corrupted. Implement them in assembly for x86 to safely capture the context using only EBP and ESP. The C versions of those routines are still used and shared for the other architectures we support -- needs to be determined if this is safe and correct for those architectures.
- The ntdll exception Wine exposed this issue, and all tests now pass. The remaining failures on the build server are caused by missing or incomplete debug register support in KVM/QEMU. Run the test in another VM or on real hardware and all the tests will pass.
- Implement Debug Prompt (DbgPrompt) support for KD and KDBG. The KDBG implementation reads the prompt from keyboard or serial depending on the mode so that sysreg and rosdbg can support it too.
- Properly implement RtlAssert using DbgPrompt to prompt for the action to take instead of always doing a breakpoint. The new implementation is disabled until sysreg can support this. Also move RtlAssert to its own file as it has nothing to do with the error routines (nor does it belong in exception.c).
- Note that DbgPrompt was already used in PspCatchCriticalBreak, and this would have resulted in a silent hang as BREAKPOINT_PROMPT wasn't handled at all by KDBG.
- Implement KiRaiseAssertion (10 lines of code with the trap macros) and thus support NT_ASSERT. Add partial support for it to KDBG to print out a warning and the address of the failure, but don't do anything else. Also add NT_ASSERT to the DDK headers so that we can use it, but don't use it yet as the ARM method of performing this has not been decided nor implemented.
- KiTrap3 doesn't set STATUS_SUCCESS but BREAKPOINT_BREAK. They have the same numerical value but very different meaning -- BREAKPOINT_BREAK means that the exception is a software breakpoint and not a debug service call. Fix some comments to document that this is what is checked for.
- Fix inverted and broken logic in KdpReport. It would never pass second chance exceptions to the debugger, didn't respect the stop-on-exception flag properly and would always fail to handle some special exceptions in both first and second chance instead of just failing to handle it in first chance. Clean up, reformat and document what is going on.
- The DebugPrint and DebugPrompt support routines only perform a 2D interrupt on x86; use more portable comments.
- Add Alex to the programmer section of x86's kdsup.c -- he wrote KdpGetStateChange, KdpSetContextState and the code that was previously in KdpRead/WriteControlSpace.
- Add my name to the parts of KD where I have made significant work on getting KD/WinDbg support up and running.
- KD debugging is now quite functional and stable. Some bugs and stubs remain to be flushed out, but overall KD is now much better and easier to use than KDBG.

svn path=/trunk/; revision=43705
2009-10-23 22:51:39 +00:00
Stefan Ginsberg 80078ade2b - Fix 43192 -- MAXUINT and MAXULONGLONG are only defined for Vista and later.
- Add some leftover MAXULONG.

svn path=/trunk/; revision=43691
2009-10-22 18:27:17 +00:00
Timo Kreuzer aa43316443 revert the KD_CONTEXT change
svn path=/trunk/; revision=43690
2009-10-22 15:25:37 +00:00
Timo Kreuzer 4d06b94a31 [KDCOM]
- Merge r43682
- Copy new kdcom from amd64 branch. It's only built when _WINKD_ is set to 1 in the config file.
Happy testing.

svn path=/trunk/; revision=43688
2009-10-22 14:58:33 +00:00