Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Is memcmp an unsolved symbol in NT kernel driver even if compiled with /Oi?

533 views
Skip to first unread message

xmllmx

unread,
May 26, 2012, 4:04:03 PM5/26/12
to
Code Sample 1:

#include <ntifs.h>

NTSTATUS DriverEntry(PDRIVER_OBJECT param1, PUNICODE_STRING param2)
{
char s1[] = "Hello";
char s2[] = "World";

int n = memcmp(s1, s2, 5);

return 0;
}

WDK compiler reports: error LNK2019: unsolved extern symbol _memcmp referenced in function _DriverEntry@8

However, if I modify a bit the code as follows, then the compiler will accept it.

Code Sample 2:

#include <ntifs.h>

NTSTATUS DriverEntry(PDRIVER_OBJECT param1, PUNICODE_STRING param2)
{
char s1[] = "Hello";
char s2[] = "World";

memcmp(s1, s2, 5);

return 0;
}

Why?

Thanks in advance!

Don Burn

unread,
May 26, 2012, 4:19:07 PM5/26/12
to
Use RtlCompareMemory not memcmp.


Don Burn
Windows Filesystem and Driver Consulting
Website: http://www.windrvr.com
Blog: http://msmvps.com/blogs/WinDrvr




"xmllmx" <xml...@gmail.com> wrote in message
news:44201cc4-e49a-49fe...@googlegroups.com:

xmllmx

unread,
May 26, 2012, 4:37:11 PM5/26/12
to
Dear Don,

I know RtlCompareMemory is a better choice. But I just wonder its cause. I have a third-party source code which uses a lot of memcmp, so I have to solve it.

Thank you very much.

Tim Roberts

unread,
May 27, 2012, 9:52:40 PM5/27/12
to
xmllmx <xml...@gmail.com> wrote:
>
>I know RtlCompareMemory is a better choice. But I just wonder its cause.

You must have changed more than just the "int n =". The difference here is
the optimization level.

memcmp is an intrinsic. If you have intrinsics enabled (/Oi), then the
compiler expands the code for memcmp inline, by using a "rep cmpsb"
instruction. No function call is required. If you have the instrinsic
switch turned off, then it compiles a call to the external function memcmp,
which must exist.

By the way, "memcmp", like most of the C run-time library, is available for
kernel drivers in the library libcntpr.lib. Just add

USE_LIBCNTPR=1

to your "sources" file.
--
Tim Roberts, ti...@probo.com
Providenza & Boekelheide, Inc.
0 new messages