From 2d601a6dfc6fec788d5bd2557419af8264c32471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 16 May 2014 00:56:46 +0000 Subject: [PATCH] [NTVDM] Implement INT 21h, AH=5Ch "Lock/Unlock Region of File". svn path=/trunk/; revision=63311 --- reactos/subsystems/ntvdm/dos/dos32krnl/dos.c | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c index f0f3b7ef215..b0769cd7d79 100644 --- a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c +++ b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c @@ -2622,6 +2622,59 @@ VOID WINAPI DosInt21h(LPWORD Stack) break; } + /* Lock/Unlock Region of File */ + case 0x5C: + { + HANDLE Handle = DosGetRealHandle(getBX()); + + if (Handle == INVALID_HANDLE_VALUE) + { + /* The handle is invalid */ + Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF; + setAX(ERROR_INVALID_HANDLE); + break; + } + + if (getAL() == 0x00) + { + /* Lock region of file */ + if (LockFile(Handle, + MAKELONG(getCX(), getDX()), 0, + MAKELONG(getSI(), getDI()), 0)) + { + Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF; + } + else + { + Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF; + setAX(GetLastError()); + } + } + else if (getAL() == 0x01) + { + /* Unlock region of file */ + if (UnlockFile(Handle, + MAKELONG(getCX(), getDX()), 0, + MAKELONG(getSI(), getDI()), 0)) + { + Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF; + } + else + { + Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF; + setAX(GetLastError()); + } + } + else + { + /* Invalid subfunction */ + Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF; + setAX(ERROR_INVALID_FUNCTION); + } + + break; + } + /* Canonicalize File Name or Path */ case 0x60: {