aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>2004-08-16 18:50:20 +0000
committerBill Paul <wpaul@FreeBSD.org>2004-08-16 18:50:20 +0000
commitf454f98c318514d77a820302e3820ebd39a0e9b8 (patch)
tree87e7ccfbd013f8c08343648bed44321f0ecafaca /sys
parent646c6dd2c06987ea30b810ce4296a139f226ced1 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/ndis/kern_ndis.c2
-rw-r--r--sys/compat/ndis/ndis_var.h2
-rw-r--r--sys/compat/ndis/subr_ndis.c19
-rw-r--r--sys/dev/if_ndis/if_ndis_pci.c2
4 files changed, 20 insertions, 5 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c
index 138f6b965401..364f7716ee48 100644
--- a/sys/compat/ndis/kern_ndis.c
+++ b/sys/compat/ndis/kern_ndis.c
@@ -1613,7 +1613,7 @@ ndis_load_driver(img, arg)
vm_offset_t img;
void *arg;
{
- __stdcall driver_entry entry;
+ driver_entry entry;
image_optional_header opt_hdr;
image_import_descriptor imp_desc;
ndis_unicode_string dummystr;
diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h
index 0ddcc26654c3..aa9d0142939f 100644
--- a/sys/compat/ndis/ndis_var.h
+++ b/sys/compat/ndis/ndis_var.h
@@ -1478,7 +1478,7 @@ typedef void (*ndis_allocdone_handler)(ndis_handle, void *,
ndis_physaddr *, uint32_t, void *);
typedef uint8_t (*ndis_checkforhang_handler)(ndis_handle);
-typedef ndis_status (*driver_entry)(void *, ndis_unicode_string *);
+typedef __stdcall ndis_status (*driver_entry)(void *, ndis_unicode_string *);
extern image_patch_table ndis_functbl[];
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index 00ac9481dadc..a9785516bc55 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -2564,10 +2564,19 @@ ndis_find_sym(lf, filename, suffix, sym)
caddr_t *sym;
{
char fullsym[MAXPATHLEN];
+ char *suf;
int i;
bzero(fullsym, sizeof(fullsym));
strcpy(fullsym, filename);
+ if (strlen(filename) < 4)
+ return(EINVAL);
+
+ /* If the filename has a .ko suffix, strip if off. */
+ suf = fullsym + (strlen(filename) - 3);
+ if (strcmp(suf, ".ko") == 0)
+ *suf = '\0';
+
for (i = 0; i < strlen(fullsym); i++) {
if (fullsym[i] == '.')
fullsym[i] = '_';
@@ -2645,7 +2654,6 @@ ndis_open_file(status, filehandle, filelength, filename, highestaddr)
continue;
fh->nf_vp = lf;
fh->nf_type = NDIS_FH_TYPE_MODULE;
- fh->nf_map = kldstart;
*filelength = fh->nf_maplen = (kldend - kldstart) & 0xFFFFFFFF;
*filehandle = fh;
free(afilename, M_DEVBUF);
@@ -2713,6 +2721,8 @@ ndis_map_file(status, mappedbuffer, filehandle)
{
ndis_fh *fh;
struct thread *td = curthread;
+ linker_file_t lf;
+ caddr_t kldstart;
int error, resid;
if (filehandle == NULL) {
@@ -2733,7 +2743,12 @@ ndis_map_file(status, mappedbuffer, filehandle)
}
if (fh->nf_type == NDIS_FH_TYPE_MODULE) {
- /* Already found the mapping address during the open. */
+ lf = fh->nf_vp;
+ if (ndis_find_sym(lf, lf->filename, "_start", &kldstart)) {
+ *status = NDIS_STATUS_FAILURE;
+ return;
+ }
+ fh->nf_map = kldstart;
*status = NDIS_STATUS_SUCCESS;
*mappedbuffer = fh->nf_map;
return;
diff --git a/sys/dev/if_ndis/if_ndis_pci.c b/sys/dev/if_ndis/if_ndis_pci.c
index 47c2f699ee40..00f4086ab157 100644
--- a/sys/dev/if_ndis/if_ndis_pci.c
+++ b/sys/dev/if_ndis/if_ndis_pci.c
@@ -208,7 +208,7 @@ ndis_attach_pci(dev)
error = ENXIO;
goto fail;
}
- if (rle->rid == PCIR_BAR(2)) {
+ if (sc->ndis_res_mem) {
sc->ndis_altmem_rid = rle->rid;
sc->ndis_res_altmem =
bus_alloc_resource(dev,