X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=src%2Flibcaptive%2Fmm%2Fmemsafe.c;h=0ce26e803f00d51e564e06ff29f1a17ee049ed29;hb=a2dd38f86df22c46ae18f3ad7d9850eaacb02b92;hp=a2513d9c3882389f3af99936f21377fe68fe994d;hpb=65cf05bd11d90ec30a93888dd334b77e3198f3db;p=captive.git diff --git a/src/libcaptive/mm/memsafe.c b/src/libcaptive/mm/memsafe.c index a2513d9..0ce26e8 100644 --- a/src/libcaptive/mm/memsafe.c +++ b/src/libcaptive/mm/memsafe.c @@ -25,6 +25,36 @@ /** + * MmSafeCopyFromUser: + * @Dest: Destination memory area address. + * %NULL value is forbidden. + * @Src: Source memory area address. + * %NULL value is forbidden. + * @NumberOfBytes: Length of memory area. + * + * This function moves the data between two memory areas. + * Given memory areas must not overlap. + * libcaptive does not differentiate between user and kernel memory - this functions + * implements the simple memcpy() function. + * + * Returns: %STATUS_SUCCESS if the memory was copied successfuly. + */ +NTSTATUS MmSafeCopyFromUser(PVOID Dest,const VOID *Src,ULONG NumberOfBytes) +{ + g_return_val_if_fail(Dest!=NULL,STATUS_INVALID_PARAMETER); + g_return_val_if_fail(Dest+NumberOfBytes>=Dest,STATUS_INVALID_PARAMETER); + g_return_val_if_fail(Src!=NULL,STATUS_INVALID_PARAMETER); + g_return_val_if_fail(Src+NumberOfBytes>=Src,STATUS_INVALID_PARAMETER); + /* do not overlap: */ + g_return_val_if_fail((Dest+NumberOfBytes<=Src || Dest>=Src+NumberOfBytes),STATUS_INVALID_PARAMETER); + + memcpy(Dest,Src,NumberOfBytes); + + return STATUS_SUCCESS; +} + + +/** * MmSafeCopyToUser: * @Dest: Destination memory area address. * %NULL value is forbidden. @@ -39,7 +69,7 @@ * * Returns: %STATUS_SUCCESS if the memory was copied successfuly. */ -NTSTATUS MmSafeCopyToUser(PVOID Dest,PVOID Src,ULONG NumberOfBytes) +NTSTATUS MmSafeCopyToUser(PVOID Dest,const VOID *Src,ULONG NumberOfBytes) { g_return_val_if_fail(Dest!=NULL,STATUS_INVALID_PARAMETER); g_return_val_if_fail(Dest+NumberOfBytes>=Dest,STATUS_INVALID_PARAMETER);